2009-10-17 48 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++中,它可能與空字符串參數有關,甚至是類型不匹配。 –