Могу ли я передать параметр OledbCommand другому OledbCommand? - PullRequest
1 голос
/ 01 июня 2019

Это может быть глупый вопрос, но мне нужно какое-то решение.
Я сделал как

cmd.CommandText = "Insert Table1(Col1,Col2,Col3,Date) Values (1,'aa',101,?)"
cmd.Connection = con2
cmd.Parameters.AddWithValue("@Date", transdate)
ExecuteQuery(con2,cmd)

Я написал ниже код, чтобы избежать написания Использование .. Конец использования везде.
Запрос работает нормально, если у него нет параметра.

Private Sub ExecuteQuery(con as OledbConnection,cmd as OledbCommand)
Using con1 As New OleDbConnection(con.ConnectionString)
    Using cmd1 As New OleDbCommand(cmd.CommandText)
        cmd1.Connection = con1
        con1.Open()
        cmd1.ExecuteNonQuery()
        con1.Close()
    End Using
End Using

Он отлично работает с параметрами, когда я пишу cmd под Using Block.
Но, как я уже сказал, я избегаю писать Using везде.
Но при этом происходит ошибка - Нет. Заданы значения для одного или нескольких обязательных параметров.

1 Ответ

1 голос
/ 01 июня 2019

Вам необходимо настроить свой ExecuteQuery, потому что он создает новую команду и теряет параметры. Измените его так, чтобы оно использовало существующую вами команду и удаляло ее, или перенесите параметры из входящей команды в новую

Private Sub ExecuteQuery(con as OledbConnection, cmd as OledbCommand)
  Using con1 As New OleDbConnection(con.ConnectionString)
    Try
        cmd.Connection = con1
        con1.Open()
        cmd.ExecuteNonQuery()
        con1.Close()
    Finally
        cmd.Dispose()
    End Try
  End Using 
End Sub

Private Sub ExecuteQuery(con as OledbConnection,cmd as OledbCommand)
  Using con1 As New OleDbConnection(con.ConnectionString)
    Using cmd1 As New OleDbCommand(cmd.CommandText)
        cmd1.Connection = con1
        ForEach p as Parameter in cmd.Parameters
          cmd1.Parameters.Add(p) 
        con1.Open()
        cmd1.ExecuteNonQuery()
        con1.Close()
    End Using
  End Using
End Sub

Если вы ищете способ облегчить вашу жизнь с БД, посмотрите Dapper или Entity Framework - вы работаете с объектами, он пишет все sql для вас. Это не прекращение контроля (вы все еще пишете запросы), это делегирование скучных аспектов выполнения вашего запроса, просмотра результатов, выкапывания каждого текста или целого числа и присвоения его имени или возрасту вашего пользовательского объекта.

Если вы попадаете в точку, где вы не хотите писать также SQL, используйте Entity Framework, поскольку он может автоматически конвертировать между вашими объектами и БД

...