【问题标题】:SQL Query works but equivalent C# query doesn't. .SQL 查询有效,但等效的 C# 查询无效。 .
【发布时间】:2011-10-03 08:09:32
【问题描述】:

我有一个不是特别复杂的 SQL 查询,当在 Server Mgt Studio 中运行时,它返回的正是我想要的,但是当我在 C# 中运行它时,DataGrid 出现空白。 (是的 - 主机名已清理,我不只是有一个糟糕的命名方案。)

希望眼睛比我更敏锐的人能解决这个问题。

SQL查询:

SELECT MachineName, InstanceName, CounterName, 
AVG(CASE WHEN CounterValue > 0 THENCounterValue ELSE NULL END)/1024 as 'Mean (KB)'
FROM DataCollector.dbo.JobCounterSummary
WHERE 
((MachineName = '\\HOST001' AND (InstanceName = 'D:' OR InstanceName = 'E:')) OR
(MachineName = '\\HOST002' AND (InstanceName = 'E:' OR InstanceName = 'G:')) OR
(MachineName = '\\HOST003' AND (InstanceName = 'G:' OR InstanceName = 'H:')) OR 
(MachineName = '\\HOST004' AND (InstanceName = 'G:' OR InstanceName = 'H:') OR
(MachineName = '\\HOST005' AND InstanceName = 'G:') OR 
(MachineName = '\\HOST006' AND InstanceName = 'C:') OR 
(MachineName = '\\HOST007' AND InstanceName = 'C:'))) AND
InstanceName != '_Total' AND 
InstanceName NOT LIKE 'Harddisk%' AND 
(CounterName = 'Avg. Disk Bytes/Write' OR CounterName = 'Avg. Disk Bytes/Read') 
GROUP BY MachineName, CounterName, InstanceName 
ORDER BY MachineName, InstanceName, CounterName

还有 C# 代码:

public DataTable dtJobReadWrite = new DataTable();
    private void GetReadWriteStats()
    {
        dtJobReadWrite.Clear();
        string connstr = @"Server=SQLSERVER\SQL;Database=DataCollector;Trusted_Connection=True; MultipleActiveResultSets=true";
        SqlConnection conn = new SqlConnection(connstr);
        conn.Open();
        string commandstr =
            "SELECT MachineName, InstanceName, CounterName, AVG(CASE WHEN CounterValue > 0 THEN CounterValue ELSE NULL END)/1024 as \"Mean (KB)\" " +
            "FROM dbo.JobCounterSummary " +
            "WHERE " +
                "((MachineName = @HOST001 AND (InstanceName = @DriveD OR InstanceName = @DriveE)) OR " +
                "(MachineName = @HOST002 AND (InstanceName = @DriveE OR InstanceName = @DriveG)) OR " +
                "(MachineName = @HOST003 AND (InstanceName = @DriveG OR InstanceName = @DriveH)) OR " +
                "(MachineName = @HOST004 AND (InstanceName = @DriveG OR InstanceName = @DriveH) OR " +
                "(MachineName = @HOST005 AND InstanceName = @DriveG) OR " +
                "(MachineName = @HOST006  AND InstanceName = @DriveC) OR " +
                "(MachineName = @HOST007 AND InstanceName = @DriveC))) AND " +
                "InstanceName != @_Total AND " +
                "InstanceName NOT LIKE @HardDisk AND " +
                "(CounterName = @AvgDiskBytesWrite OR CounterName = @AvgDiskBytesRead) " +
            "GROUP BY MachineName, CounterName, InstanceName " +
            "ORDER BY MachineName, InstanceName, CounterName";

        SqlCommand jobsCommand = new SqlCommand(commandstr, conn);
        jobsCommand.Parameters.AddWithValue("@HOST001", "\\HOST001");
        jobsCommand.Parameters.AddWithValue("@HOST002", "\\HOST002");
        jobsCommand.Parameters.AddWithValue("@HOST003", "\\HOST003");
        jobsCommand.Parameters.AddWithValue("@HOST004", "\\HOST004");
        jobsCommand.Parameters.AddWithValue("@HOST005", "\\HOST005");
        jobsCommand.Parameters.AddWithValue("@HOST006", "\\HOST006");
        jobsCommand.Parameters.AddWithValue("@HOST007", "\\HOST007");
        jobsCommand.Parameters.AddWithValue("@DriveC", "C:");
        jobsCommand.Parameters.AddWithValue("@DriveD", "D:");
        jobsCommand.Parameters.AddWithValue("@DriveE", "E:");
        jobsCommand.Parameters.AddWithValue("@DriveG", "G:");
        jobsCommand.Parameters.AddWithValue("@DriveH", "H:");
        jobsCommand.Parameters.AddWithValue("@_Total", "_Total");
        jobsCommand.Parameters.AddWithValue("@HardDisk", "Harddisk%");
        jobsCommand.Parameters.AddWithValue("@AvgDiskBytesWrite", "Avg. Disk Bytes/Write");
        jobsCommand.Parameters.AddWithValue("@AvgDiskBytesRead", "Avg. Disk Bytes/Read");
        SqlDataAdapter jobsAdapter = new SqlDataAdapter(jobsCommand);
        jobsAdapter.Fill(dtJobReadWrite);
        dgvReadWrites.DataSource = dtJobReadWrite;
        conn.Close();
    }

【问题讨论】:

    标签: c# sql parameterized


    【解决方案1】:

    我猜是你的字符串:

    "\\HOST001"
    

    你没有转义你的反斜杠,所以字符串只包含一个反斜杠。通过以下任一方式修复它:

    "\\\\HOST001"
    //or
    @"\\HOST001"
    

    【讨论】:

    • 对我来说,这是周五下午。如果我在周五午饭后写任何东西,我通常必须在周一早上重新写。
    【解决方案2】:

    as \"Mean (KB)\"

    我猜那些应该是单引号...
    在这种情况下,您可能也不必逃避它们。

    【讨论】:

    • 那个似乎没问题 - 它正确地转换为 as "Mean (KB)",这应该是有效的 SQL。 SQL Server 似乎允许在为列命名时使用单引号、双引号或方括号,没有问题。
    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多