【问题标题】:How to Properly format Update syntax on OledbCommand?如何正确格式化 OledbCommand 上的更新语法?
【发布时间】:2022-01-13 14:39:33
【问题描述】:

更新语法错误。 笔记: 已更新代码,现在我没有收到任何错误;但是,数据不会在数据库上更新... 编辑:希望按照建议重命名命令 非常感谢任何帮助...

   OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
                OleDbCommand Command;
               // OleDbParameter parameter;

                Command = new OleDbCommand("UPDATE Log SET Serial_Number = @Serial_Number , Material_Number = @Material_Number , Submitted = @Submitted , prt_Count1 = @prt_Count1 , prt_Count2 = @prt_Count2 , prt_Count3 = @prt_Count3 , Main_Relief = @Main_Relief , Crtg1 = @Crtg1 , Crtg2 = @Crtg2 , Crtg3 = @Crtg3 , Crtg4 = @Crtg4 , Crtg5 = @Crtg5 , Crtg6 = @Crtg6 , Crtg7 = @Crtg7 , Crtg8 = @Crtg8 , Crtg9 = @Crtg9 , Crtg10 = @Crtg10 , Crtg11 = @Crtg11 , Crtg12 = @Crtg12 , Rework = @Rework , aflrp_Repair = @aflrp_Repair , Operator_Initials = @Operator_Initials , Remarks = @Remarks , Pass_FailCrtg1 = @Pass_FailCrtg1 , Pass_FailCrtg2 = @Pass_FailCrtg2 , Pass_FailCrtg3 = @Pass_FailCrtg3 , Pass_FailCrtg4 = @Pass_FailCrtg4 , Pass_FailCrtg5 = @Pass_FailCrtg5 , Pass_FailCrtg6 = @Pass_FailCrtg6 , Pass_FailCrtg7 = @Pass_FailCrtg7 , Pass_FailCrtg8 = @Pass_FailCrtg8 , Pass_FailCrtg9 = @Pass_FailCrtg9 , Pass_FailCrtg10 = @Pass_FailCrtg10 , Pass_FailCrtg11 = @Pass_FailCrtg11 , Pass_FailCrtg12 = @Pass_FailCrtg12 " +
        "WHERE ID = @ID", con);

                Command.Parameters.AddWithValue("@ID", OleDbType.Numeric).Value = int.Parse(txtBoxID.Text);
                Command.Parameters.AddWithValue("@Serial_Number", OleDbType.VarChar).Value = textBox1.Text;
                Command.Parameters.AddWithValue("@Material_Number", OleDbType.VarChar).Value = textBox2.Text;
                Command.Parameters.AddWithValue("@Submitted", OleDbType.DBTime).Value = thisDay1;
                Command.Parameters.AddWithValue("@prt_Count1", OleDbType.Numeric).Value = int.Parse(textBox3.Text);
                Command.Parameters.AddWithValue("@prt_Count2", OleDbType.Numeric).Value = int.Parse(textBox4.Text);
                Command.Parameters.AddWithValue("@prt_Count3", OleDbType.Numeric).Value = int.Parse(textBox5.Text);
                Command.Parameters.AddWithValue("@Main_Relief", OleDbType.Numeric).Value = int.Parse(textBox6.Text);
                Command.Parameters.AddWithValue("@Crtg1", OleDbType.Numeric).Value = int.Parse(textBox7.Text);
                Command.Parameters.AddWithValue("@Crtg2", OleDbType.Numeric).Value = int.Parse(textBox8.Text);
                Command.Parameters.AddWithValue("@Crtg3", OleDbType.Numeric).Value = int.Parse(textBox10.Text);
                Command.Parameters.AddWithValue("@Crtg4", OleDbType.Numeric).Value = int.Parse(textBox11.Text);
                Command.Parameters.AddWithValue("@Crtg5", OleDbType.Numeric).Value = int.Parse(textBox12.Text);
                Command.Parameters.AddWithValue("@Crtg6", OleDbType.Numeric).Value = int.Parse(textBox13.Text);
                Command.Parameters.AddWithValue("@Crtg7", OleDbType.Numeric).Value = int.Parse(textBox14.Text);
                Command.Parameters.AddWithValue("@Crtg8", OleDbType.Numeric).Value = int.Parse(textBox15.Text);
                Command.Parameters.AddWithValue("@Crtg9", OleDbType.Numeric).Value = int.Parse(textBox16.Text);
                Command.Parameters.AddWithValue("@Crtg10", OleDbType.Numeric).Value = int.Parse(textBox17.Text);
                Command.Parameters.AddWithValue("@Crtg11", OleDbType.Numeric).Value = int.Parse(textBox18.Text);
                Command.Parameters.AddWithValue("@Crtg12", OleDbType.Numeric).Value = int.Parse(textBox19.Text);
                Command.Parameters.AddWithValue("@Rework", OleDbType.VarChar).Value = textBox20.Text;
                Command.Parameters.AddWithValue("@aflrp_Repair", OleDbType.VarChar).Value = textBox21.Text;
                Command.Parameters.AddWithValue("@Operator_Initials", OleDbType.VarChar).Value = textBox22.Text;
                Command.Parameters.AddWithValue("@Remarks", OleDbType.VarChar).Value = textBox23.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg1", OleDbType.VarChar).Value = textBox24.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg2", OleDbType.VarChar).Value = textBox25.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg3", OleDbType.VarChar).Value = textBox26.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg4", OleDbType.VarChar).Value = textBox27.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg5", OleDbType.VarChar).Value = textBox28.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg6", OleDbType.VarChar).Value = textBox29.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg7", OleDbType.VarChar).Value = textBox30.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg8", OleDbType.VarChar).Value = textBox31.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg9", OleDbType.VarChar).Value = textBox32.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg10", OleDbType.VarChar).Value = textBox33.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg11", OleDbType.VarChar).Value = textBox34.Text;
                Command.Parameters.AddWithValue("@Pass_FailCrtg12", OleDbType.VarChar).Value = textBox35.Text;

                dataAdapter.UpdateCommand = Command;

