2011-11-10 208 views
1

我有一個服務,不斷寫入數據在一個單獨的線程到SQL數據庫。現在從同一服務,如果我想從同一張表讀取,因爲我已經寫入它,我得到這個例外:已經有一個與此命令關聯的開放DataReader,它必須先關閉。 所以任何人都可以幫助我如何同時做到這一點?同時讀取和寫入數據到sql服務器

這裏是我的代碼讀取數據:

公文集READDATA(查詢字符串) {

 { 

      _result = new Collection<string[]>(); 
      string[] tempResult; 
      SqlDataReader _readerRead; 
      using (_command = new SqlCommand(query, _readConnection)) 
      { 
       _readerRead = _command.ExecuteReader(); 
       while (_readerRead.Read()) 
       { 
        tempResult = new string[4]; 
        tempResult[0] = _reader[0].ToString(); 
        tempResult[1] = _reader[1].ToString(); 
        tempResult[2] = _reader[2].ToString(); 
        tempResult[3] = _reader[3].ToString(); 
        _result.Add(tempResult); 
        //Console.WriteLine("Name : {0} Type : {1} Value : {2} timestamp : {3}", _reader[0], _reader[1], _reader[2], _reader[3]); 

       } 
       if (_readerRead != null) 
       { 
        _readerRead.Close(); 
       } 
       _readConnection.Close(); 
       return _result; 

      } 
     } 
    } 

,在這裏它是寫它:

public void WriteData(Collection<TagInfo> tagInfoList) 
    { 

     int i = 0; 
     for (i = 0; i < tagInfoList.Count; i++) 
     { 
      using(_command = new SqlCommand(insert statement here) 
      { 
       _command.Parameters.AddWithValue("Name", tagInfoList[i].Name); 
       _command.Parameters.AddWithValue("Type", tagInfoList[i].TagType); 
       _command.Parameters.AddWithValue("Value", tagInfoList[i].Value); 
       _reader = _command.ExecuteReader(); 
       if (_reader != null) 
       { 
        _reader.Close(); 
       } 
      } 
     } 

    } 
+2

您是否正在使用1個連接進行讀寫? –

+3

目前爲止你有什麼代碼? –

+1

顯示一些代碼請 –

回答

1

雖然它可能做到,但使用單獨的連接,我會問你爲什麼需要這樣做。

如果您正在讀取和寫入數據到同一服務中的一個表中,您將在一個SQL表上放置不必要的負載,並且根據您打算進行的查詢的數量可能會導致問題。如果你已經有了這些數據(在不同的線程中),爲什麼不把數據從後臺線程傳送到你需要的地方,因爲你把它寫入數據庫,而且你不需要再讀取數據。

但是......很難在沒有看到代碼的情況下給出一個公平的答案/你期望實現什麼。

+0

我想先前讀取從表格中寫入數據,並寫入同一張表中,我一直在寫現有數據。做這件事的最好方法是什麼? –

+1

將行寫入數據庫之後,您可以使用ReaderWriterLockSlim並向集合添加一行。或者,如果您使用backgroundworkerthread,則可以使用progresschanged更新集合。您需要「讀取」多少行數據,以及您需要如何處理這些數據?我認爲這是一個Windows服務,你正在產生單獨的線程來寫入數據和讀取數據? – JonAlb

+0

ya windows service.I根據行的時間戳生成報告。用戶輸入時間範圍,然後我查詢該表以查詢用戶輸入的時間範圍。並且我正在讀取和寫入單獨的線程。因此,我該怎麼做?你能幫我解決嗎? –

5

您需要爲您的作者創建一個與數據庫不同的SQLConnection。你不能爲兩者使用相同的數據庫連接。

+0

你也應該最後關閉datareader後處理數據它常見的錯誤ppl忘記關閉datareader – DeveloperX