使用for循环插入多个数据mysql

使用for循环插入多个数据mysql,mysql,vb.net,winforms,Mysql,Vb.net,Winforms,这是一个场景,我有一个select查询,然后所有获取的数据都必须插入到另一个表中。。这就是我想到的,我不知道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

这是一个场景,我有一个select查询,然后所有获取的数据都必须插入到另一个表中。。这就是我想到的,我不知道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
sql=“从虚拟对象中选择*,其中res\u month@month或res\u year@year”
cmd=新的MySqlCommand(sql,con)
cmd.Parameters.AddWithValue(“@month”,DateTime.Now.ToString(“MMMM”))
cmd.Parameters.AddWithValue(“@year”,DateTime.Now.ToString(“yyyy”))
dr=cmd.ExecuteReader
当雷德博士
id+=dr(0)
计数+=1
结束时
克洛斯博士()
如果计数>0,则
对于i作为整数=1进行计数
sql2=“插入伪(res_id、res_month、res_year、is_paid)值(@id、@month、@year、@paid)”
cmd=新的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()
下一个
ElseIf count=0,则
MsgBox(“错误查询”)
如果结束

我真的不明白您想做什么以及为什么,似乎您只是在复制表中已经存在的记录,新记录具有相同的数据,但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
sql=“在res\u month@month或res\u year@year的虚拟对象中选择res\u id”
cmd=新的MySqlCommand(sql,con)
cmd.Parameters.AddWithValue(“@month”,DateTime.Now.ToString(“MMMM”))
cmd.Parameters.AddWithValue(“@year”,DateTime.Now.ToString(“yyyy”))
Dim da=新的MySqlDataAdapter(cmd)
Dim dt=新数据表()
da.填充(dt)
'如果有记录要复制,则有行。计数>0
如果dt.Rows.Count>0,则
sql2=“插入虚拟(资源id、资源月、资源年、已支付)”和
“值(@id、@month、@year、@paid)”
cmd=新的MySqlCommand(sql2,con)
'在进入循环之前添加所有参数。只是每个循环的@id都会改变,
'因此,我们在循环外设置一个虚拟值,并在循环时更改它
“结果表…”。。。。。
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)
'为所有行计数执行插入
'行数组从零开始,因此循环计数-1
对于i,整数=0到dt.Rows.Count-1
cmd.Parameters(“@id”).Value=dt.Rows(i)(“res_id”)
cmd.ExecuteNonQuery()
下一个
ElseIf count=0,则
MsgBox(“错误查询”)
如果结束

请记住,如果resu id是主键,则不能将具有相同resu id的记录插入两次。另外,如果res_id是一个自动编号列(也称为IDENTITY),那么您不能明确地设置它的值

我需要重命名标题和我的问题中的一些其他内容,很抱歉,‘另一个表’?它看起来是同一张桌子。你的观点是什么?我的问题不在桌子上。。问题是插入多个数据如果ID是表的主键,则无法插入具有相同ID的多条记录。表的主键是否为ID
dummy\u increal
?不,我的dummy\u increal不包含主键..谢谢。。代码起作用。。但是,如果数据存在,它就不会再插入了。这要复杂得多。如果使用resu id、resu month和resu year设置主键,则插入将失败,您需要捕获异常。相反,如果要在插入之前进行检查,则需要另一个查询来检查这三个值是否存在,以避免重复。第二种方法可能是最好的,但更复杂。请尝试添加一个新问题,以便其他人可以看到它并提供帮助