2014-01-28 48 views
1

我有以下對象:多用戶安全的SQL連接

public class DatabaseAccess 
{ 
    private static string sConnStr; 
    private static SqlConnection sqlConn; 

    private static string ConnectionString 
    { 
     get 
     { 
      if (String.IsNullOrEmpty(sConnStr)) 
      { 
       sConnStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
      } 
      return sConnStr; 
     } 
    } 

    public static int OpenConnection 
    { 
     get 
     { 
      sqlConn = new SqlConnection(ConnectionString); 
      return 0; 
     } 
    } 

    public static SqlConnection Connection 
    { 
     get 
     { 
      if (sqlConn.State != ConnectionState.Open) 
      { 
       sqlConn = new SqlConnection(ConnectionString); 
       sqlConn.Open(); 
      } 
      return sqlConn; 
     } 
    } 
} 

所以每當我需要在我的web應用程序的連接,我使用類似:

DataTable dt = new DataTable(); 
using (SqlConnection cnn = DatabaseAccess.Connection) 
{ 
    using (SqlDataAdapter da = new SqlDataAdapter("MyAStoredProcedure", cnn)) 
    { 
     da.SelectCommand.CommandType = CommandType.StoredProcedure; 
     da.Fill(dt); 
    } 
} 

return dt; 

這一切似乎很好除了當有2個用戶同時運行代碼,我將在我的Web應用程序中得到以下錯誤:

已經有一個與此命令關聯的打開的DataReader需要關閉。

我需要一些建議如何解決上述問題?

謝謝。

+0

創造SqlConnection一個新實例,你可以提供一個解釋,爲什麼你的'Connection'必須是'static'(這是你看到錯誤的原因)? –

+0

我有很多其他的數據庫操作,所以我只會使用相同的靜態連接。所以看起來這是錯誤的原因,那麼我怎樣才能很好地把它呢? –

回答

3

這是因爲你正在共享連接對象 - 不這樣做。 DatabaseAccess.Connection應該每次創建一個新的SqlConnection

+0

這是否意味着我應該只是把sqlConn =新的SqlConnection(ConnectionString);和sqlConn.Open();在DatabaseAccess.Connection? –

+0

@StevenYong,是的,這就是它的意思。 –

+2

另外,一旦完成,請不要忘記關閉連接。 Ekad的方法是一個很好的方法。 – sh1rts

3

嘗試在using聲明

DataTable dt = new DataTable(); 
using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
{ 
    cnn.Open(); 
    using (SqlDataAdapter da = new SqlDataAdapter("MyAStoredProcedure", cnn)) 
    { 
     da.SelectCommand.CommandType = CommandType.StoredProcedure; 
     da.Fill(dt); 
    } 
} 

return dt;