显示从SQL Server到程序的行数

时间:2017-11-24 08:56:12

标签: c# sql sql-server ado.net ssms

我正在研究C#VS 2015上的一个程序。在我的程序中,有一个大文本显示框,当我点击某个按钮指示正在执行某个动作时会生成消息。

无论如何,我有一个SQL脚本,它对某些表有COUNT的查询。我可以通过我的程序运行该脚本。但是,由于行计数显示表的总行数,因此只能在SQL Server中查看。我想知道有没有办法执行我的脚本,并在大文本显示框中显示我的程序中的ROW COUNTS?

以下是运行该SQL脚本的代码片段:

    /*  open sql connection to execute SQL script: Row count script*/
    try
    {
        using (SqlConnection con = new SqlConnection(constr))
        {
            con.Open();
            FileInfo file = new FileInfo(DIRECTORY OF THE SCRIPT);
            string script = file.OpenText().ReadToEnd();
            Server server = new Server(new ServerConnection(con));
            server.ConnectionContext.ExecuteNonQuery(script);
            Display("ABCDG"); -- to display message on text display
            con.Close();



        }

    }
    catch (Exception ex)
    {

        textBox1.AppendText(string.Format("{0}", Environment.NewLine));
        textBox1.AppendText(string.Format("{0} MainPage_Load() exception - {1}{2}", _strThisAppName, ex.Message, Environment.NewLine));
        Display(ex.Message + ""); -- display message to textbox
        textBox1.AppendText(string.Format("{0}", Environment.NewLine));
        Debug.WriteLine(string.Format("{0} MainPage_Load() exception - {1}", _strThisAppName, ex.Message));


    }

以下是我的计划的快照:

  https://i.stack.imgur.com/uKP99.png

2 个答案:

答案 0 :(得分:1)

如果脚本文件中有多个查询,则应使用@rowsAffected变量增强脚本,如下面的T-SQL所示。然后,在您的C#代码中,您需要调用 ExecuteScalar 来获取受脚本影响的详细行。

**Script file with @rowsAffected variable logic**

--add following variable at start of your script
DECLARE @rowsAffected VARCHAR(2000);

INSERT INTO [dbo].[Products] ([ProductName]) VALUES ('sun1'),('sun2'),('sun3');

--after each query that you want to track, include the following line
SET @rowsAffected = 'Products : ' + CAST(@@rowcount AS varchar(20));

UPDATE [dbo].[newTable]   SET [ColB] = 'b' ,[ColC] = 'd',[ColD] = 'e'  ,[ColE] = 'f'  WHERE ColA='a';

 --after each query that you want to track, include the following line
SET @rowsAffected = @rowsAffected + ', newTable : ' + CAST(@@rowcount AS varchar(20));

-- add the query below at end of your script 
SELECT @rowsAffected;

您必须读取脚本文件中的文本,就像在代码中一样,然后在执行下面代码段中的代码之前使用从文件读取的文本创建命令对象。

执行上述脚本的C#代码

string rowsAffected =(string) command.ExecuteScalar();
//you can now use rowsAffected variable in any way you like
//it will contain something like Table1 : 4, Table2 : 6

使用原始代码的详细C#代码

    using (SqlConnection con = new SqlConnection(constr))
    {

        FileInfo file = new FileInfo(DIRECTORY OF THE SCRIPT);
        string script = file.OpenText().ReadToEnd();

        SqlCommand command = new SqlCommand(script, con);
        command.CommandType = CommandType.Text;
        try
        {
            con.Open();
            string rowsAffected =(string) command.ExecuteScalar();
            Display( rowsAffected);
            con.Close();
        }
        catch (Exception ex)
        {
            con.Close();
            Display(ex.Message);
        }
    }

答案 1 :(得分:0)

正如Tetsuya Yamamoto在评论中所说,你要找的是使用ExecuteScalar方法。您的代码更改可能类似于下面的

     int numOfRows = (int)server.ConnectionContext.ExecuteScalar(script);
     string displayText =  numOfRows.ToString();
     Display(displayText); -- to display message on text display
     con.Close();

强制转换ToString仅用于安全目的,因为我不确定您的Display如何处理int值