我有一个我信赖的数据库文件是用Clipper创建的但是不能肯定(我有.ntx文件索引,我理解是Clipper使用的)。我正在尝试创建一个C#应用程序,它将使用System.Data.OleDB命名空间读取此数据库。
在大多数情况下,我可以成功地阅读表中的内容,有一个我不能的字段。该字段称为CTRLNUMS,定义为CHAR(750)。我已经阅读了通过Google搜索找到的各种文章,这些文章建议通过与字符串变量的正常分配不同的过程来读取大于255个字符的字段。到目前为止,我还没有成功找到我找到的方法。
以下是我用来读取表格的示例代码段,其中包含两个用于读取CTRLNUMS字段的选项。即使在字段中存储了750个字符,这两个选项也会返回238个字符。
这是我的连接字符串:
Provider = Microsoft.Jet.OLEDB.4.0; Data Source = c:\ datadir; Extended Properties = DBASE IV;
有人能告诉我从DBF文件中读取更大字段的秘诀吗?
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Format("SELECT ITEM,CTRLNUMS FROM STUFF WHERE ITEM = '{0}'", stuffId);
using (OleDbDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
stuff.StuffId = dr["ITEM"].ToString();
// OPTION 1
string ctrlNums = dr["CTRLNUMS"].ToString();
// OPTION 2
char[] buffer = new char[750];
int index = 0;
int readSize = 5;
while (index < 750)
{
long charsRead = dr.GetChars(dr.GetOrdinal("CTRLNUMS"), index, buffer, index, readSize);
index += (int)charsRead;
if (charsRead < readSize)
{
break;
}
}
}
}
}
}
答案 0 :(得分:3)
您可以在此处找到DBF结构的说明:http://www.dbf2002.com/dbf-file-format.html
我认为Clipper以前做的是修改Field结构,以便在字符字段中,小数位数保持大小的高位字节,因此字符字段大小实际上是256 *小数+大小。
我可能有一个读取dbfs的C#类(本机而不是ADO / DAO),可以对其进行修改以处理这种情况。如果您有兴趣,请告诉我。
答案 1 :(得分:1)
你还在寻找答案吗?这是一次性的工作还是需要经常做的事情?
我有一个Python模块,主要用于从各种DBF文件中提取数据......它还没有处理length_high_byte
= decimal_places
hack,但这是一个微不足道的变化。我很乐意(a)与您分享和/或(b)获取此类DBF文件的副本以供测试。
稍后添加:添加了扩展长度功能,并针对我自己创建的文件进行了测试。提议与任何想要测试它的人分享代码。仍然有兴趣自己获取一些“真实”文件进行测试。
答案 2 :(得分:0)
3个可能值得一试的建议......
1 - 使用Access创建DBF文件的链接表,然后使用.Net命中访问数据库中的表,而不是直接转到DBF。
2 - 尝试FoxPro OLEDB provider
3 - 手动解析DBF文件。示例是here。
我的猜测是#1应该是最简单的,而#3会让你有机会微调你的诅咒技巧。 :)