【问题讨论】:

  • 显然这行不通:WHERE[ID] = txtBoxID.Text) 那应该是最后一个参数(oledb 参数必须按照它们出现在字符串中的顺序排列。

标签: c# ms-access-2016


【解决方案1】:

简单的 UPDATE 查询通常如下所示:

UPDATE table 
SET column1 = @parameter1, column2 = @parameter2 ...
WHERE columnX = @parameterX ...

您似乎修改了 INSERT VALUES 语句,但语法不正确

无论您使用? 还是@xyz for your parameter placeholders,OLEDB 都不挑剔,但您必须使用 AddWithValue(或等效的)与您使用的一样多的占位符,并且以相同的顺序。与其他提供者不同,您不能重用命名参数。这意味着对于这样的语句:

UPDATE person
SET name = @n, age = @a
WHERE id = @i

您的 C# 将需要以下内容:

command.Parameters.AddWithValue("thename", nameTextbox.Text);      //will be used as the value for @n
command.Parameters.AddWithValue("theage", ageNumericUpDown.Value); //will be used as the value for @a
command.Parameters.AddWithValue("theid", idVariable);              //will be used as the value for @i

增加了3个参数;我故意使名称不同,以强调它们无关紧要。添加的数量和顺序至关重要。你不能这样做:

UPDATE person
SET birthname = @n, currentname = @n
WHERE id = @i

//not enough parameters AND the wrong order. You cannot re-use @n unlike on other DBs
command.Parameters.AddWithValue("@i", ageNumericUpDown.Value);
command.Parameters.AddWithValue("@n", nameTextbox.Text);

“如果你愿意,可以使用@xyz,但假设它们都只是?s”


如果您想更改值并再次运行查询,则给参数起一个好听的名称很有用:

command.Parameters["theid"].Value = idVariable+1;

【讨论】:

  • “无论您使用? 还是@xyz 作为参数占位符,OLEDB 都不挑剔” docs 另有说明。 “OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的位置参数,而不是命名参数。”
  • 是的。本质上,任何@parameters 都会转换为?,这就是为什么您不能依赖它们的行为类似于其他数据库中的命名参数,但语句中允许使用@words 表示的参数
  • @CaiusJard ,希望我已经按照您的建议更新了代码 se OP ...我根本无法保存数据。感谢您的帮助
  • 您已将AddWithValue("@ID", ...) 作为您添加的第一个参数,但"@ID" 在SQL 中出现在最后。 SQL 中参数从左到右的出现顺序必须与参数Added 到command.Parameters 参数集合的从上到下的顺序完全匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多