2011-10-03 4 views
0

Server Mgt Studio에서 실행할 때 원하는 결과를 정확히 반환하는 복잡한 SQL 쿼리는 아니지만 C#으로 실행할 때 DataGrid가 비어 있습니다. (예 - 호스트 이름을 살균 처리했기 때문에 나는 끔찍한 명명 체계가있는 것만은 아닙니다.)SQL 쿼리는 작동하지만 동일한 C# 쿼리는 작동하지 않습니다. .

나보다 더 선명한 눈을 가진 사람이 문제를 선택할 수 있기를 바랍니다.

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

답변

5

내 생각 엔 그것은 당신의 문자열 점이다 :

"\\HOST001" 

당신은 당신의 백 슬래시를 탈출하지 않는, 문자열에는 백 슬래시가 하나만 포함됩니다. ... 나는 그 단일 qoutes이되어야한다고 생각

"\\\\HOST001" 
//or 
@"\\HOST001" 
+1

예! 이것이 월요일 아침에 코딩해서는 안되는 이유입니다. –

+2

저에게는 금요일 오후입니다. 점심 식사 후 금요일에 아무것도 쓰지 않으면 보통 월요일 아침에 다시해야합니다. –

0

as \"Mean (KB)\"


을 그리고 아마 당신도 그 경우에 그들을 탈출하지 않습니다 중 하나에 의해 그것을 수정합니다.

+0

그게 괜찮은 것 같습니다 - 그것은 적절하게 의미있는 (mean) (KB) "'로 변환됩니다. SQL Server에서는 문제없이 열을 별칭으로 지정할 때 작은 따옴표, 큰 따옴표 또는 대괄호를 허용하는 것으로 보입니다. –

+0

@JoeEnos : 아, 오늘 뭔가 새로운 것을 배웠습니다 :) – Mr47

관련 문제