当从c执行SQL查询时,获取SQL查询的成功消息

本文关键字:SQL 查询 成功 消息 获取 执行 当从 | 更新日期: 2023-09-27 18:00:33

我正试图通过c#运行sql查询。我想要的是,当执行查询时,我应该得到1行受影响的消息。此外,我不想要这个数字,因为我想运行一个过程,并且其中可能有多个查询。

因此,

int rowsAffected  = comand.ExecuteNonQuery() // This wont work

我的代码是这样的:

            DataSet ds = new DataSet();
            SqlConnection conn = new SqlConnection("Data Source=(localdb)''Projects;Initial Catalog=SprocSystem;Integrated Security=True;");
            string que = "insert into SprocParam values(1,'Int','Param5786',0,'desc')";

            conn.FireInfoMessageEventOnUserErrors = true;
            conn.Open();
            conn.InfoMessage += delegate(object sender, SqlInfoMessageEventArgs e)
            {
                textMessages += "'n" + e.Message;
            };
            SqlCommand command = new SqlCommand(que, conn);
            command.CommandType = System.Data.CommandType.Text;
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = command;
            da.Fill(ds);

每当出现约束错误时,我都会在textMessages变量中得到相应的输出,比如Primary Key Conflict。但是,如果查询完全正确,则textMessages为NULL。相反,我想要的是textMessage应该包含哪个表有多少行受到影响。

有人能帮忙吗。

对于存储过程,我必须这样做,因此我将无法修改查询。我只有存储过程的名称。

当从c执行SQL查询时,获取SQL查询的成功消息

为了能够获得受影响的行数,您必须订阅命令上的StatementCompleted事件,事件arg具有属性RecordCount,该属性告诉每个语句受影响的记录数。

    using (var sqlConnection = new SqlConnection(builder.ConnectionString))
    {
        sqlConnection.Open();
        using (var sqlCommand = new SqlCommand(query, sqlConnection))
        {
            sqlCommand.StatementCompleted += sqlCommand_StatementCompleted;
            sqlCommand.ExecuteNonQuery();
        }
    }
    Console.ReadLine();
}
static void sqlCommand_StatementCompleted(object sender, StatementCompletedEventArgs e)
{
    Console.WriteLine(e.RecordCount);
}

您可以添加@@ROWCOUNT来实现这一点,例如将查询增加到:

insert into SprocParam values(1,'Int','Param5786',0,'desc')
SELECT @@ROWCOUNT
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
GO

有关的更多信息https://msdn.microsoft.com/en-us/library/ms187316.aspx

如果将SET NOCOUNT设置为ON,则ExecuteNonQuery返回0。尝试将其设置为OFF。