如何使用oledb参数更新表?
我有一个表有三个字段,即LM_code,M_Name,Desc。 LC_code是一个自动生成的stringId,保持这个我正在更新M_Name和Desc。 我使用正常的更新命令,该值在运行时传递,但字段没有得到更新。 我希望使用oledb参数的字段可以更新。
这是我的代码。
public void Modify() { String query = "Update Master_Accounts set (M_Name='" + M_Name + "',Desc='" + Desc + "') where LM_code='" + LM_code + "'"; DataManager.RunExecuteNonQuery(ConnectionString.Constr, query); }
在DataManager类中,我正在执行查询string。
public static void RunExecuteNonQuery(string Constr, string query) { OleDbConnection myConnection = new OleDbConnection(Constr); try { myConnection.Open(); OleDbCommand myCommand = new OleDbCommand(query, myConnection); myCommand.ExecuteNonQuery(); } catch (Exception ex) { string Message = ex.Message; throw ex; } finally { if (myConnection.State == ConnectionState.Open) myConnection.Close(); } } private void toolstModify_Click_1(object sender, EventArgs e) { txtamcode.Enabled = true; jewellery.LM_code = txtamcode.Text; jewellery.M_Name = txtaccname.Text; jewellery.Desc = txtdesc.Text; jewellery.Modify(); MessageBox.Show("Data Updated Succesfully"); }
这使我恼火,小小的OleDB,所以我会在这里张贴我的解决scheme后代。 这是一个旧的post,但似乎是一个好地方。
OleDB不能识别命名参数,但它显然确实意识到你正在试图传递一个命名参数,所以你可以使用它来使你的SQL语义更容易理解。 只要它们以相同的顺序传递,它将接受一个variables作为命名参数。
我用它来更新networking文件夹中的一个简单的Access数据库。
using (OleDbConnection conn = new OleDbConnection(connString)) { conn.Open(); OleDbCommand cmd = conn.CreateCommand(); for (int i = 0; i < Customers.Count; i++) { cmd.Parameters.Add(new OleDbParameter("@var1", Customer[i].Name)) cmd.Parameters.Add(new OleDbParameter("@var2", Customer[i].PhoneNum)) cmd.Parameters.Add(new OleDbParameter("@var3", Customer[i].ID)) cmd.Parameters.Add(new OleDbParameter("@var4", Customer[i].Name)) cmd.Parameters.Add(new OleDbParameter("@var5", Customer[i].PhoneNum)) cmd.CommandText = "UPDATE Customers SET Name=@var1, Phone=@var2" + "WHERE ID=@var3 AND (Name<>@var4 OR Phone<>@var5)"; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } }
它可能看起来像一个多余的代码,是的,你在技术上重复自己,但是这使得世界更容易,当你玩连接点后…..
你接近于你的连接的其他部分,但是正如你注意到的那样,使用参数化查询做SQL注入更安全。
// Some engines used named parameters, others may not... The "?" // are "place-holders" for the ordinal position of parameters being added... String MyQuery = "Update MyTable set SomeField = ?, AnotherField = ? " + " where YourKeyField = ?"; OleDbCommand MyUpdate = new OleDbCommand( MyQuery, YourConnection ); // Now, add the parameters in the same order as the "place-holders" are in above command OleDbParameter NewParm = new OleDbParameter( "ParmForSomeField", NewValueForSomeField ); NewParm.DbType = DbType.Int32; // (or other data type, such as DbType.String, DbType.DateTime, etc) MyUpdate.Parameters.Add( NewParm ); // Now, on to the next set of parameters... NewParm = new OleDbParameter( "ParmForAnotherField", NewValueForAnotherField ); NewParm.DbType = DbType.String; MyUpdate.Parameters.Add( NewParm ); // finally the last one... NewParm = new OleDbParameter( "ParmForYourKeyField", CurrentKeyValue ); NewParm.DbType = DbType.Int32; MyUpdate.Parameters.Add( NewParm ); // Now, you can do you MyUpdate.ExecuteNonQuery();
只是添加到RJB的答案,这是一个鲜为人知的事实,OleDb实际上是否接受命名参数。 你只需要在SQL中声明参数。
请参阅: lowbandwidth.blogspot.com.au/2013/12/positional-msaccess-oledb-parameters.html
如果不用SQL声明参数,OleDb使用纯粹的位置参数插入,并且参数的名称是否匹配SQL,或者如果在SQL中使用了两次参数都没有关系 – 它只会通过盲目地从头到尾依次replaceSQL中查find的任何参数。
但是,如果您正确地声明了这些参数,则可以从SQL语句中获得命名参数和允许重复多次使用的参数的好处。