我有一塊代碼旨在從數據庫表中提取文本描述並將它們保存到文本文件中。它看起來像這樣(C#.NET):爲什麼OdbcCommand.ExecuteScalar()拋出AccessViolationException?
OdbcCommand getItemsCommand = new OdbcCommand("SELECT ID FROM ITEMS", databaseConnection);
OdbcDataReader getItemsReader = getItemsCommand.ExecuteReader();
OdbcCommand getDescriptionCommand = new OdbcCommand("SELECT ITEMDESCRIPTION FROM ITEMS WHERE ID = ?", databaseConnection);
getDescriptionCommand.Prepare();
while (getItemsReader.Read())
{
long id = getItemsReader.GetInt64(0);
String outputPath = "c:\\text\\" + id + ".txt";
if (!File.Exists(outputPath))
{
getDescriptionCommand.Parameters.Clear();
getDescriptionCommand.Parameters.AddWithValue("id", id);
String description = (String)getDescriptionCommand.ExecuteScalar();
StreamWriter outputWriter = new StreamWriter(outputPath);
outputWriter.Write(description);
outputWriter.Close();
}
}
getItemsReader.Close();
該代碼已成功保存了數據的一部分爲.txt文件,但對於許多行,一個AccessViolationException被套上以下行:
String description = (String)getDescriptionCommand.ExecuteScalar();
異常文本是「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞」。
程序通常會在表的相同行上拋出異常,但看起來並不是100%一致的。有時候過去拋出異常的數據會突然出現。
有些人無疑想知道爲什麼我沒有在getItemsCommand中選擇ID,ITEMDESCRIPTION FROM ITEMS並跳過第二個查詢。實際上,我最初是這麼做的,而且我遇到了與getItemsCommand.GetString()相同的錯誤。我擔心這個數據集可能佔用了太多內存,也許這是導致錯誤的原因。所以我決定嘗試這種方法,看看它是否會有所幫助。它沒有。有誰知道爲什麼會發生這種情況?
順便提一下,ID是一個INT,而ITEMDESCRIPTION是一個VARCHAR(32000)列。如果它有什麼區別,數據庫是Borland Interbase 6.0(Ick!)
編輯:當描述異常被拋出的地方時,我給出了錯誤的行!哎呀!現在修復。此外,我已經嘗試了迄今爲止提出的建議,但他們沒有幫助。但是,我發現數據庫中只有非常舊的記錄導致了這個錯誤,這很奇怪。如果我將查詢更改爲僅提取最近5年插入的記錄,則不存在任何問題。有人向我建議這可能是一個編碼轉換問題或類似的東西?
更新:解決了它。問題原來是我們的非常可靠的數據庫軟件的ODBC驅動程序中的一個錯誤。與其他驅動程序的解決方法解決了問題。
試過了,它沒有幫助。 – 2008-10-24 14:33:20
是啊...聽到關閉讀者沒有幫助,我一定會嘗試從這個供應商得到一些支持... – 2008-10-25 18:29:04