2013-10-06 51 views
0

這是場景,我有一個select查詢,然後所有提取的數據都必須插入到另一個表中。這就是我想到的,我不知道for循環是否執行了任何操作。插入多個數據mysql for循環使用

如果我將刪除for循環。 例子: 獲取的數據是ID1,ID2,ID3 我的數據庫中插入數據ID1,ID1,ID1,而不是ID1,ID2,ID3

sql = "SELECT * FROM dummy_violate WHERE res_month <> @month Or res_year <> @year" 
    cmd = New MySqlCommand(sql, con) 
    cmd.Parameters.AddWithValue("@month", DateTime.Now.ToString("MMMM")) 
    cmd.Parameters.AddWithValue("@year", DateTime.Now.ToString("yyyy")) 
    dr = cmd.ExecuteReader 
    While dr.Read 
     id += dr(0) 
     count += 1 
    End While 
    dr.Close() 
    If count > 0 Then 

     For i As Integer = 1 To count 
      sql2 = "INSERT INTO dummy_violate(res_id, res_month, res_year, is_paid)VALUES(@id,@month,@year,@paid)" 
      cmd = New MySqlCommand(sql2, con) 
      cmd.Parameters.AddWithValue("@id", id) 
      cmd.Parameters.AddWithValue("@month", DateTime.Now.ToString("MMMM")) 
      cmd.Parameters.AddWithValue("@year", DateTime.Now.ToString("yyyy")) 
      cmd.Parameters.AddWithValue("@paid", 0) 
      cmd.ExecuteNonQuery() 
     Next 
    ElseIf count = 0 Then 

     MsgBox("Wrong Query") 

    End If 
+0

我需要重命名我的問題中的標題和一些其他的東西,對不起回合。 – eaponz

+1

'另一張桌子'?它看起來同樣的桌子。 – dovid

+0

你有什麼意思?我的問題不是表格..問題是插入多個數據 – eaponz

回答

2

我真的不明白你正在嘗試做和爲什麼,似乎你只是複製已經存在於你的表中的記錄與新的記錄相同的數據,但is_paid標誌設置爲零。如果是的話只是試圖以這種方式改變你的代碼:

sql = "SELECT res_id FROM dummy_violate WHERE res_month <> @month Or res_year <> @year" 
cmd = New MySqlCommand(sql, con) 
cmd.Parameters.AddWithValue("@month", DateTime.Now.ToString("MMMM")) 
cmd.Parameters.AddWithValue("@year", DateTime.Now.ToString("yyyy")) 
Dim da = new MySqlDataAdapter(cmd) 
Dim dt = new DataTable() 
da.Fill(dt) 

' if we have records to duplicate we have Rows.Count > 0 
If dt.Rows.Count > 0 Then 
    sql2 = "INSERT INTO dummy_violate(res_id, res_month, res_year, is_paid) " & _ 
      "VALUES(@id,@month,@year,@paid)" 
    cmd = New MySqlCommand(sql2, con) 

    ' Add all the parameters before entering the loop. Just @id changes for every loop, 
    ' so we set it with a dummy value outside the loop and we change it when looping over 
    ' the result table..... 
    cmd.Parameters.AddWithValue("@id", 0) 
    cmd.Parameters.AddWithValue("@month", DateTime.Now.ToString("MMMM")) 
    cmd.Parameters.AddWithValue("@year", DateTime.Now.ToString("yyyy")) 
    cmd.Parameters.AddWithValue("@paid", 0) 

    ' execute the insert for all the rows count 
    ' rows array starts at zero so loop to count -1 
    For i As Integer = 0 To dt.Rows.Count - 1 
     cmd.Parameters("@id").Value = dt.Rows(i)("res_id") 
     cmd.ExecuteNonQuery() 
    Next 
ElseIf count = 0 Then 
    MsgBox("Wrong Query") 
End If 

請記住,如果RES_ID是一個主鍵,那麼你不能用相同的RES_ID插入記錄的兩倍。另外,如果res_id是auto_number列(a.k.a.IDENTITY),那麼你不能明確地設置它的值

+0

謝謝..代碼工程..但如何做到這一點,如果數據存在它不會再插入.. – eaponz

+0

這是一個更復雜。如果使用res_id,res_month和res_year設置主鍵,則插入將失敗,您需要捕獲異常。相反,如果你想在插入之前檢查,你需要另一個查詢來檢查三個值的存在以避免重複。第二種方法可能是最好的,但更復雜。請嘗試添加一個新問題,以便其他人可以看到它並提供幫助 – Steve

相關問題