#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
не было бы исключения, если бы вы не вызывали его в первую очередь. Ваша проблема в том, что вы делаете неправильные вещи, и это создает проблему. Прекратите делать неправильные вещи, и проблема исчезнет.