如何插入到已经存在的 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();
在每次循环中反复添加参数之前在循环内部。
我在将命令插入现有 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();
在每次循环中反复添加参数之前在循环内部。