Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行
Posted
技术标签:
【中文标题】Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行【英文标题】:OleDb parameter query in Winforms (C#): no errors but no rows updated 【发布时间】:2015-06-09 14:50:22 【问题描述】:我正在尝试更新 MS Access 中的表,但更新操作不起作用并且我没有收到错误消息。
rowsAffected
为 0,因此没有更新任何内容。
这是我的代码:
public bool UpdateAddress(AddressModel address)
using (OleDbCommand dbCommand = new OleDbCommand())
// Set the command object properties
dbCommand.Connection = new OleDbConnection(this.ConnectionString);
dbCommand.CommandType = CommandType.Text;
dbCommand.CommandText = "Update Addresses " +
" Set [Street] = @Street, [PostalCode] = @PostalCode, " +
" [City] = @City, [Contact] = @Contact"+
" Where [Address_ID] = @Address_ID";
// Add the input parameters to the parameter collection
dbCommand.Parameters.AddWithValue("@Street", address.Street);
dbCommand.Parameters.AddWithValue("@PostalCode", address.PostalCode);
dbCommand.Parameters.AddWithValue("@City", address.City);
dbCommand.Parameters.AddWithValue("@Address_ID", address.Address_ID);
dbCommand.Parameters.AddWithValue("@Contact", address.Contact);
// Open the connection, execute the query and close the connection
dbCommand.Connection.Open();
var rowsAffected = dbCommand.ExecuteNonQuery();
dbCommand.Connection.Close();
return rowsAffected > 0;
AddressModel-Class:
public class AddressModel
public Int64 Address_ID get; set;
public Int64 Customer_ID get; set;
public string Street get; set;
public string PostalCode get; set;
public string City get; set;
public string Contact get; set;
public bool FirstAddress get; set;
可能是什么问题?
【问题讨论】:
数据库中可能不存在Address_ID?因此,没有任何内容与 WHERE 子句匹配,因此不会更新任何内容。我只是猜测,仅凭您提供的信息无法确定。但是如果没有错误,那么很可能查询正在成功执行,这意味着它没有按照您的预期进行,并且对于像这样的简单查询,那么 where 条件是最明显的罪魁祸首。在那里放一个断点,看看address.Address_ID
在运行时是什么
这里是函数UpdateAddress的调试:地址是:Address_ID 4 long City "2222" string Contact "max" string Customer_ID 1 long FirstAddress false bool PostalCode " " string Street " " string跨度>
我确实有表中的最后一个 Adress_ID,即 4
在您正在更新的表中,是否有任何您未提供值的必填字段?另外,您能否在 dbCommand.CommandText 尝试更新表之前打印出它的值?
这里是:“更新地址集 [Street] = atStreet, [PostalCode] = atPostalCode, [City] = atCity, [Contact] = atContact Where [Address_ID] = atAddress_ID”。 at =@ 但是这里不允许使用这么多的@
【参考方案1】:
对于System.Data.OleDb
,参数是严格的位置。 OleDb 忽略参数 names 并且只注意参数占位符在 CommandText 中出现的顺序。因此,您需要以与它们在 CommandText 中出现的顺序完全相同的顺序来 .Add
或 .AddWithValue
参数。
在您的情况下,您需要颠倒最后两个 dbCommand.Parameters.AddWithValue
语句的顺序:@Address_ID
必须是添加的最后一个参数,因为它的占位符最后出现在 CommandText 中。
【讨论】:
@Mohammad_N 如果 Gord 的回答解决了您的问题,您应该将其标记为答案。 没错 :)。我忘记了以上是关于Winforms (C#) 中的 OleDb 参数查询:没有错误但没有更新行的主要内容,如果未能解决你的问题,请参考以下文章
使用 Decimal 参数的数据类型不匹配 - OleDb、C#、Access
Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)
C# OleDb OUT 参数在调用 oracle 过程时失败