Заблокированная база данных SqlCommand.ExecuteNonQuery() выдает исключение

#vb.net #sqlite

#vb.net #sqlite

Вопрос:

Моя база данных (SQLITE) заблокирована в строке SqlCommand .ExecuteNonQuery() . Я попытался использовать команду Using, но она не сработала. помогите мне, пожалуйста, решить мою проблему.

 Try
    SQLcnn.ConnectionString = gFournisseurDonneesCie
    SQLcnn.Open()
    SQLcnnCompl.ConnectionString = gFournisseurComplementCie
    SQLcnnCompl.Open()
    dstDivers.Locale = gCultureInfo

    With SQLcommand
        .Connection = SQLcnn
        .CommandText = "UPDATE Produit SET PrixDetailProduit = ?, PrixCoutantProduit = ?, EscompteSurVente = ?, CommVenteProduit = ?, QuanEnMainProduit = ?, " amp;
                 " QuanMinProduit = ?, QuanACommProduit = ? WHERE CodeIDProduit = ?"
        .Parameters.Clear()
        paramCol = .Parameters
    End With
    With SQLada
        .SelectCommand = New SQLiteCommand("SELECT CodeIDProduit,PrixCoutantProduit,PrixDetailProduit,EscompteSurVente,CommVenteProduit,QuanEnMainProduit,QuanMinProduit,QuanACommProduit FROM GestionPrixListeProduits WHERE CodeIDGestPrixProd = ?", SQLcnnCompl)
        .SelectCommand.Parameters.AddWithValue("@strCodeIDDivers", strCodeIdenGestPrix)
        dstDivers.Clear()
        .Fill(dstDivers, "GestionPrixListeProduits")
    End With
    For Each drwRangee In dstDivers.Tables("GestionPrixListeProduits").Rows
        With paramCol
            .AddWithValue("PrixDetailProduit_New", drwRangee.Item("PrixDetailProduit"))
            .AddWithValue("PrixCoutantProduit_New", drwRangee.Item("PrixCoutantProduit"))
            .AddWithValue("EscompteSurVente_New", drwRangee.Item("EscompteSurVente"))
            .AddWithValue("CommVenteProduit_New", drwRangee.Item("CommVenteProduit"))
            .AddWithValue("QuanEnMainProduit_New", drwRangee.Item("QuanEnMainProduit"))
            .AddWithValue("QuanMinProduit_New", drwRangee.Item("QuanMinProduit"))
            .AddWithValue("QuanACommProduit_New", drwRangee.Item("QuanACommProduit"))
            .AddWithValue("CodeIDProduit_Orig", drwRangee.Item("CodeIDProduit"))
        End With

        intRowsAffected = SQLcommand.ExecuteNonQuery()

    Next
  

Комментарии:

1. Возможно, это не связано с вашей проблемой, я вижу одну вещь: похоже, что вы снова добавляете параметры в SqlCommand на каждой итерации цикла for . Вероятно, было бы лучше добавить параметры один раз, когда вы устанавливаете текст команды и т. Д., Затем обновите значения в цикле.

Ответ №1:

Просто используйте один адаптер данных для извлечения данных и сохранения их, например

 Dim sourceConnectionString = "source connection string here"
Dim destinationConnectionString = "destination connection string here"
Dim selectStatement = "SELECT Id, Name, Description FROM SourceTable"
Dim updateStatement = "UPDATE DestinationTable SET Name = @Name, Description = @Description WHERE Id = @Id"

Using sourceConnection As New SqlConnection(sourceConnectionString),
      destinationConnection As New SqlConnection(destinationConnectionString),
      selectCommand As New SqlCommand(selectStatement, sourceConnection),
      updateCommand As New SqlCommand(updateStatement, destinationConnection),
      adapter As New SqlDataAdapter(selectCommand) With {.UpdateCommand = updateCommand}
    With updateCommand.Parameters
        .Add("@Name", SqlDbType.VarChar, 50, "Name")
        .Add("@Description", SqlDbType.VarChar, 50, "Description")
        .Add("@Id", SqlDbType.Int, 0, "Id")
    End With

    Dim table As New DataTable

    'Retrieve the data.
    adapter.Fill(table)

    'Make every row ready to be updated.
    For Each row As DataRow In table.Rows
        row.SetModified()
    Next

    'Save the data.
    adapter.Update(table)
End Using
  

Если исходная и целевая таблицы находятся в одной базе данных, вам нужна только одна строка подключения и один объект подключения, и вы также должны вызвать Open соединение перед вызовом Fill . Нет необходимости вызывать Close , поскольку это произойдет неявно в End Using строке, где находится соединение. Если таблицы находятся в разных базах данных, то нет необходимости вызывать Open либо, как Fill и Update оба неявно откроют соединение, если оно еще не открыто, а затем снова закроют его.

Приведенный мной пример кода, очевидно, предназначен для SQL Server, но принцип тот же, независимо от базы данных или ADO.NET поставщик услуг.

Комментарии:

1. Здравствуйте, спасибо, но у меня есть набор данных для извлечения данных. Вот мои объявления переменных Dim SQLcnn As New SQLiteConnection Dim SQLcnnCompl As New SQLiteConnection Dim SQLada As New SQLiteDataAdapter Dim dstDivers As New DataSet Dim drwRangee As DataRow Dim SQLcmd As New SQLiteCommand Dim SQLreader As SQLiteDataReader Dim SQLcommand As New SQLiteCommand Dim paramCol As SQLiteParameterCollection

2. А что содержит набор данных? Могло ли это быть… Таблицы данных? Что вы думаете о dstDivers. Таблицы («GestionPrixListeProduits») есть? Вы уже вызываете Fill in код, который вы опубликовали, так в чем проблема?

3. моя проблема — это SqlCommand. ExecuteNonQuery() выдает исключение, база данных заблокирована

4. когда я меняю свою базу данных для доступа, все работает

5. ExecuteNonQuery не было бы исключения, если бы вы не вызывали его в первую очередь. Ваша проблема в том, что вы делаете неправильные вещи, и это создает проблему. Прекратите делать неправильные вещи, и проблема исчезнет.