Это раздражало меня, маленький чокнутый 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();
}
}
Это может выглядеть как избыток кода, и да, вы технически повторяете себя, но это облегчает жизнь, когда вы позже играете в "соединяй точки" .....