如何插入到已经存在的 DBF 文件中?

How to insert into already existing DBF file?

我在将命令插入现有 DBF 文件时遇到问题。 我的变量 fullPath = "C:\Kasa_NMP\MAT_DAY.dbf"...

在我 运行 之后我得到:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Syntax error in INSERT INTO statement.

当我尝试将“ ”放在 fullPath 变量周围时,我得到:

An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Syntax error in query. Incomplete query clause.

public static void DataTableToDBF(string filePath, string fileName, DataTable dataTable)
{
    string fullPath = filePath + fileName + ".dbf";

        using (OleDbConnection con = new OleDbConnection(GetConnection(filePath)))
        {
            con.Open();
            OleDbCommand cmd = new OleDbCommand();
            cmd.Connection = con;

            foreach (DataRow row in dataTable.Rows) // Insert redaka u DBF file
            {
                string insertCommand = "INSERT INTO " + fullPath + "(datum1, faktura, sifra_dob, sifra, naziv_art, ulaz, izlaz," + 
                    " jed_cijena, duguje, potrazuje, tarifa, rabat, n, pla, op, nab_cijena, porez_pr, sif_kup, time)" +
                " VALUES(@datum, @faktura, @sifra_dob, @sifra, @naziv_art, @ulaz, @izlaz, @jed_cijena, @duguje, @potrazuje," + 
                " @tarifa, @rabat, @n, @pla, @op, @nab_cijena, @porez_pr, @sif_kup, @time)";

                cmd.Parameters.AddWithValue("@datum", DateTime.Parse(row["Datum_k"].ToString()).ToShortDateString());
                cmd.Parameters.AddWithValue("@faktura", row["Dokument"]);
                cmd.Parameters.AddWithValue("@sifra_dob", row["BarKod"]);
                cmd.Parameters.AddWithValue("@sifra", row["Sifra"]);
                cmd.Parameters.AddWithValue("@naziv_art", row["NazivArtikla"]);
                cmd.Parameters.AddWithValue("@ulaz", row["Ulaz"]);
                cmd.Parameters.AddWithValue("@izlaz", row["Izlaz"]);
                cmd.Parameters.AddWithValue("@jed_cijena", row["Cijena"]);
                cmd.Parameters.AddWithValue("@duguje", row["Duguje"]);
                cmd.Parameters.AddWithValue("@potrazuje", row["Potrazuje"]);
                cmd.Parameters.AddWithValue("@tarifa", row["Tarifa"]);
                cmd.Parameters.AddWithValue("@rabat", row["Rabat"]);
                cmd.Parameters.AddWithValue("@n", 0);
                cmd.Parameters.AddWithValue("@pla", row["Placanje"]);
                cmd.Parameters.AddWithValue("@op", row["Operator"]);
                cmd.Parameters.AddWithValue("@nab_cijena", row["NabavnaCijena"]);
                cmd.Parameters.AddWithValue("@porez_pr", row["Porez"]);
                cmd.Parameters.AddWithValue("@sif_kup", row["SifraKomitenta"]);
                cmd.Parameters.AddWithValue("@time", row["Vrijeme"]);

                cmd.CommandText = insertCommand;
                cmd.ExecuteNonQuery();
            }
            con.Close();
    }
}

private static string GetConnection(string path)
{
    return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=dBASE IV;";
}

我找不到关于 DBF 数据库系统保留关键字的准确文档,但高度怀疑 TIME 一词是保留关键字。
如果这是真的,那么您将收到上述带有语法错误的异常。

解决方案总是一样的:

  • A) 尝试为该列使用不同的名称。
  • B) 如果 A 不可能,则将 TIME 括在方括号内 作为 ..., sif_kup, [time])"

但是您的代码中还有其他问题。您正在循环内添加参数。这意味着在第二个循环中你已经加倍了参数集合,但更糟糕的是这些参数的位置。因为 OleDb 根据参数在集合中的位置识别参数,所以您将在每个循环中结束时写入相同的值,而忽略其他参数。
在这种情况下,我会设置命令文本并在循环外创建参数,将它们留空。在循环中,我会在执行查询之前更改它们的值。

或者你可以简单地写

cmd.Parameters.Clear(); 

在每次循环中反复添加参数之前在循环内部。