2014-04-20 78 views
-1

我有了功能的SqlDB.dll:SqlDataReader的出現InvalidOperationException

  public SqlDataReader getEnumValues(int enumId) 
    { 
     SqlDataReader reader = null; 
     using (SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 
      SqlCommand command = 
       new SqlCommand(
        "SELECT * FROM [EnumValue] WHERE enumId LIKE '" + enumId + "';", 
        connection); 
      reader = command.ExecuteReader(); 
      //if(reader.Read()) 
      // Debug.WriteLine("Inside sqlDb->getEnumValues command = " + command.CommandText + " reader[name] = " + reader["name"].ToString() + " reader[value] = " + reader["value"].ToString() + " reader[description] = " + reader["description"].ToString()); 
     } 
     //reader.Close(); 
     return reader; 
    } 

正如你可以看到我已經嘗試返回之前關閉的讀者,也是我讀出的數據內,它的確定。 我使用的功能是這樣的:

using (SqlDataReader getEnumValuesReader = (SqlDataReader)getEnumValues.Invoke(sqlDB, getEnumValuesForEnumParam)) 
        { 
         Debug.WriteLine("Success getEnumValues -- "); 

         if (getEnumValuesReader.HasRows) 
         { 
          while (getEnumValuesReader.Read())  //Loop throw all enumValues and add them to current enum 
          { 
           try 
           { 
            values.Add(new Model.EnumValue(getEnumValuesReader["name"].ToString(), getEnumValuesReader["value"].ToString(), getEnumValuesReader["description"].ToString())); 
            Debug.WriteLine("Value[0].name = " + values[0].Name); 
           } 
           catch (Exception ex) 
           { 
            Debug.WriteLine("Error in building new EnumValue: " + ex.Message); 
           } 
          } 
         } 

        } 

和我越來越類型的異常「System.InvalidOperationException」

我猜它是與SqlDataReader的傳遞。

+1

[SQL注入警報](http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - 您應該**不**將您的SQL語句連接在一起 - 使用**參數化查詢**來代替以避免SQL注入 –

+0

我根本沒有安全問題,它沒有任何用戶\其他開發人員\未來的計劃,但感謝您的答案 – Yogevnn

+0

如果此代碼用於網站 - **任何這些網站都有被SQL注入攻擊的高度危險。只是讓我知道這些網站是什麼,所以我可以確保永遠不會訪問他們中的任何一個.... –

回答

2

SQL讀取器不能存在於SQL連接的上下文之外。您的連接正在處理您的方法,因此您返回的讀者無法在調用方法中獲取任何數據。

最好的選擇是從閱讀器而不是閱讀器返回值。傳閱讀者並不是一個好習慣,這意味着底層的聯繫等是開放的和不存在的。

+0

謝謝你的回答,我的問題是如何返回所有的值?因爲不是所有的值都來自相同的類型,有些是字符串,有些是int – Yogevnn

+0

,你只需要用你所有的類型(string,int等)聲明一個類,然後返回一個List 。稱爲DTO。數據傳輸對象。 –

相關問題