运行SQL命令并获取消息

Ste*_*e W 3 .net c# sql sql-server

我正在开发一个项目,我希望能够将命令发送到SQL Server并运行查询.我已成功使用Joel的非常好的教程将查询返回到列表框: 创建数据库查询METHOD

我现在正在尝试调整它来执行一些命令,然后运行查询以检查命令是否有效.我的查询失败,因为我认为这些命令不起作用.

目前我发送这个:

     MySqlCommand("CREATE TABLE #CSVTest_Data" +
                  "(FirstTimeTaken DATETIME," +
                  "LatestTimeTaken DATETIME," +
                  "Market VARCHAR(50)," +
                  "Outcome VARCHAR(50),"+
                  "Odds DECIMAL(18,2)," +
                  "NumberOfBets INT," +
                  "VolumeMatched DECIMAL(18,2),"+
                  "InPlay TINYINT)");
Run Code Online (Sandbox Code Playgroud)

进入:

    private void MySqlCommand(string sql)
    {
        int numberOfRecords;
        //string result;
        using (var connection = GetConnection())
        using (var command = new SqlCommand(sql, connection))
        {
            connection.Open();
            numberOfRecords = command.ExecuteNonQuery();
        }
        MessageBox.Show(numberOfRecords.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

我的理解是ExecuteNonQuery返回受影响的行数的整数.我的消息框显示值-1.在SQL Server中运行相同的命令将返回"命令已成功完成".如果有人能告诉我我的MySqlCommand方法是否正常以及如何通过运行该函数返回输出的SQL Server消息,我将不胜感激.

ang*_*son 5

为了获取输出到SQL Server Management Studio中"消息"选项卡的消息,"控制台"在SQL Server上执行SQL语句时,必须挂钩到SqlConnection类上的InfoMessage事件:

using (var connection = GetConnection())
using (var command = new SqlCommand(sql, connection))
{
    connection.InfoMessage += (s, e) =>
    {
        Debug.WriteLine(e.Message);
    };
    connection.Open();
    numberOfRecords = command.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)

显然,您将需要以与上面显示的不同的方式处理事件,e此处参数还有其他属性,有关详细信息,请参阅SqlInfoMessageEventArgs.

现在已经说过了,请记住,输出到SQL Server Management Studio中的消息选项卡的一些消息是由该程序生成的,并不是源自服务器本身,因此您询问的特定消息是否会显示通过那个事件,我不能肯定地说.

此外,在这种特定类型的SQL语句中,正确的返回值ExecuteNonQuery实际上是-1,如下所示:

对于UPDATE,INSERT和DELETE语句,返回值是受命令影响的行数.当插入或更新的表上存在触发器时,返回值包括插入或更新操作影响的行数以及受触发器或触发器影响的行数.对于所有其他类型的语句,返回值为-1.如果发生回滚,则返回值也为-1.

(我的重点)