积极答复者
DataAdapter的RowUpdating事件,SqlRowUpdatingEventArgs.command为何为null?

问题
-
我想取得数据库修改的实际的sql语句,查了一下资料,应该在DataAdapter的RowUpdating事件中可以捕获sql语句。但是我写了个脚本,显示command命令或者Command.Parameters,发现command==null。应该怎么写呢?
private void buttonSave_Click(object sender, EventArgs e)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter("select * from table1", connection);
adapter.RowUpdating += new SqlRowUpdatingEventHandler(adapter_RowUpdating);
SqlCommandBuilder cb = new SqlCommandBuilder(adapter);
adapter.Update(datatable);
}
}
void adapter_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
}
答案
-
你好,正常情况下e.Command是不会为空的,你检查DataTable是否有更新修改删除等
补充:
Update方法执行先后顺序如下-
将 DataRow 中的值移至参数值。
-
引发 OnRowUpdating 事件。
-
执行命令。
-
如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。
-
如果存在输出参数,它们将被放在 DataRow 中。
-
引发 OnRowUpdated 事件。
- 调用 AcceptChanges
如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的 SelectCommand 属性,则可以创建 SqlCommandBuilder 或 OleDbCommandBuilder 对象来为单个表更新自动生成 SQL 语句。然后,CommandBuilder 将生成其他任何未设置的 SQL 语句。此生成逻辑要求 DataSet 中存在键列信息。关于自动生成命令规则如下:
下表显示创建自动生成命令的规则。
命令 规则 InsertCommand
在数据源处为表中所有 RowState 为 Added 的行插入一行。插入所有可更新列的值(但是不包括标识、表达式或时间戳等列)。
UpdateCommand
在数据源处为表中所有 RowState 为 Modified 的行更新行。更新所有列的值,不可更新的列除外,例如标识列或表达式列。更新符合以下条件的所有行:数据源中的列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值。有关更多信息,请参见本主题后面的“更新和删除的开放式并发模型”。
DeleteCommand
在数据源处为表中所有 RowState 为 Deleted 的行删除行。删除符合以下条件的所有行:列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值。有关更多信息,请参见本主题后面的“更新和删除的开放式并发模型”。
如果你的数据表没有更改 没有删除 当然不会产生命令
这些信息在msdn上都可以找到 希望对你有帮助
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond- 已标记为答案 Riquel_DongModerator 2009年8月4日 5:09
-
全部回复
-
你好,正常情况下e.Command是不会为空的,你检查DataTable是否有更新修改删除等
补充:
Update方法执行先后顺序如下-
将 DataRow 中的值移至参数值。
-
引发 OnRowUpdating 事件。
-
执行命令。
-
如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。
-
如果存在输出参数,它们将被放在 DataRow 中。
-
引发 OnRowUpdated 事件。
- 调用 AcceptChanges
如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的 SelectCommand 属性,则可以创建 SqlCommandBuilder 或 OleDbCommandBuilder 对象来为单个表更新自动生成 SQL 语句。然后,CommandBuilder 将生成其他任何未设置的 SQL 语句。此生成逻辑要求 DataSet 中存在键列信息。关于自动生成命令规则如下:
下表显示创建自动生成命令的规则。
命令 规则 InsertCommand
在数据源处为表中所有 RowState 为 Added 的行插入一行。插入所有可更新列的值(但是不包括标识、表达式或时间戳等列)。
UpdateCommand
在数据源处为表中所有 RowState 为 Modified 的行更新行。更新所有列的值,不可更新的列除外,例如标识列或表达式列。更新符合以下条件的所有行:数据源中的列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值。有关更多信息,请参见本主题后面的“更新和删除的开放式并发模型”。
DeleteCommand
在数据源处为表中所有 RowState 为 Deleted 的行删除行。删除符合以下条件的所有行:列值匹配行的主键列值,并且数据源中的剩余列匹配行的原始值。有关更多信息,请参见本主题后面的“更新和删除的开放式并发模型”。
如果你的数据表没有更改 没有删除 当然不会产生命令
这些信息在msdn上都可以找到 希望对你有帮助
Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond- 已标记为答案 Riquel_DongModerator 2009年8月4日 5:09
-
-
你好,
在你执行adapter.Update(datatable)之前,你修改了Datatable中的数据吗,你使用上面的代码保存数据的的吗?如果只是执行下面的代码,数据没有被修改,也就没有保存。
SqlDataAdapter adapter = new SqlDataAdapter("select * from table1", connection);
adapter.RowUpdating += new SqlRowUpdatingEventHandler(adapter_RowUpdating);
SqlCommandBuilder cb = new SqlCommandBuilder(adapter);
adapter.Update(datatable);
Please remember to mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.