【问题标题】:In C# Creating DBF Using OLEDB for dBASE IV Crashes在 C# 中使用 OLEDB 为 dBASE IV 崩溃创建 DBF
【发布时间】:2016-02-18 06:37:07
【问题描述】:

我的代码在下面,每当​​我为此运行单元测试(或实际应用程序)时,它都会停止执行测试(尽管下面的代码包含在 try catch 和 catch 中的断点中)。

生成的文件有一个严重性和消息字段,但没有其他字段。我看到它间歇性地运行,但是,我似乎无法让它再次运行。

//DBF Create Table
var currentLogTime = DateTime.UtcNow.ToString("yyMMddHH");
protected const string FORMAT_CONNECTION_STRING = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV";
var connectionString = String.Format(FORMAT_CONNECTION_STRING, DBFPath);
Connection = new OleDbConnection(connectionString);
Connection.Open();
using (var command = Connection.CreateCommand())
{
    command.CommandText =
        String.Format(
            "CREATE TABLE {0} ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50))",
            currentLogTime);
    try
    {
        command.ExecuteNonQuery();
    }
    catch(Exception ex)
    {

    }
}

【问题讨论】:

  • 好吧,您遇到了什么样的错误。您在command.ExecuteNonQuery 周围的try{}catch{} 代码在哪里,您是否尝试将using (var command = Connection.CreateCommand(sqlCmd, conn)) 替换为using (var command = new OleDbCommand()) 设置command.CommandType = CommandType.Text; 您是否也使用调试器单步执行代码..?还有你为什么不创建一个更有意义的表名,而不是基于一些格式化的 utc 日期值..
  • 使用using (var command = new OleDbCommand()) 没有区别。是的,我已经尝试过它,每次它点击command.ExecuteNonQuery();时,visual studio都会停止调试(在我的电脑上以及我办公室的其他人上)。我对包含在其中的较大代码块进行了尝试捕获...其中的捕获永远不会被绊倒。当我 F10 (越过)command.ExecuteNonQuery();它每次都崩溃并停止调试。至于表名,我已将其设置为固定的,没有区别。
  • 它只用我的几列创建一个 DBF 文件 路径是正确的,它实际上是在创建一个包含 SEVERITY 和 MESSAGE 的 DBF 文件。为什么 Visual Studio 崩溃而不是调试。为什么不创建额外的 2 个 STACKTRACE 和 OCCURRED 字段?我已经更改了列名,这似乎没有任何改变。我已经更改了连接/命令样式...没有区别。
  • 更新了问题以反映最近的变化。没有不同。仍然只创建具有前 2 个字段的 DBF,并且 Visual Studio 在跨过 command.ExecuteNonQuery() 时停止调试。
  • 您是否尝试为您的数字和字符字段指定字段宽度

标签: c# oledb dbf dbase


【解决方案1】:

这可能是因为您正在创建一个仅基于日期数字的表格。您无法创建一个可能看起来像 16021715 的表,例如“yyMMddHH”。尝试使用您的日志前缀创建您的表,例如...

String.Format("CREATE TABLE Log{0} (etc.....", parm);

所以表名实际上会变成“Log16021715”并且是一个有效的表名。

【讨论】:

  • 将名称更改为:CREATE TABLE L16021721 ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50)) 没有任何区别。问题是一样的。
  • 这应该对你有用..你为什么不尝试不使用 string.Format 函数这应该工作CREATE TABLE L16021721 ([SEVERITY] NUMERIC, [MESSAGE] MEMO, [STACKTRACE] MEMO, [OCCURRED] CHAR(50))
  • 刚要过来说Message是DBase中的保留关键字根据this
  • 没有区别。相同的“停止调试”并且 DBF 中只有 2 列。
  • @VulgarBinary,让我问你这个......它必须是 dBASE IV 吗?如果没有,我会强烈考虑使用 Microsoft Visual Foxpro OleDB Adapter 而不是 jet。 microsoft.com/en-us/download/details.aspx?id=14839 和 Visual Foxpro 不是 Access,而是 .DBF,
【解决方案2】:

VisualFoxPro CreateTable

var currentLogTime = DateTime.UtcNow.ToString("yyMMddHH");
protected const string FORMAT_CONNECTION_STRING = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV";

var connectionString = String.Format(FORMAT_CONNECTION_STRING, DBFPath);
Source="yourFilePathToSourceFile";Extended Properties=dBase IV";
using (OleDbConnection connection = new OleDbConnection(connectionString))
using (OleDbCommand command = connection.CreateCommand())
{
    connection.Open();
    command.CommandText = String.Format("CREATE TABLE {0} (SEVERITY I, MESSAGE M, STACKTRACE M, OCCURRED C(50) NOCPTRANS"
    command.ExecuteNonQuery();
}

【讨论】:

  • 这是 dBASE IV,不是访问权限。
【解决方案3】:

OleDB 驱动程序在为 MEMO 字段创建 DBT 文件时似乎遇到了最大路径长度问题。缩短路径可以解决问题。

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    相关资源
    最近更新 更多