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

时间:2017-04-11 06:57:04

标签: c# insert dbf oledbexception

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

我跑完之后得到:

  

未处理的类型' System.Data.OleDb.OleDbException'   发生在System.Data.dll

中      

附加信息:INSERT INTO语句中的语法错误。

当我尝试放置' '围绕我的 fullPath 变量,我得到了:

  

未处理的类型' System.Data.OleDb.OleDbException'   发生在System.Data.dll

中      

其他信息:查询中的语法错误。查询不完整   子句。

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;";
}

1 个答案:

答案 0 :(得分:1)

我无法找到有关DBF数据库系统保留关键字的精确文档,但“TIME”一词被怀疑是一个保留关键字。
如果是这样,那么您将收到带有SYNTAX ERROR的上述异常。

解决方案始终如一:

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

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

或者你可以简单地写

cmd.Parameters.Clear(); 

在循环内部,然后在每个循环中反复添加参数。