SQLite INSERT语句
问题描述:
我已经创建了以下插入方法,它工作得很好,但我知道它可能更有效。有人能告诉我如何将这种方法转换为使用参数和/或提高其效率?SQLite INSERT语句
public static void SQLiteTableINSERT(string tableName)
{
int colCount = 0;
using (SQLiteConnection Conn = new SQLiteConnection(SQLiteConn.Conn))
{
using (SQLiteTransaction sqliteTrans = Conn.BeginTransaction())
{
using (SQLiteCommand cmd = Conn.CreateCommand())
{
DataTableColumnNames();
string query = "INSERT INTO " + tableName + "(";
foreach (string name in DtColumns)
{
query += "[" + name + "]";
++colCount;
if (colCount < DtColumns.Count())
query += ",";
}
query += ")";
query += " VALUES(";
for (int i = 0; i < LocalDataSet.LocalDs.Tables[0].Rows.Count; ++i)
{
cmd.CommandText = query;
foreach (DataColumn col in LocalDataSet.LocalDs.Tables[0].Columns)
{
string temp = LocalDataSet.LocalDs.Tables[0].Rows[i][col, DataRowVersion.Current].ToString();
if (temp == "True")
cmd.CommandText += 1;
else if (temp == "")
cmd.CommandText += 0;
if (temp != "True" && temp != "")
cmd.CommandText += "'" +temp + "'";
cmd.CommandText += ",";
}
cmd.CommandText = cmd.CommandText.Remove(cmd.CommandText.LastIndexOf(","));
cmd.CommandText += ")";
cmd.ExecuteNonQuery();
}
}
sqliteTrans.Commit();
}
}
}
答
您确实应该将其切换为使用预准备语句,然后将数据绑定到该预准备语句中的参数。一些基本的内容在这里解释了C/C++:
http://www.sqlite.org/cintro.html
我怀疑你正在使用dotConnect所以你可能要参考本为您具体的例子:
http://www.devart.com/dotconnect/sqlite/docs/Parameters.html
同样的原理适用。您将SQL编写为一个易于在源代码中阅读,查看和修改的单个字符串常量。然后,将该SQL命令与一组数据元素一起发送到SQLite,以替换每个参数。此技术使您的代码更清晰,并有助于避免SQL注入攻击或混淆。
所以我改变了我的代码,在插入语句的VALUES部分插入(?)的位置,我试图更新我的代码以使用参数,但我不断收到异常: “提供的参数不足到命令“ 我看了我的代码,一切似乎是正确的,任何人都可以看到这个问题吗? 我打算在答案中发布代码。 谢谢! – Nathan
这听起来像你会得到的错误,如果你不提供每个数据项?例如,如果你有三个?但只传递两个参数。在C/C++中,它可能与空字符串参数有关,甚至是类型不匹配。 –