Что можно написать взамен Oledb.parameters.AddwithValue (), чтобы добавить параметр в команду? - PullRequest
0 голосов
/ 28 мая 2019

Мне сказали, что cmd.Parameters.AddWithValue нехорошо, и вместо этого мы должны написать cmd.Parameters.Add.
Некоторые ссылки ссылаются на меня: Ссылка 1 и Ссылка 2 .
Я сослался на ссылку, но ссылка дала примеры с SQL Connection. Я использую Oledb Connection везде. И .Add не работает должным образом с Oledb Connection.
При копании на переполнении стека и других сайтах я обнаружил, что почти все используют .AddWithValue.
Некоторые использовали .Add, и я попробовал их метод и получил ошибку типа «Должен объявить скалярную переменную.» .
Повторный поиск ошибки дает результат использования .AddWithValue

В настоящее время я использую такие параметры, как этот

 cmd = New OleDbCommand("INSERT INTO TABLE (Col1,Col2,Col3) 
                         VALUES('" & ColVal1 & "','" & ColVal2 & "',?)", con1)
                                'With cmd.Parameters
                                '    .Add(New OleDbParameter("@Trans_Date", TransDate))
                                '    '.Add(New OleDbParameter("@Password", txtPassword.Text))
                                'End With
                                cmd.Parameters.AddWithValue("@Col3", OleDbType.Date).Value = TransDate

И у меня это прекрасно работает. Так что я должен использовать и как?

1 Ответ

0 голосов
/ 28 мая 2019

Этот код неправильный. Когда вы вызываете AddWithValue, вторым аргументом является значение, и тип данных определяется из этого. Если бы вы собирались позвонить AddWithValue, это выглядело бы так:

cmd.Parameters.AddWithValue("@Col3", TransDate)

Причина, по которой вы должны вызывать Add, заключается в том, что может случиться так, что выведенный тип данных не будет соответствовать тому, что фактически требуется базе данных, и это может вызвать проблемы в некоторых случаях. Ваш код - правильный шаблон, но он должен вызывать Add, а не AddWithValue:

cmd.Parameters.Add("@Col3", OleDbType.Date).Value = TransDate

Как таковой, вы создаете параметр со значением OleDbType.Date и типом данных, выведенным из него, затем вы явно устанавливаете Value в TransDate. Это неправильно.

Кроме того, весь смысл использования параметров состоит в том, чтобы избежать проблем, которые могут возникнуть при конкатенации строк, и вы все равно используете конкатенацию строк. Не надо! Используйте параметр КАЖДЫЙ раз:

cmd = New OleDbCommand("INSERT INTO MyTable (Col1, Col2, Col3) VALUES (@Col1, @Col2, @Col3)", con1)

With cmd.Parameters
    .Parameters.Add("@Col1", OleDbType.VarChar).Value = ColVal1
    .Parameters.Add("@Col2", OleDbType.VarChar).Value = ColVal2
    .Parameters.Add("@Col3", OleDbType.Date).Value = TransDate
End With
...