2013-04-22 15 views
0

我已經建立了一個圍繞System.Data.SQLite的包裝方法,它允許我執行參數化查詢。列表<T[]> .Add()創建重複c#

當我嘗試添加SQLiteParameter []在列表中。新增(),列表中的所有項目成爲最後一個加入該項目的副本..

下面是代碼:

string sql = "INSERT INTO request_flow (request_id, sequence, date_assigned " + 
      "VALUES (@request_id, @sequence, @date_assigned);"; 

List<SQLiteParameter[]> paramList = new List<SQLiteParameter[]>(); 

SQLiteParameter[] param = new SQLiteParameter[3]; 

SQLiteParameter p1 = new SQLiteParameter("request_id", DbType.Int32); 
SQLiteParameter p2 = new SQLiteParameter("sequence", DbType.Double); 
SQLiteParameter p3 = new SQLiteParameter("date_assigned", DbType.String); 

for (int i = 0; i < assigneeIDs.Count; i++) 
{ 
    p1.Value = requestID; 
    p2.Value = Convert.ToDouble(last_seq + "." + (i + 1)); 
    p3.Value = DateTime.Now.ToString(ThisAddIn.FullDate); 

    param[0] = p1; 
    param[1] = p2; 
    param[2] = p3; 

    paramList.Add(param); 
} 

int inserted = SQLite.ExecuteParams(sql, paramList); 

我在每個循環之後都放了一個小心點以進行調試,並且我確認了第一次迭代後的值與預期相符。但是,在下一次迭代中,第一項(在索引0處)會被第二次迭代的值以某種方式覆蓋。所以添加的最後一項總是會覆蓋列表中的每個前一個項目。

我做錯了什麼?

編輯:下面是一個簡單(較小的依賴性要求)的樣品具有相同行爲的代碼:

List<string[]> paramList = new List<string[]>(); 

string[] param = new string[3]; 

string p1 = ""; 
string p2 = ""; 
string p3 = ""; 

for (int i = 0; i < 3; i++) 
{ 
    p1 = i.ToString() + ".1"; 
    p2 = i.ToString() + ".2"; 
    p3 = i.ToString() + ".3"; 

    param[0] = p1; 
    param[1] = p2; 
    param[2] = p3; 

    paramList.Add(param); 
} 

foreach (string[] s in paramList) 
{ 
    this.textBox1.Text += String.Join(",", s) + "\r\n"; 
} 

回答

3

你沒有建立在每個迭代一個新的參數數組,也不是你創建新每次迭代的參數,你只是一遍又一遍地重複相同的參數。您需要確保在循環的每次迭代中都創建一個新數組,併爲循環的每次迭代創建新參數。在這種情況下,你不應該在循環之外定義這些變量;將它們定義在循環內部:

for (int i = 0; i < assigneeIDs.Count; i++) 
{ 
    SQLiteParameter[] param = new SQLiteParameter[3]; 

    SQLiteParameter p1 = new SQLiteParameter("request_id", DbType.Int32); 
    SQLiteParameter p2 = new SQLiteParameter("sequence", DbType.Double); 
    SQLiteParameter p3 = new SQLiteParameter("date_assigned", DbType.String); 

    p1.Value = requestID; 
    p2.Value = Convert.ToDouble(last_seq + "." + (i + 1)); 
    p3.Value = DateTime.Now.ToString(ThisAddIn.FullDate); 

    param[0] = p1; 
    param[1] = p2; 
    param[2] = p3; 

    paramList.Add(param); 
} 
+0

啊哈!謝謝,那有效。我已經習慣了PHP,我將在上面的代碼中使用它。 – Saleh 2013-04-22 21:00:33

0

我認爲這是因爲您在「參數」的同一個實例中工作而發生的。 嘗試在你的循環中實例化它。