none
DataAdapter的RowUpdating事件,SqlRowUpdatingEventArgs.command为何为null? RRS feed

  • 问题

  • 我想取得数据库修改的实际的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)
            {

            }

    2009年7月29日 3:24

答案

  • 你好,正常情况下e.Command是不会为空的,你检查DataTable是否有更新修改删除等

    补充:
    Update方法执行先后顺序如下
    1. 将 DataRow 中的值移至参数值。

    2. 引发 OnRowUpdating 事件。

    3. 执行命令。

    4. 如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。

    5. 如果存在输出参数,它们将被放在 DataRow 中。

    6. 引发 OnRowUpdated 事件。

    7.     调用 AcceptChanges

    如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的 SelectCommand 属性,则可以创建 SqlCommandBuilderOleDbCommandBuilder 对象来为单个表更新自动生成 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
    2009年7月29日 5:29
    版主

全部回复

  • 你好,正常情况下e.Command是不会为空的,你检查DataTable是否有更新修改删除等

    补充:
    Update方法执行先后顺序如下
    1. 将 DataRow 中的值移至参数值。

    2. 引发 OnRowUpdating 事件。

    3. 执行命令。

    4. 如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。

    5. 如果存在输出参数,它们将被放在 DataRow 中。

    6. 引发 OnRowUpdated 事件。

    7.     调用 AcceptChanges

    如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的 SelectCommand 属性,则可以创建 SqlCommandBuilderOleDbCommandBuilder 对象来为单个表更新自动生成 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
    2009年7月29日 5:29
    版主
  • 保存确实是没有问题的。RowUpdating事件中不写脚本,保存是成功的。
    2009年7月29日 6:57
  • 你好,

    在你执行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.
    2009年7月31日 7:45
    版主