TL; DR Как я могу вводить команды для надежной регистрации ошибок FoxPro в текстовом файле при выполнении команд INSERT и APPEND FROM через ODBC / OLE DB?
Я пытаюсь записать обработанные данные обратно в базу данных FoxPro. Фактическое соединение с .dbf осуществляется службой, написанной моим коллегой - я предполагаю, что она использует ODBC или OLE DB. Я указываю только путь к DBF и строки запроса для запуска. Однако я сталкиваюсь с некоторыми проблемами с FoxPro, и, к сожалению, весь мой опыт связан с SQL Server и друзьями, а не с FoxPro.
Моя проблема в том, что простые инструкции, такие как INSERT ниже, отлично работают в Visual Fp, но не проходят через службу. Я не получаю много полезной информации об ошибке, кроме «Произошла ошибка».
INSERT INTO "ADDRESSES" (addressid, firstname, lastname) ;
VALUES (55, 'Test', 'Testerson')
Чтобы облегчить себе жизнь, я попытался ввести больше команд, чтобы FoxPro записывал всю информацию об ошибках в текстовый файл. Опять же, это работает в Visual FoxPro, но не работает без уведомления и не выводит файл при запуске через службу. Я убедился, что права доступа к каталогу верны:
LOCAL lcOldOnError
lcOldOnError = ON("ERROR") && save old error handler
SET PROCEDURE TO [D:\foxpro\errhandler.prg]
ON ERROR DO ErrHandler WITH ERROR(), MESSAGE()
&& This insert causes a duplicate primary key error:
INSERT INTO "address book!addresses" (addressid, firstname, lastname) ;
VALUES (1, 'MyName', 'IsError')
ON ERROR &lcOldOnError && restore old error handler
Внешний PRG errorhandler.prg выглядит так. Он работает внутри Visual FoxPro:
PROCEDURE ErrHandler
PARAMETERS gnError, gcMsg
LOCAL aErrInfo[1]
AERROR(aErrInfo)
cErrMsg = LTRIM(STR(aErrInfo[1])) + CHR(13) + CHR(10) + aErrInfo[2] + CHR(13) + CHR(10) + aErrInfo[3] + CHR(13) + CHR(10)
lnFileHandle = FCREATE ([D:\foxpro\errorlog.txt])
FPUTS(lnFileHandle, cErrMsg)
FCLOSE(lnFileHandle)
ENDPROC
Мы будем благодарны за любые подсказки и подсказки, спасибо.
@DRapp, вот мой код на C #. Я боюсь, что это очень специфично для сайта, поэтому не знаю, помогает ли это чему-нибудь:
static void Main(string[] args)
{
// Test - not production code!
var errormessage = string.Empty;
DataSvc dataService = new DataSvc();
dataService.AppDataPath = @"D:\foxpro\test\DATA\addresses.dbf";
const string commandText = "INSERT INTO [address book!addresses] (addressid, firstname, lastname) VALUES (90, [Iam], [Error])";
var returnValue = dataService.ExecuteCommands(commandText, ref errormessage);
Console.WriteLine("\nResult:{0}\nErrorMsg: {1}", returnValue, errormessage);
Console.ReadLine();
}
Я получаю только ошибки типа «Произошла ошибка» от DataSvc, поэтому я хотел бы украсить операторы INSERT еще несколькими командами для перенаправления информации об ошибках в текстовый файл.