C#无法读取SQL变量的更新版本

时间:2018-11-14 10:55:20

标签: c# sql sql-server

已解决-错误地查询了错误的数据库

很抱歉浪费您的时间! :(


我正在尝试读取SQL变量上一系列操作的结果,这是我试图从中获取值的查询:

DECLARE @Count INT = 0 
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table1' AND xtype = N'U')
BEGIN   
    SET @Count = @Count + (SELECT COUNT(*) FROM Table1)
END 
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table2' AND xtype = N'U')
BEGIN   
    SET @Count = @Count + (SELECT COUNT(*) FROM Table2)
END 
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Table3' AND xtype = N'U')
BEGIN   
    SET @Count = @Count + (SELECT COUNT(*) FROM Table3)
END 
SELECT @Count

基本上,它检查一堆表(可能不存在)中是否有行。


C#代码

List<string> queries = new List<string>();
foreach (var table in tables)
{
    queries.Add(string.Format(@"IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'{0}' AND xtype = N'U')
                                BEGIN   
                                    SET @Count = @Count + (SELECT COUNT(*) FROM {0})
                                END", table.Name.Trim()));
}

var queryString = string.Format(@"DECLARE @Count INT = 0 {0} SELECT @Count
                                    GO", string.Join(" ", queries));

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    //I also tried these methods using Dapper:
    // int count = connection.Query<int>(queryString);
    // int count = (int)connection.ExecuteScalar(queryString);

    SqlCommand cmd = new SqlCommand(queryString, connection);
    using (SqlDataReader dr = cmd.ExecuteReader())
    {
        DataTable dt = new DataTable();
        dt.Load(dr);

        //dt has one row where the data is 0, not the sum as i want it
    }
    connection.Close();
}

问题

问题是,无论我如何尝试将结果加载到C#中,总是会返回原始值(在这种情况下,返回0,但是如果我在查询中更改它,更改将反映在结果中)。

我希望返回的值是所有这些查询的总和:

(SELECT COUNT(*) FROM X) 

我尝试过的

  1. 在线搜索我认为这是一个范围问题,因此我尝试使用和不使用SqlCommand参数来运行查询,这并没有改变结果,也许我没有搜索正确的单词
  2. 在SET命令之后和末尾都添加'GO'
  3. 尝试使用其他方法来解析ASP.NET应用程序中的数据,包括使用称为Dapper的外部库

不幸的是,不可能将查询放入存储过程中,任何人都知道下一步该怎么做?我已经坚持了一段时间...

  

SQL Server版本是SQLServer 2014

3 个答案:

答案 0 :(得分:0)

编辑以反映问题编辑:

显示更改,并:

//dt has one row where the data is 0, not the sum as i want it

然后:答案为零。您正在以一种可以查询的方式来查询它(DataTable过于矫kill过正,但是……嗯),但是:答案为零

我非常确定,如果您在SSMS中运行相同的TSQL(在同一数据库中,以及同一用户):您在那也将得到零。


最终,这里的关键因素是:如何返回值?在这种情况下,您正在做:

SELECT @Count

这意味着它将作为结果网格返回-即,它是一个 query ;所以:只要使用 query API,就可以了。这包括ADO.NET中的ExecuteScalar和dapper中的QuerySingle<int>(您已提到)。

不能要做的是使用ExecuteNonQuery的返回值(在精简版中为Execute),因为这是一个不相关的值(通常是错误的,并且/或是空的和/或无用的-永远不要使用它。

答案 1 :(得分:0)

尝试使用此C#(可能存在较小的语法错误-不在VS中编写/运行它)。如果仍然得到0,则表示您正在查询一个空的数据库:

int count = 0;
using (SqlConnection connection = new SqlConnection(connectionString))
{
    try{
        connection.Open();
        foreach (var table in tables)
        {

            try{
                var cmd = "SELECT COUNT(*) FROM " + table;
                using(var sc as new SqlCommand(cmd, connection)){
                    count += (int)sc.ExecuteScalar();
                }
            }
            catch {}
        }
    }finally{
        connection.Close();
    }
}

答案 2 :(得分:-1)

最好的方法是将sql附加到命令,然后执行

int retVal = cmd.ExecuteScalar();

应该重新获得价值-尽管这是实现价值的几种方法之一。

ExecuteScalar适用于您想要返回单行和单列的实例,就像您在此处所做的那样。

相关问题