写个查询用到了下面的sql代码段如果将下面段落中的this.comboBox1cx考试名称.SelectedValue.ToString().Trim()直接改为对应的字符串 执行结果正常 但是如果用this.comboBox1cx考试名称.SelectedValue.ToString().Trim()则提示SQL异常 ")"附近有错误
求解 谢谢 在线等string sqlstr = "";
sqlstr = "declare @s varchar(8000) select @s=ISNULL(@s+',','')+QUOTENAME(考试科目) from 考试科目管理 where 考试编号='" + this.comboBox1cx考试名称.SelectedValue.ToString().Trim() + "' exec('select * from (select 学号,姓名,所属教学区,年级,班级,考试成绩表.授课教师,考试成绩表.考试名称,考试成绩表.科目名称,考试成绩 from 考试成绩表 join 考试科目管理 on 考试成绩表.科目名称=考试科目管理.考试科目 ) a pivot(max(考试成绩) for 科目名称 in('+@s+'))b')";
//MessageBox.Show(sqlstr);
                using (SqlConnection conn = new SqlConnection(KDSoft.DBUtility.PubConstant.ConnectionString)) 
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand(sqlstr, conn);
                    DataTable dt = new DataTable();
                    dt.Load(cmd.ExecuteReader());
                    if (dt.Rows.Count > 0) 
                    {
                        this.dataGridView添加.DataSource = dt;
                    }                }

解决方案 »

  1.   

    string sqlstr=""关键是sqlstr是string型,""里面是不直接执行的在dt.Load(cmd.ExecuteReader()); 才执行
      

  2.   

    设置个断点,看看你的sqlstr到底是个什么样子
      

  3.   

    检查下这个值?this.comboBox1cx考试名称.SelectedValue.ToString().Trim()输出整个sql看看
      

  4.   

    看看 this.comboBox1cx考试名称.SelectedValue
      

  5.   

    楼主我知道你是什么问题,我也遇到过这样的杯具。
    当你把中文放在英文字串之后是有机率出现这样的错误,你可以debug出错的情况确认。
    把comboBox1cx考试名称==》改为  ”考试名称comboBox1cx“,或者不要中文就可以了
      

  6.   

    检查下这个值?this.comboBox1cx考试名称.SelectedValue.ToString().Trim()输出整个sql看看
      

  7.   

    '))b')";试试 在 b 前面加空格 或 空格加as加空格http://www.mystruggle.com.cnhttp://www.mybuffet.cn
      

  8.   

    this.comboBox1cx考试名称.text.ToString().Trim()
      

  9.   

    string sqlstr=""关键是sqlstr是string型,""里面是不直接执行的在dt.Load(cmd.ExecuteReader()); 才执行伙计 在不知道的情况下你可一敲断点的 
    那样你这样的问题很容易就解决了啊
      

  10.   

    控件ID最好别夹着中文字符,c#中没问题,但是在sql拼接字符串中很容易出问题,你一定要夹得话,别直接在拼接字符串中写成这样‘“xyz中文.text.trim()”’。还是这样吧,我再多讲点,你可以写个专门操作SQL的类,或者把某个功能块中所有跟SQL相关的都写到一个CS文件里去,比如有块功能是处理跟某类信息相关的,你可以这样写:
    public class deptdata
    {
        public deptdata()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }
        DataBase data = new DataBase();    #region 查询--待处理数据表信息
        /// <summary>
        /// 得到--待处理数据表信息
        /// </summary>
        /// <param name="tbName"></param>
        /// <returns></returns>
        public DataSet GetAllDataByTablename(string tbName)
        {
            return (data.RunProcReturn("select * from " + tbName + "", tbName));
        }
        #endregion
        #region
        //其他的查询语句
        #endregion
    }然后你再引用这个类的CS文件里就可以这样了:string tbName=xyz中文.text.trim();然后tbName做参数传递给GetAllDataByTablename(string tbName)。这样保证你用中文控件ID也不会出错了。
                                         
      

  11.   

    string sqlstr = "";
    sqlstr = "declare @s varchar(8000) select @s=ISNULL(@s+',','')+QUOTENAME(考试科目) from 考试科目管理 where 考试编号='" + this.comboBox1cx考试名称.SelectedValue.ToString().Trim() + "' exec('select * from (select 学号,姓名,所属教学区,年级,班级,考试成绩表.授课教师,考试成绩表.考试名称,考试成绩表.科目名称,考试成绩 from 考试成绩表 join 考试科目管理 on 考试成绩表.科目名称=考试科目管理.考试科目 ) a pivot(max(考试成绩) for 科目名称 in('''+@s+'''))b')";楼主在执行时,可断点调试一下这句SQL,拿到查询分析器中执行一下就知道了
    字符串在动态SQL中 IN('''+@S+''')这样才正确