вставить несколько данных mysql, используя цикл for

Это сценарий, у меня есть запрос на выборку, тогда все извлеченные данные должны быть вставлены в другую таблицу. Это то, что я придумал, я не знаю, делает ли что-нибудь цикл 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

person eaponz    schedule 06.10.2013    source источник
comment
Мне нужно было переименовать заголовок и некоторые другие вещи в моей проблеме, извините за это.   -  person eaponz    schedule 06.10.2013
comment
"другой стол"? Это похоже на ту же таблицу.   -  person dovid    schedule 06.10.2013
comment
Какова твоя точка зрения? моя проблема не в таблице.. проблема в том, чтобы вставить несколько данных   -  person eaponz    schedule 06.10.2013
comment
Если идентификатор является первичным ключом вашей таблицы, вы не можете вставить несколько записей с одним и тем же идентификатором. Является ли идентификатор вашим первичным ключом для таблицы dummy_violate?   -  person Steve    schedule 06.10.2013
comment
нет, мой dummy_violate не содержит первичного ключа..   -  person eaponz    schedule 06.10.2013


Ответы (1)


Я не очень понимаю, что вы пытаетесь сделать и почему, похоже, вы просто дублируете записи, уже имеющиеся в вашей таблице, новыми записями с теми же данными, но с установленным в ноль флагом 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 (также известным как IDENTITY), вы не можете явно установить его значение.

person Steve    schedule 06.10.2013
comment
Спасибо .. Код работает .. но как это сделать, если данные существуют, они больше не будут вставляться .. - person eaponz; 06.10.2013
comment
Это намного сложнее. Если вы установите первичный ключ с res_id, res_month и res_year, вставка завершится ошибкой, и вам нужно перехватить исключение. Вместо этого, если вы хотите проверить перед вставкой, вам нужен другой запрос, который проверяет наличие трех значений, чтобы избежать дублирования. Этот второй подход, вероятно, лучший, но более сложный. Пожалуйста, попробуйте добавить новый вопрос, чтобы другие люди могли его увидеть и помочь - person Steve; 06.10.2013