SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行
Posted
技术标签:
【中文标题】SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行【英文标题】:SqlDataAdapter.Update(dataset) method inserts new rows but does not updates existing rows 【发布时间】:2014-06-01 14:56:49 【问题描述】:我正在创建具有 DataGrigView 来呈现表格的 winform 应用程序。 我有一个负责使用 DB 的 DAL 类。
加载表格数据的方法有一种:
public static void GetItemsByOrder(int orderId, ref DataSet dataSet)
string queryString = @"Select Id,OrderId as [מס' הזמנה],ItemCode as[מק""ט], ItemName as [שם פריט], ReceiptDate as [ת. הספקה],
WarrantyExpDate as [באחריות עד],SuppliersItemCode as [מק""ט ספק], Supplier as [ספק], Count as[כמות], Active
FROM OrdersManager_Items where OrderId = @param";
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@param", orderId);
SqlDataAdapter adapter = new SqlDataAdapter(command);
try
lock (myLock)
adapter.Fill(dataSet,"Items");
catch (Exception ex)
LogWriter.WriteLogEntry(LogWriter.LogType.ERROR, string.Format("Failed to get Items by OrderId code from DB."+
"This is due to exception: 0,\n StackTrace: 1. ", ex.Message, ex.StackTrace));
dataSet = null;
第二种方法负责使用表中所做的更改来更新数据库:
public static bool UpdateItemsByOrder(int orderId, DataSet data)
string queryString = @"Select Id,OrderId as [מס' הזמנה],ItemCode as[מק""ט], ItemName as [שם פריט], ReceiptDate as [ת. הספקה],
WarrantyExpDate as [באחריות עד],SuppliersItemCode as [מק""ט ספק], Supplier as [ספק], Count as[כמות], Active
FROM OrdersManager_Items where OrderId = @param";
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(queryString, connection);
command.Parameters.AddWithValue("@param", orderId);
SqlDataAdapter adapter = new SqlDataAdapter(command);
try
lock (myLock)
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
int rowsUpdated = adapter.Update(data,"Items");
return true;
catch (Exception ex)
LogWriter.WriteLogEntry(LogWriter.LogType.ERROR, string.Format("Failed to update Items table in DB. This is due to exception: 0,\n StackTrace: 1. ", ex.Message, ex.StackTrace));
return false;
问题: 如果在 Items 表中添加或删除了新行 - UpdateItemsByOrder 按预期添加/删除数据库中的行。 但 Items 表的现有行中的更新不会在 DB 中更新。
没有错误或异常。 我尝试添加 builder.GetUpdateCommand() command = no result.
我很乐意得到任何帮助或建议。谢谢
P>S> 我正在使用这个MSDN LINK 来学习如何使用 SQLAdapter
【问题讨论】:
您是否尝试过将 Update 查询与 command.ExecuteNonQuery() 一起使用? 你想使用更新命令是什么意思?当我现在没有更新值时如何编写查询??? 您是否使用AutoGenerateEditButton
的GridView
进行更新?
将断点放在adapter.Update()
,检查DataTable
的RowState
,必须设置为Modified
才能更新行。
Sallushan,你是对的,rowState 是“Unchanged”。是什么原因?是因为我加载的DataSet和我尝试更新的DataSet不是同一个对象?
【参考方案1】:
好的,在 sallushan 的建议下,我得到了解决方案: DataAdapter 不更新 DB 的原因是 DataTable 中更新的行的 RowState 值为“Unchanged”而不是“Modified”。
有两种基本方法可以解决这个问题:
-
直接在 DataTable 中而不是在 DGV 中更新数据
在通过 DGV 进行更新后调用 DataTable.Rows[indexOfUpdatedRowInDGV].EndEdit() 方法,如 Here 所述。
感谢大家的帮助:-)
【讨论】:
【参考方案2】:您确实意识到您运行的是 SELECT 命令而不是更新,对吗?
我的猜测是 adapter.Update
只是选择然后报告没有更新的行,因为没有更新。
【讨论】:
如果你是对的,为什么新行添加成功? 我正在使用此链接中的示例msdn.microsoft.com/en-us/library/… 我确信如果您运行“SELECT ....”,您将无法更新 SQL 表中的任何行,为此您需要一个UPDATE table-name SET colName=value WHERE conditional
命令。
您可以执行“SELECT INTO”,将行添加到表中。以上是关于SqlDataAdapter.Update(dataset) 方法插入新行但不更新现有行的主要内容,如果未能解决你的问题,请参考以下文章
在 SqlDataAdapter.Update() 中获取错误消息
200万条记录的SqlDataAdapter.Update()速度极慢
当 RowState = Modified 时 SQLDataAdapter.Update() 不更新