У меня есть файл базы данных, который, как я полагаю, был создан с помощью Clipper, но не могу сказать наверняка (у меня есть файлы .ntx для индексов, которые, как я понимаю, использует Clipper). Я пытаюсь создать приложение C #, которое будет читать эту базу данных, используя пространство имен System.Data.OleDB.
По большей части я могу успешно прочитать содержимое таблиц, но есть одно поле, которое я не могу. Это поле называется CTRLNUMS, которое определено как CHAR (750). Я читал различные статьи, найденные в поиске Google, в которых предлагается, чтобы поле размером более 255 символов было прочитано в процессе, отличном от обычного присвоения строковой переменной. Пока что мне не удалось найти подход, который я нашел.
Ниже приведен пример фрагмента кода, который я использую для чтения таблицы, и включает две опции, которые я использовал для чтения поля CTRLNUMS. Обе опции привели к возвращению 238 символов, хотя в поле хранится 750 символов.
Вот моя строка подключения:
Поставщик = Microsoft.Jet.OLEDB.4.0; Источник данных = c: \ datadir; Расширенные свойства = 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;
}
}
}
}
}
}