2013-08-01 157 views
0

我編寫了一個應用程序來從ProvideX數據庫中提取數據,過了一段時間後我發現有些字段返回null,即使我知道他們有數據。我在Excel/MSQuery中證實了這一點。ODBC數據檢索問題

我無法弄清楚我可能會做錯什麼,所以我拿出了直接處理查詢的代碼,並將它運行在自己的項目中。它正確地拉取了數據,即使它在實際應用程序中是相同的代碼。

在我的應用程序中,我使用了ODBCDataAdapter和ODBCDataReader。我首先使用adapter.Fill(),如果失敗,應用程序將使用閱讀器。這兩種方式都具有與上面概述的相同的行爲:在應用程序內部,它們無法正確檢索某些字段,在應用程序之外它們自己按預期方式工作。

任何人都可以指向一些可能導致ODBC的東西有這樣的問題嗎?

我想我應該澄清一下,我不是問我的代碼出了什麼問題,而是一般的疑難解答提示,說明什麼可能會導致ODBC框架出現此問題。

編輯:

好吧,讓我在這裏補充一些詳細信息...

的主要問題似乎是在DataReader的代碼,特別是Read()方法。出於某種原因,在我的應用程序中,Read()方法需要至少一秒的時間才能執行,並且很多時間需要超過3秒。相比之下,在我的應用程序之外,整個查詢代碼(包括填充DataTable)在30秒內運行。這是大約3千行370列。

while循環...

// Column ordinals cached 
// I pared down the code inside the while loop, populating a list of 
// arrays (rows) to hold the raw data. This was the quickest way I 
// could think of to do this. TryGetValue is an extension method 
// that handles null exceptions. 
while(reader.Read()) 
{ 
    var arr = new object[reader.FieldCount]; 
    for (i = 0; i < arr.Length; i++) 
    { 
     arr[i] = reader.TryGetValue(ordinals[i]); 
    } 
    rows.Add(arr); 
} 

爲什麼會有差別?

+0

你更容易得到幫助這裏,如果您發佈至少證明你的問題所需的最少量的代碼。 – kenrogers

+0

當然,但你看過我的問題嗎?我不確定問題在於我的查詢代碼,因爲它在一個地方工作,而不在另一個地方,所以我的問題是關於可能是這樣的一些潛在原因。這使得很難找出究竟代碼放在我的問題.... –

+0

是的,我讀你的問題。我的主張是,用給定的信息很難提供答案。再考慮一下,我會同意可能很難弄清楚哪些代碼是相關的。你有任何編譯或運行時錯誤或警告可能有幫助嗎?你有沒有嘗試過調試,看看這可能會給你更多的信息? – kenrogers

回答

0

好吧,經過多次測試後,我將問題縮小到單個Date字段,該字段以某種方式拋出整個查詢。我在查詢ProvideX數據庫時通過添加規則跳過該列來處理此問題。

恐怕我還不能說這個領域爲什麼不和ODBC相處,還在等待廠商的消息(甚至不知道我是否會這麼做)。我知道這個ProvideX數據庫是一個平面文件數據庫,所以我猜他們有那個特定的領域設置不好。

我希望這可以幫助其他人誰可能會發現自己處理這樣一個不起眼的數據庫...