2017-02-13 3 views
1

У меня есть следующий код для вставки данных в таблицу с помощью запроса MySQL в VB.NETпереосмысление/Re-настройки параметров в запросе MySQL

Dim MySqlCmdStr = "INSERT INTO tb_idlink(id1,id2) " & 
    "VALUES (@par1,@par2)" 
MySqlCmd.CommandText = MySqlCmdStr 
Dim checkedItem As Object 
For Each checkedItem In CheckedListBox_1.CheckedItems 
    Try 
     MySqlCmd.Connection = MySqlConn 
     With MySqlCmd 
      .Parameters.AddWithValue("@par1", currentID) 
      .Parameters.AddWithValue("@par2", checkedItem.ToString()) 
     End With 

     MySqlConn.Open() 

     MySqlCmd.ExecuteNonQuery() 
     MySqlConn.Close() 
    Catch ex As MySqlException 
     MessageBox.Show(ex.Message) 
    End Try 
Next 

Моя проблема в том, если у меня есть более чем один ящик проверено в CheckedListBox_1, а затем во втором цикле исключение, которое говорит что-то вроде «параметр @ par1 уже определен». Есть ли способ переопределить его? Я не совсем знаком со всем API.

Кроме того, я не уверен на 100%, если петля это лучший способ сделать это, но это первое, что появилось в моей голове. Не стесняйтесь предлагать альтернативный способ сделать это.

+0

Создайте свой cmd вне цикла, используя метод add, а не метод addwithvalue. Затем в цикле используйте значение .Value (Name) =. Также не открывайте и не закрывайте соединение в каждом цикле. ДЕЛАТЬ, что вокруг петли –

+0

Спасибо за совет! – robotHamster

ответ

2

Вы не переопределять параметры, вы просто поставить новое значение:

Dim SQL = "INSERT INTO tb_idlink (id1,id2) VALUES (@par1,@par2)" 

Using dbcon As New MySqlConnection(MySQLConnStr) 
    Using cmd As New MySqlCommand(SQL, dbcon) 

     ' define the parameter names and types 
     cmd.Parameters.Add("@par1", MySqlDbType.Int32) 
     cmd.Parameters.Add("@par2", MySqlDbType.Int32) ' ???? 

     dbcon.Open() 
     For Each checkedItem In CheckedListBox1.CheckedItems 
      ' provide the parameter values 
      cmd.Parameters("@par1").Value = currentID 
      cmd.Parameters("@par2").Value = Convert.ToInt32(checkedItem) 
      cmd.ExecuteNonQuery() 
     Next 
    End Using 
End Using 
  • Ваш код появляется повторно глобальное соединение, которое опрометчиво. Выше использует Using блоки для создания, использования и и распоряжаться DbConnection и DbCommand объектов в наименьшем объеме возможного
  • Вы должны благоприятствовать Add, а не AddWithValue так что вы можете указать тип данных, а не заставляя БД поставщика догадку и уменьшить вероятность ошибок несоответствия типа данных.
  • Эти типы данных являются предположениями; CurrentId нигде не определяется и задается имена, оба кажутся целыми, а не строками.
+0

Типы данных в БД являются целыми числами, поэтому вы правы там, теперь я буду одобрять Add over AddWithValue. Один вопрос, так что я ясно понимаю это. Я исправил проблему, возникшую ранее, с помощью 'cmd.Parameters.Clear()' в начале каждого цикла. Разве это не хорошая практика? @Plutonix – robotHamster

+0

Использование clear: Это зависит от того, что делает код. Это не плохая идея, но иногда один или два фиксируются, то есть не меняются за цикл, поэтому вам нужно будет снова восстановить их каждый цикл, но это довольно тривиально. –

+1

@sharifanani Почему ясно и воссоздать одни и те же параметры снова и снова, когда все, что вам действительно нужно, - это поставить новое значение? 'Clear()' будет работать, но будет overkill – Plutonix