2017-01-21 73 views
2

在執行下面的代碼,我得到錯誤的的ExecuteReader:Connection屬性尚未初始化錯誤問題

的ExecuteReader:Connection屬性尚未初始化。

[WebMethod] 
public static bool GetCurrentToBin(string ToBin) 
{ 
    SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SqlConn"].ToString()); 
    conn.Open(); 
    CommandFunction CF = new CommandFunction(); 

    SqlDataReader dr; 
    dr = CF.ExecuteReader("exec sp_P_WMS_Stock_Adj_Validation_Proc '" + ToBin + "'"); 
    dr.Read(); 
    if (dr.HasRows) 
    { 
     conn.Close(); 
     return true; 
    } 
    return false; 
} 
+1

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並使用別的東西作爲前綴 - 或者根本沒有前綴! –

+0

@marc_s很好!我忘記了這個。 – Christos

回答

2

你可以重構你的代碼像下面,我想你會得到你想要的。問題是你沒有指定要使用的sql連接的CommandFunction對象的任何地方。我不知道這個對象,但我認爲這是問題所在。以下解決方案使用類別SqlCommand

using System.Configuration; 

[WebMethod] 
public static string GetCurrentToBin(string ToBin) 
{ 
    var connectionString = ConfigurationManager.ConnectionStrings["SqlConn"].ToString(); 
    using(var conn = new SqlConnection(connectionString)) 
    { 
     const string queryString = "exec sp_P_WMS_Stock_Adj_Validation_Proc @Bin"; 

     var sqlCommand = new SqlCommand(queryString , conn); 
     sqlCommand.Parameters.AddWithValue("@Bin",ToBin); 

     conn.Open(); 
     var reader = sqlCommand.ExecuteReader(); 

     if(reader.Read() && !reader.IsDBNull(0)) 
     { 
      return reader.GetString(0); 
     } 
     return null; 
    } 
} 

從上面的代碼,你可以拿兩件事情:

  • 我們不顯式關閉的SQL連接。我們沒有明確地關閉連接,而是讓using語句爲我們做這件事。因此,無論何時您想要創建一個新的sql連接,都要將其封裝在using語句中,並且不需要再次記住關閉連接。
  • 僅使用參數化查詢。不這樣做,你可以讓你的應用程序打開到sql injections
+0

將嘗試檢查,讓你知道.. – BNN

+0

錯誤語法接近'sp_P_WMS_Stock_Adj_Validation_Proc'。' – BNN

+0

@ nad正確!我錯過了一個分號。請嘗試更新的並讓我知道。 – Christos

相關問題