【问题标题】:SQLite INSERT StatementSQLite 插入语句
【发布时间】:2009-10-17 19:44:46
【问题描述】:

我创建了以下插入方法,该方法运行良好,但我知道它可能更有效。有人可以告诉我如何将此方法转换为使用参数和/或提高其效率吗?

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# sqlite insert


    【解决方案1】:

    您确实应该将此切换为使用准备好的语句,然后将数据绑定到该准备好的语句中的参数。这里解释了 C/C++ 的基础知识:

    http://www.sqlite.org/cintro.html

    我怀疑您正在使用 dotConnect,因此您可能希望参考此内容作为您的具体示例:

    http://www.devart.com/dotconnect/sqlite/docs/Parameters.html

    同样的原则也适用。您将 SQL 编写为一个易于在源代码中阅读、查看和修改的字符串常量。然后将该 SQL 命令连同一组数据元素一起发送到 SQLite,以替换每个参数。这种技术使您的代码更清晰,并有助于避免 SQL 注入攻击或混淆。

    【讨论】:

    • 所以我将代码更改为在插入语句的 VALUES 部分中插入 (?) 的位置,并尝试更新代码以使用参数,但我不断收到异常: “提供给命令的参数不足”我查看了我的代码,一切似乎都是正确的,有人能看出这有什么问题吗?我将在答案中发布代码。谢谢!
    • 这听起来像是如果您不为每个 ? 提供一个数据项会出现的错误。例如,如果你有三个?但只传递两个参数。在 C/C++ 中,它可能与空字符串参数有关,甚至与类型不匹配有关。
    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多