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

时间:2015-04-13 22:10:49

标签: c# sql jet dbase

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

  

' NoName&#39 ;.确保您已正确输入名称,然后尝试   再次运作。

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

我使用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)应用程序创建。

3 个答案:

答案 0 :(得分:0)

不要将问号与命名参数结合使用,甚至@param1等。如果您要在此表中插入三个值,请在命令文本中命名参数:

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();
}

答案 1 :(得分:0)

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

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.

不需要在命令语句中关闭半部分,因为无论如何只有一个插入命令。

您所拥有的参数的实际命名可以自行澄清,但参数的顺序与"?"插入声明中的占位符。

答案 2 :(得分:0)

经过很长一段时间后,我发现这发生在字段名长度超过8或9个字符的表中。当其长度超过10个字符时,字段名称将返回“NoName'”。 这听起来很荒谬。 当我把字段名称缩短时,这很好。

我对此here

有所了解

现在调整了字段名,我上面的示例代码完美无缺。