我有一个包含三个字段的表,即LM_code,M_Name,Desc。 LC_code是一个自动生成的字符串Id,保持这个我正在更新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 Class中,我正在执行查询字符串。
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");
}
答案 0 :(得分:17)
这让我恼火,小小的OleDB,所以我会在这里发布我的解决方案给后人。这是一个古老的帖子,但似乎是一个好地方。
OleDB无法识别命名参数,但它显然确实认识到您尝试传达命名参数,因此您可以利用它来获得优势并使您的SQL语义更容易了解。只要它们以相同的顺序传递,它就会接受一个变量作为命名参数。
我用它来更新网络文件夹中的简单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();
}
}
它可能看起来像是一个过多的代码,是的,你在技术上重复自己,但是当你以后玩连接点时,这会让世界变得更容易......
答案 1 :(得分:5)
您与其他连接很接近,但是正如您所注意到的那样,使用参数化查询进行操作比使用SQL-Injection更安全......
// 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();
答案 2 :(得分:0)
为了补充RJB的答案,一个鲜为人知的事实是OleDb实际上接受了命名参数。您还必须在SQL中声明参数。
请参阅:low-bandwidth.blogspot.com.au/2013/12/positional-msaccess-oledb-parameters.html
如果你不在SQL中声明参数,OleDb使用纯粹的位置参数插入,如果参数的名称与SQL匹配,或者如果参数在SQL中使用两次并不重要 - 它只会按顺序从头到尾盲目地替换SQL中任何找到的参数,并传递那些参数。
但是,如果您正确地声明参数,您将获得允许在SQL语句中多次重复的命名参数和参数的好处。