首页 > 解决方案 > C# 不会读取 SQL 变量的更新版本

问题描述

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

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


我正在尝试读取对 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

标签: c#sqlsql-server

解决方案


试试这个 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();
    }
}

推荐阅读