首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# access 标准表达式中数据类型不婚配

2012-12-19 
c# access 标准表达式中数据类型不匹配。 //下面是保存按钮的代码private void save_button_Click(object s

c# access 标准表达式中数据类型不匹配。
 

//下面是保存按钮的代码

private void save_button_Click(object sender, EventArgs e)
        {

               dataGridView1.EndEdit();
                  string sqlText ="select ckid,步序,程控时间,[01],[02],[03],[04],[05],[06]    from ckasd  where ckid= 1  order by 步序";

            ds = new ConnDb().updataDs(ds, "ckasd",sqlText);



           dataGridView1.DataSource = ds.Tables["ckasd"];
  

            //不显示新增行
            dataGridView1.AllowUserToAddRows = false;
            //显示各列
            dataGridView1.AutoGenerateColumns = true;
      

        }



        public DataSet updataDs(DataSet changedDs, string tablename,string sql)
        {
            try
            {
                OleDbDataAdapter da = new OleDbDataAdapter(sql, connection);
                this.cmdbuilder = new OleDbCommandBuilder(da);
                da.Update(changedDs, tablename);
                changedDs.AcceptChanges();
                connection.Close();
                MessageBox.Show("数据更新成功");
                return changedDs;//返回更新了的数据表

                   
            }

            catch
            {
                connection.Close();
                MessageBox.Show( "数据更新失败");
                throw;
            }


        }



数据库为access,字段01,02,03,04,05,06均为文本型,字段大小为1,默认值设置为" ";当填充" "空格的时候,能正常保存。字段01,02,03,04,05,06填充"+",不包括引号的+的时候,出现错误,提示是“标准表达式中数据类型不匹配.”



另外调试中的updata实际执行的句子是

执行 NonQuery“UPDATE ckasd SET 02 = ? WHERE ((CKID = ?) AND (步序 = ?) AND ((? = 1 AND 程控时间 IS NULL) OR (程控时间 = ?)) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))”    命令文本 = "UPDATE ckasd SET 02 = ? WHERE ((CKID = ?) AND (步序 = ?) AND ((? = 1 AND 程控时间 IS NULL) OR (程控时间 = ?)) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))", 





这个问题出在哪儿了?


[最优解释]
数字作为字段名,有点不好。
[其他解释]
  有中文的地方全加上[],试试
  string sqlText ="select ckid,[步序],[程控时间],[01],[02],[03],[04],[05],[06]    from ckasd  where ckid= 1  order by [步序]";
[其他解释]
文本型字段在添加的时候得用"'+'",而不是"+"
[其他解释]
这和 类型无关吧
[其他解释]
应该不是这个原因,我用字符作为字段名,利用datagridview的自动更新也会出现问题
[其他解释]
  sqlText = String.Format("UPDATE ckasd   SET  [01]='+',[02]='+', [03]='+',[04]='+', [05]='+',[06]='+'  WHERE ckid ={0} and 步序= 6 ", f1.str_main_ckid);
用上面的sql更新正常。

sqlText = String.Format("Insert into ckasd  (ckid,步序,程控时间,[01],[02],[03],[04],[05],[06]) values ({0},365,200,'+',' ','+',' ','+',' ')", f1.str_main_ckid);
用上面的sql插入也正常。

那为什么会出现  标准表达式中数据类型不匹配  的问题呢
[其他解释]
还有,datagridview1新增行里面,新增加行,然后编辑,这时候更新能成功,那就说明自动生成的Insert into ckasd应该是正确的。
[其他解释]
错误提示:$exception{"标准表达式中数据类型不匹配。"}System.Exception {System.Data.OleDb.OleDbException}



+执行 NonQuery“UPDATE ckasd SET 01 = ? WHERE ((ckid = ?) AND (步序 = ?) AND (程控时间 = ?) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))”命令文本 = "UPDATE ckasd SET 01 = ? WHERE ((ckid = ?) AND (步序 = ?) AND (程控时间 = ?) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))", 连接字符串 = "Provider=Microsoft.Jet.OleDb.4.0;Data Source='G:\\测试\\yypqApplication\\yypqApplication\\db3 - 副本.mdb'"
+


[其他解释]
 public DataSet updataDs(DataSet changedDs, string tablename,string sql)
        {
            try
            {


                OleDbDataAdapter da = new OleDbDataAdapter(sql, connection);
                this.cmdbuilder = new OleDbCommandBuilder(da);
                       
              da.Update(changedDs, tablename);
              changedDs.AcceptChanges();
                connection.Close();
                MessageBox.Show("数据更新成功");
                return changedDs;//返回更新了的数据表

                   
            }

            catch
            {
                connection.Close();
                MessageBox.Show( "数据更新失败");
                throw;
            }


        }


上面是更新代码


下面是数据库字段

       


[其他解释]
也就是INSERT INTO ckasd ([01]) VALUES("+");就相当于INSERT INTO ckasd ([01]) VALUES(+);这时候的 + 是连接符,而不是字符 '+'
[其他解释]
如果只是新增行,而不修改其他行的情况下,更新是正常的。那就是说生成自动插入语句是正常的。那时候INSERT INTO ckasd 没有什么问题的

问题出现在修改原来行的时候,以及删除行的时候。
[其他解释]
还是DENQH 说的对,居然还是字段的问题。

执行 NonQuery“UPDATE ckasd SET 02 = ? WHERE ((CKID = ?) AND (步序 = ?) AND ((? = 1 AND 程控时间 IS NULL) OR (程控时间 = ?)) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))”    命令文本 = "UPDATE ckasd SET 02 = ? WHERE ((CKID = ?) AND (步序 = ?) AND ((? = 1 AND 程控时间 IS NULL) OR (程控时间 = ?)) AND ((? = 1 AND 01 IS NULL) OR (01 = ?)) AND ((? = 1 AND 02 IS NULL) OR (02 = ?)) AND ((? = 1 AND 03 IS NULL) OR (03 = ?)) AND ((? = 1 AND 04 IS NULL) OR (04 = ?)) AND ((? = 1 AND 05 IS NULL) OR (05 = ?)) AND ((? = 1 AND 06 IS NULL) OR (06 = ?)))", 





((? = 1 AND 01 IS NULL) OR (01 = ?))  估计是这里面出了问题。也许应该是((? = 1 AND 01 IS NULL) OR ([01] = ?))?

热点排行