2011-02-22 48 views
1

我有一個約150行的表格。這些是在表中的數據類型:是否需要清理SQL CE ExecuteResultSet?

  • INT(PK)
  • 爲nvarchar(52)
  • TINYINT
  • 日期時間
  • 唯一標識符
  • 爲nvarchar(300)

我從Web服務下載數據並插入數據庫。當我這樣做,它工作正常。

我後來在執行我的程序時再次調用Web服務。由於我可能已經更新了第一次下載的一些數據,因此我檢查數據庫以查看該行已更改。如果它已經離開了它,如果不是的話,我會更新它。我認爲這是檢查是否存在導致我的問題。當我這樣做時,我得到這個錯誤:

"SQL Server Compact has exceeded the buffer size. The default size can be increased on initialization by modifying the ssce: max buffer size property. [ The default size = 655360 ]"

注意:這不會立即發生在第二次。 (這意味着我走了一些行,他們更新得很好。)

我能想到的唯一的事情是我的結果集沒有被清除掉。 (雖然我已經使用了相同的代碼沒有問題訪問數據庫。)

這裏是我的代碼:

public static SqlCeResultSet SetupTable(string tableName, string indexName, 
    bool allowUpdates, params object[] whereValues) 
{ 
    // The command used to affect the data 
    var command = new SqlCeCommand 
         { 

          CommandType = CommandType.TableDirect, 
          Connection = _connection, 
          // Set the table that we are going to be working with. 
          CommandText = tableName, 
          // Indicate what index we are going to be using. 
          IndexName = indexName 
         }; 

    if ((whereValues != null) && (whereValues.Length > 0)) 
     command.SetRange(DbRangeOptions.Match, whereValues, null); 

    // Get the table ready to work with. 
    if (allowUpdates) 
     return command.ExecuteResultSet(
         ResultSetOptions.Updatable | ResultSetOptions.Scrollable); 
    else 
     return command.ExecuteResultSet(ResultSetOptions.Scrollable); 
} 

調用看起來是這樣的:

SetupTable("tblMyTable", "IndexName", true, whereValue); 

怪異的事情如果我不使用SetRange,它可以正常工作。在我看來,如果使用SetRange,它應該使用更少的緩衝區空間(並不像它看起來那樣)。

當它與此錯誤崩潰後,查詢分析器中的調用也將提供相同的消息。我可以調整我的緩衝區大小,但是我相信它會花費更長的時間才能填滿(特別是因爲我傳入的「where」值將範圍設置爲單行)。

有一點需要注意的是,我爲表中的每一行調用上面的代碼。 (這就是爲什麼我問我是否應該清理我的結果。)雖然我在表格中爲每一行調用它,但是在創建新表格之前,前一個超出了範圍。

任何幫助將是偉大的!

(注:如果你想看到完整的代碼,SetupTable東西,我把全班here。)

+0

當你限制回來說,5左右行#會發生什麼。根據我在google上發現的,結果集大於緩衝區。增加緩衝區將允許更大的結果集。就代碼而言,應該沒有會影響緩衝區的「清理」。 –

+0

這很奇怪,我將行數限制爲1.「whereValue」將其限制爲僅一行。當我遍歷代碼時,它每次只返回一行... – Vaccano

+1

您使用TableDirect的任何原因?您是否嘗試過獲取數據,然後填充DataTable或DataSet?你在某處放置你的命令嗎?我有強烈的感覺,如果你使用了TextType的CommandType,發出查詢然後使用ExecuteReader,這個問題就會消失。您可以使用DbAdapter來填充DataTable/DataSet。 –

回答

3

你處置的地方你的命令?

任何實現IDisposable(具有Dispose()方法)都應該處理。這是一般規則。既然你爲每一行調用這個方法,你應該處理你的命令。

+0

再次感謝!事實證明,我有很多「一次性」的物體懸掛在身邊。我把它們解決了幾個問題就消失了。 – Vaccano

+0

@Vaccano,太棒了!感謝您的更新。 –

相關問題