Возможно кому то пригодится NET компонент (DLL) для работы с файлами dbf в Аксапта...
Приимущества данного решения:
- Надежность (не требуется использования "глючных" ADODB, ODBC и так далее.)
- Быстродействие (обработка файла KLADR.DBF (198 тыс записей) заняла 25 секунд, пример - ниже)
- Возможность использования как на сороне клиента, так и на стороне сервера в т.ч. x64
Компонент самописный, взято отсюда:
http://www.sql.ru/Forum/actualthread...194256#7194256
(спасибо автору)
Компонент преобразует dbf файл в стандартный объект NET DataTable. Так же умеет делать и обратную процедуру.
Пример использования - ниже. Как и другие NET компоненты, данную DLL перед использованием нужно "прописать" в Reference AOT аксапты.
X++:
static void DBFTest(Args _args)
{
System.Data.DataTable dt;
System.Data.DataRowCollection rows;
System.Data.DataRow row;
int cnt;
int i;
str name;
str code;
int t1, t2;
;
new InteropPermission(InteropKind::ClrInterop).assert();
try
{
t1 = timeNow();
dt = DBFclient.DirectAccess::Load("c:\\kladr.DBF");
rows = dt.get_Rows();
cnt = rows.get_Count();
info(strFmt("строк %1", cnt));
for (i = 0; i < cnt; i++)
{
row = rows.get_Item(i);
name = row.get_Item("name");
code = row.get_Item("code");
}
}
catch (exception::CLRError)
{
throw error(AifUtil::getClrErrorMessage());
}
catch (exception::Internal)
{
throw error("Internal");
}
CodeAccessPermission::revertAssert();
t2 = timeNow();
info(strFmt("%1", t2 - t1));
}
Привожу саму DLL и проект с ее исходными кодами (возможно пригодится что то исправить...)