我有一個約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。)
當你限制回來說,5左右行#會發生什麼。根據我在google上發現的,結果集大於緩衝區。增加緩衝區將允許更大的結果集。就代碼而言,應該沒有會影響緩衝區的「清理」。 –
這很奇怪,我將行數限制爲1.「whereValue」將其限制爲僅一行。當我遍歷代碼時,它每次只返回一行... – Vaccano
您使用TableDirect的任何原因?您是否嘗試過獲取數據,然後填充DataTable或DataSet?你在某處放置你的命令嗎?我有強烈的感覺,如果你使用了TextType的CommandType,發出查詢然後使用ExecuteReader,這個問題就會消失。您可以使用DbAdapter來填充DataTable/DataSet。 –