【问题标题】:How can I log FoxPro errors to a text file?如何将 FoxPro 错误记录到文本文件中?
【发布时间】:2014-09-03 09:26:40
【问题描述】:

TL;DR 在通过 ODBC/OLE DB 运行 INSERT 和 APPEND FROM 命令时,如何发出命令以可靠地将 FoxPro 错误记录到纯文本文件?

我正在尝试将一些经过处理的数据写回 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 语句,以便将错误信息重新路由到文本文件。

【问题讨论】:

    标签: foxpro visual-foxpro


    【解决方案1】:

    您提到了一项服务和 OleDb/ODBC。你用什么语言连接.. C#.net, VB.net, 别的什么?

    但是,请注意一件事...如果您正在对地址表进行插入,并且“AddressID”列是自动增量列的列,则您不能提供要插入的 ID,即完全在 VFP 的控制下,并且可能因此而对您产生错误,或者该 ID 已经存在。

    您可能需要一个 UPDATE 语句,例如

    UPDATE ADDRESSES set firstname='Test', lastname = 'Testerson'
       where addressid = 55
    

    通过查看您的答案和添加的代码,它可能就像您的设备连接一样简单。通常对于 DBF 的东西,连接到找到 DBF 文件的路径,然后一旦连接,您可以对该路径中的 dbfs 执行任何操作。所以我会从改变开始

     dataService.AppDataPath = @"D:\foxpro\test\DATA\addresses.dbf";
    

     dataService.AppDataPath = @"D:\foxpro\test\DATA\";
    

    那么,您的命令应该不需要明确的 database.dbc 引用。打开时,应该会自动打开对应的数据库容器,以防可能附加任何此类触发器等。

    const string commandText = "INSERT INTO [address book!addresses] (addressid, firstname, lastname) VALUES (90, [Iam], [Error])";
    

    const string commandText = "INSERT INTO [addresses] (addressid, firstname, lastname) VALUES (90, [Iam], [Error])";
    

    所以,你拥有它的方式就像你试图做以下事情

    insert into D:\foxpro\test\DATA\addresses.dbf\address book!addresses
    

    【讨论】:

    • 我的应用程序是用 C# 编写的。我知道自动增量字段。这只是一个没有自动增量的示例表。在正在开发的实际解决方案中,我没有使用地址表。
    • @Grubl3r,您能否实际展示您在 C# 中的内容,以便更好地解决和模拟。我也使用 VFP 和 C#,可以尝试为您提供更接近可跟踪的错误..
    • 谢谢,我已将其附加到我的问题中。恐怕它是特定于站点的。顺便说一句,我尝试了另一种实际可行的途径。我自己建立了与 FoxPro 数据库的 OleDB 连接,并且我能够毫无问题地写入数据 - 甚至是包含超过 256 个字符和换行符的备忘录字段。
    • @Grubl3r,修改了我的答案,我认为这是一个简单的路径问题。
    • 非常感谢您的努力。不幸的是,我仍然遇到同样的问题.. 看来我必须让我的同事仔细查看数据服务,或者使用我自己的 OleDB 连接。
    【解决方案2】:

    您可以尝试构建一组 VFP 命令并使用 EXECSCRIPT。

    所以在 C# 中:

    var myCommand = @"try" + Environment.NewLine;
    myCommand    += @"  open database mydata" + Environment.NewLine;
    myCommand    += @"  update addresses set firstname='test' where addressid = 55' + Environment.NewLine;
    myCommand    += @"catch to loException" + Environment.NewLine;
    myCommand    += @"  set textmerge on noshow" + Environment.NewLine;
    myCommand    += @"  set textmerge to c:\temp\vfp.txt" + Environment.NewLine;
    myCommand    += @"  \<<loException.Message>>" + Environment.NewLine;
    myCommand    += @"  set textmerge off" + Environment.NewLine;
    myCommand    += @"  set textmerge to" + Environment.NewLine;
    myCommand    += @"finally" + Environment.NewLine;
    myCommand    += @"  close all" + Environment.NewLine;
    myCommand    += @"endtry" + Environment.NewLine;
    

    您可能需要在此处转义反斜杠。然后在 C# 中通过将 OleDB 命令设置为 myCommand 并使用 ExectuteNonQuery() 执行。

    说了这么多,当在 C# 中执行时,如果你包装在一个 try ... catch 中,并捕获一个 OleDbException 类型,那么该 InnerException 是否没有详细说明 VFP 端的问题是什么?

    【讨论】:

    • 谢谢,我会试试这个
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多