2011-04-27 57 views
3

我在C#中運行一個返回一個值(一個字符串)的SQL命令。然後我試圖將其保存到一個變量,但它總是拋出此異常:C#SqlCommand - 將結果集設置爲變量

「System.InvalidOperationException」類型的第一次機會異常出現在system.data.dll 線程「」(0x1bbc )已退出代碼0(0x0)。 System.InvalidOperationException:無數據存在時無法嘗試讀取。 在System.Data.SqlClient.SqlDataReader.GetValue(的Int32 I)

然而,當我在SQL Server中運行相同的命令,它絕對輸出值。

myCommand = new SqlCommand("SELECT TrialName FROM dbo.CT WHERE NumId='"+TrialId+"'", myConnection);  
SqlDataReader dr = myCommand.ExecuteReader(); 
String TName = dr[0].ToString(); 

即使我硬編碼整個的SqlCommand(而不是使用TrialId變量),它仍會引發異常。這裏發生了什麼?

+1

我希望TrialID不是像'0或1 = 1;客戶DROP TABLE;選擇姓名,工資從僱員; - ' – 2011-04-27 18:48:18

回答

8

必須從數據讀取器讀取之前調用dr.Read():

myCommand = new SqlCommand("SELECT TrialName FROM dbo.CT WHERE NumId='"+TrialId+"'", 

myConnection);     
SqlDataReader dr = myCommand.ExecuteReader();     
if(dr.Read()) 
{ 
    String TName = dr[0].ToString(); 
} 

SqlDataReader.Read()推進讀者到下一個記錄,當沒有更多的記錄返回false。

1

您需要先致電dr.Read(),然後才能閱讀。 DataReader.Read()將DataReader推進到下一行。你必須把它的第一行,也讓你可以在while循環使用它:

while (dr.Read()) 
{ 
    ... 
} 

希望這有助於!

2

正如其他答案指出的那樣,您需要調用SqlDataReader上的Read()方法。

但是,如果您只從select語句返回一個值,則應考慮使用SqlCommand.ExecuteScalar method。它不需要使用SqlDataReader那樣多的代碼。

事情是這樣的:

string name = Convert.ToString(myCommand.ExecuteScalar()); 
0

我可以建議使用參數化查詢,以幫助抵禦SQL注入漏洞?如果您需要即席SQL語句,而不是存儲過程,可以考慮使用這樣的事情:

string TName;   
using (var conn = new SqlConnection(SomeConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "SELECT TrialName FROM dbo.CT WHERE [email protected]"; 
    cmd.Parameters.AddWithValue("@Trial", TrialId); 
    TName = cmd.ExecuteScalar().ToString(); 
} 

你可以擺脫使用ExecuteScalar()命令,如果你只從第一行要求的第一列的值

如果你需要比單值,繼續使用SqlDataReader對象:

string TName;   
using (var conn = new SqlConnection(SomeConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "SELECT TrialName FROM dbo.CT WHERE [email protected]"; 
    cmd.Parameters.AddWithValue("@Trial", TrialId); 
    using (var reader = cmd.ExecuteReader()) 
    { 
     if (reader.Read()) 
     { 
      TName = reader["TrialName"].ToString(); 
     } 
    } 
}