Как вставить несколько строк одновременно из vb.net или С# в SQL Server?

У меня есть объект списка типа моего класса (сотрудник), и он имеет около 3 элементов.

Скажем, например:

empObj.Id = 3, empObj.Name = abc, emp.Value = Yes
empObj.Id = 4, empObj.Name = xyz, emp.Value = No
empObj.Id = 5, empObj.Name = pqr, emp.Value = Yes

Теперь я хочу вставить все элементы в виде отдельных строк в свою БД с помощью хранимой процедуры.

Я не хочу попадать в БД для каждого элемента.

Моим входным параметром для SaveMethod в моем слое данных будет указанный выше объект списка, и мой подход выглядит следующим образом:

Public Overridable Function SaveMethod(businessEntity As List(Of Employee)) As Boolean
    Using scope As System.Transactions.TransactionScope = New System.Transactions.TransactionScope()
        'DECLARE CONNECTION VARIABLE
        Dim objSqlConn As SqlConnection = Nothing
        'DECLARE SQL PARAMS VARIABLE
        Dim objSqlParams As SqlParameter() = Nothing
        'DECLARE BOOLEAN VARIABLE
        Dim bolReturnValue As Boolean = False
        'SET THE CONNECTION
        objSqlConn = GetCSSConnection()
        'SET THE PARAMETERS TO THE STORED PROCEDURE
        objSqlParams = New SqlParameter(3) {}
        For i As Integer = 0 To businessEntity.Count - 1
            objSqlParams(0) = New SqlParameter("@myParam1", SqlDbType.Int)
            objSqlParams(0).Value = 2 ' businessEntity(i).Id

            objSqlParams(1) = New SqlParameter("@myParam2", SqlDbType.Int)
            objSqlParams(1).Value = businessEntity(i).Name

            objSqlParams(2) = New SqlParameter("@myParam3", SqlDbType.Bit)
            objSqlParams(2).Value = businessEntity(i).value
        Next

        'BUILD NEW SQL CONNECTION AND EXECUTE THE STORED PROCEDURE
        'ASSIGN THE RESULT TO BOOLEAN VARIABLE
        bolReturnValue = (Microsoft.VisualBasic.IIf(ExecuteNonQuery(objSqlConn, CommandType.StoredProcedure, "myStoredProcedure", objSqlParams) > 0, True, False))

        CloseConnection(objSqlConn)
        Return bolReturnValue 'RETURNS BOOLEAN VALUE
    End Using
End Function

Он не выдает никакой ошибки, он также возвращает True. Но он не сохраняется в базе данных.

Чего здесь не хватает? Правилен ли этот подход? Есть ли лучший способ?


person Santosh    schedule 16.05.2018    source источник
comment
stackoverflow.com/a/452934/74015   -  person Sam Axe    schedule 16.05.2018
comment
@SamAxe Как мне это сделать с C# или vb.net, вот мой вопрос.   -  person Santosh    schedule 16.05.2018
comment
@SamAxe без вопроса о чтении, пожалуйста, не редактируйте теги. Мне нужен ответ либо на С#, либо на vb.net. Поэтому я также пометил С#.   -  person Santosh    schedule 16.05.2018
comment
Поскольку ваш код написан на VB, парням, работающим только на C#, он, вероятно, не понравится. Добавление тега [.net], вероятно, будет лучше. Кроме того, пожалуйста, сделайте правильный отступ в коде.   -  person 41686d6564    schedule 16.05.2018
comment
Что касается вашей проблемы: 1) Вы проверили ответ в ссылке, на которую ссылался SamAxe? 2) Обратите внимание, что ваш код перезаписывает значения параметров на каждой итерации в вашем цикле for.   -  person 41686d6564    schedule 16.05.2018
comment
Заполните DataTable соответствующими данными, а затем сохраните лот одним вызовом метода Update SqlDataAdapter. Вам нужно будет установить InsertCommand и/или UpdateCommand в зависимости от ситуации.   -  person jmcilhinney    schedule 16.05.2018


Ответы (2)


Почему бы вам не использовать параметр с табличным значением, который доступен в SQL Server 2008.

person Vikas Chaturvedi    schedule 16.05.2018
comment
Как мне это сделать из С#? Любой пример? - person Santosh; 16.05.2018
comment
Здесь я нахожу для вас пример google.co.in/amp/s/www.red-gate.com/simple-talk/dotnet/ - person Vikas Chaturvedi; 16.05.2018

До End Using вам необходимо завершить транзакцию, чтобы применить изменения:

scope.Complete()
person Amc    schedule 16.05.2018