我编写了一个从ProvideX数据库中提取数据的应用程序,过了一段时间我注意到有些字段返回null,即使我知道它们中有数据。我在Excel / MSQuery中证实了这一点。
我无法弄清楚我可能做错了什么,所以我拿出了直接处理查询的代码,并在自己的项目中运行它。它正确地提取了数据,即使它与实际应用程序中的代码相同。
在我的应用程序中,我使用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 :(得分:0)
好的,经过大量测试后,我将问题缩小到单个Date字段,该字段以某种方式抛弃了整个查询。我在查询ProvideX数据库时通过添加规则来跳过该列来解决这个问题。
我担心我还不能说为什么那个字段与ODBC不相处,仍然等着听到供应商的声音(甚至不确定我是否会这样)。我知道这个ProvideX数据库是一个平面文件数据库,所以我猜他们的特定字段设置得很糟糕。
我希望这可以帮助那些可能发现自己处理这样一个模糊数据库的人......