2009-10-17 45 views
2

我已经创建了以下插入方法,它工作得很好,但我知道它可能更有效。有人能告诉我如何将这种方法转换为使用参数和/或提高其效率?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(); 
     } 

    } 
} 

回答

2

您确实应该将其切换为使用预准备语句,然后将数据绑定到该预准备语句中的参数。一些基本的内容在这里解释了C/C++:

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

我怀疑你正在使用dotConnect所以你可能要参考本为您具体的例子:

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

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

+0

所以我改变了我的代码,在插入语句的VALUES部分插入(?)的位置,我试图更新我的代码以使用参数,但我不断收到异常: “提供的参数不足到命令“ 我看了我的代码,一切似乎是正确的,任何人都可以看到这个问题吗? 我打算在答案中发布代码。 谢谢! – Nathan

+0

这听起来像你会得到的错误,如果你不提供每个数据项?例如,如果你有三个?但只传递两个参数。在C/C++中,它可能与空字符串参数有关,甚至是类型不匹配。 –