INSERT INTO 语句包含以下未知字段名称:'NoName'

The INSERT INTO statement contains the following unknown field name: 'NoName'

INSERT INTO 语句包含以下未知字段名称:

'NoName'. Make sure you have typed the name correctly, and try the operation again.

这是我尝试从我正在处理的 .Net 应用程序中将记录插入 dbase 文件 (.dbf) 时抛出的错误。

我这样使用 Oledb 连接:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\David\Desktop\Dbase_Files;Extended Properties=dBASE IV;User ID=Admin;Password=");

我在选择的时候遇到了类似的问题。某些列返回为“NoName”,但仍包含数据。我只是使用列索引号代替列名。

现在要插入,已经是块了。说出同样的错误(当你没有列出列名时):

INSERT INTO [tablename.dbf] VALUES (?, ?, ?);

完整代码示例如下:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\David\Desktop\Dbase_Files;Extended Properties=dBASE IV;User ID=Admin;Password=");

connection.Open();

OleDbTransaction trans = connection.BeginTransaction();
OleDbCommand command = new OleDbCommand(@"INSERT INTO [tablename.DBF] 
                                        VALUES
                                        (
                                        ?, ?, ?
                                        );", connection, trans);

command.Parameters.AddWithValue("param1", 7);
command.Parameters.AddWithValue("param2", "RCN");
command.Parameters.AddWithValue("param3", 0);

try
{
    command.ExecuteNonQuery();
    trans.Commit();
}
catch (Exception e)
{
    trans.Rollback();
    throw e;
}
finally
{
    connection.Close();
}

我在 Ms Access 看到论坛对此进行了讨论。但到目前为止 dbase 上没有太多内容。一直认为这是 driver 事情。

dbase 文件由 dbase plus (2007) 应用程序创建。

不要将问号与命名参数结合使用,即使是 @param1 等。如果要在此 table 中插入三个值,则在命令文本中命名参数:

OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\David\Desktop\Dbase_Files;Extended Properties=dBASE IV;User ID=Admin;Password=");

connection.Open();

OleDbTransaction trans = connection.BeginTransaction();
OleDbCommand command = new OleDbCommand(@"INSERT INTO [tablename.DBF] 
                                        VALUES
                                        (
                                        @param1, @param2, @param3
                                        );", connection, trans);

command.Parameters.AddWithValue("param1", 7);
command.Parameters.AddWithValue("param2", "RCN");
command.Parameters.AddWithValue("param3", 0);

try
{
    command.ExecuteNonQuery();
    trans.Commit();
}
catch (Exception e)
{
    trans.Rollback();
    throw e;
}
finally
{
    connection.Close();
}

您非常接近,但您可能失败的是告诉您要插入哪些列的值。是的,OleDB 使用“?”作为参数的占位符,它们必须匹配相同的顺序作为它们相应需要的 SQL select、insert、update 或 delete。在 "Values" 子句之前添加显式列。

OleDbCommand command = new OleDbCommand(
   @"INSERT INTO [tablename.DBF] ( tblColumn1, tblColumn2, tblColumn3 )
        VALUES  ( ?, ?, ? )", connection, trans);

THEN add your parameters in the specific order to match the command.

不需要命令语句中的半结束符,因为无论如何您只有一个插入命令。

您自己对参数的实际命名没有问题,但参数的顺序与“?”特别相关。插入语句中的占位符。

我查了半天才发现,字段名超过8、9个字符的表都会出现这种情况。当其长度为 10 个或更多字符时,字段名称 returns 'NoName'。 听起来很可笑。 当我缩短字段名称时,效果很好。

我对此有了一些了解here

现在调整了字段名后,我上面的示例代码就可以完美运行了。