Обновление таблицы базы данных приложения VB.Net - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать небольшое приложение, позволяющее пользователям читать содержимое таблицы, описывающей инвентарь склада, и искать в зависимости от 2 строк, указывающих, на каком складе находится товар, и по назначенному ему штрих-коду, который мне уже удалось получить. работать с использованием источника привязки и представления таблицы данных, обновляя представление через запрос, используя штрих-код и местоположение в виде строк из двух блоков.

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

Пока что я столкнулся с двумя проблемами: мне нужен первичный ключ, который бы представлял последовательный идентификатор, но я не знаю, как создать последовательно увеличивающийся идентификатор, мне удается получить первый идентификатор добавления с помощью запроса top 1 order by desc комбинации, но данные не обновляются после добавления новой строки, что приводит к ошибке, так как он пытается добавить еще одну строку с тем же значением для первичного ключа. Вторая проблема, с которой я сталкиваюсь, заключается в следующем: вид сетки изменяется в соответствии с данными, вводимыми в текстовые поля, которые я настроил для сбора различных значений для таблицы, но таблица в самой базе данных не показывает никаких изменений, сохраняя только тестовые данные. я ввел при его создании.

Public Class AddItems
    Private Sub AddItems_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'MagazzinoDataSet.LastUsedID' table. You can move, or remove it, as needed.
        Me.LastUsedIDTableAdapter.LastUsedID(Me.MagazzinoDataSet.LastUsedID)
        'TODO: This line of code loads data into the 'MagazzinoDataSet.Stock' table. You can move, or remove it, as needed.
        Me.StockTableAdapter.Fill(Me.MagazzinoDataSet.Stock)
        'TODO: This line of code loads data into the 'MagazzinoDataSet.AddWarehouseList' table. You can move, or remove it, as needed.
        Me.AddWarehouseListTableAdapter.AddWarehouseList(Me.MagazzinoDataSet.AddWarehouseList)
        'TODO: This line of code loads data into the 'MagazzinoDataSet.WarehouseList' table. You can move, or remove it, as needed.
        Me.WarehouseListTableAdapter.Fill(Me.MagazzinoDataSet.WarehouseList)
        'TODO: This line of code loads data into the 'MagazzinoDataSet.Stock' table. You can move, or remove it, as needed.
        Me.StockTableAdapter.Fill(Me.MagazzinoDataSet.Stock)
    End Sub
     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim R As DataRow = MagazzinoDataSet.Tables("Stock").NewRow()

    R("Supplier") = Supplier.Text
    R("Producer_code") = ProducerCode.Text
    R("Barcode") = Barcode.Text
    R("Comp_name") = ComponentName.Text
    R("Warehouse") = Warehouse.Text
    R("Internal_Code") = InternalCode.Text
    R("Description_IT") = ITDescr.Text
    R("Description_EN") = ENDescr.Text
    'R("ID") = NextID.SelectedValue <- this would be an hidden uneditable multibox containing the product of the query finding the next value to be inserted in the table (basically last ID + 1, nothing fancy)"ID" would be the primary key of this table
    R("Quantity") = "0"

    MagazzinoDataSet.Tables("Stock").Rows.Add(R)
    DataGridView1.DataSource = MagazzinoDataSet.Stock

End Sub
End Class

Подводя итог:

  • Как мне обновить таблицу базы данных, чтобы включить новую строку?
  • Есть ли умный способ найти последнее значение, увеличив его на 1, чтобы получить следующее значение, и обновив его при вставке новой строки, чтобы не заканчивать двумя строками с одинаковым значением для первичного ключа, генерируя ошибка?

1 Ответ

0 голосов
/ 07 ноября 2018

Чтобы установить инкрементный идентификатор в БД, предполагая, что у вас есть доступ к SQL Server Management Studio, в разделе Дизайн таблицы, для столбца идентификатора, в свойствах столбца прокрутите вниз до параметра «Спецификация идентификатора» и установите («Идентификация») в значение «Да». .

Чтобы добавить новую строку, я использую этот код:

Using NotesDS As New DataSet
    Using NotesDA As New SqlDataAdapter With {.SelectCommand = New SqlCommand With {.Connection = SQLDBConnection, .CommandText = "SELECT * FROM Notes WHERE ID = " & ID}}
        NotesDA.Fill(NotesDS, "Notes")
        Using NotesDV As New DataView(NotesDS.Tables("Notes"))
            Using NoteBuilder As New SqlCommandBuilder(NotesDA) With {.QuotePrefix = "[", .QuoteSuffix = "]"}                        
                If NotesDV.Count = 0 Then                             
                    Dim NoteDRV As DataRowView = NotesDV.AddNew                       
                    NoteDRV.Item("UserName") = UserName
                    NoteDRV.Item("Note") = Note
                    NoteDRV.Item("NoteDate") = NoteDate
                    NoteDRV.Item("CompanyCode") = CompanyCode
                    NoteDRV.EndEdit()
                    NotesDA.UpdateCommand = NoteBuilder.GetUpdateCommand
                    NotesDA.Update(NotesDS, "Notes")
                End If
            End Using
        End Using
    End Using
End Using

Очевидно, внесите изменения, чтобы они соответствовали именам вашей таблицы и столбца.

Если вам нужно получить идентификатор для отображения, вы можете добавить обработчик к обновлению, например:

Public Sub GenericOnRowUpdated(sender As Object, e As System.Data.SqlClient.SqlRowUpdatedEventArgs)        
    Dim newID As Integer = 0
    Dim idCMD As SqlClient.SqlCommand = New SqlClient.SqlCommand("SELECT @@IDENTITY", SQLDBConnection)
    If e.StatementType = StatementType.Insert Then            
        newID = CInt(idCMD.ExecuteScalar())
        e.Row("ID") = newID
    End If
End Sub

и используйте как:

 AddHandler NotesDA.RowUpdated, New SqlRowUpdatedEventHandler(AddressOf GenericOnRowUpdated)
 NotesDA.Update(NotesDS, "Notes")
 NewID = NoteDRV.Item("ID")

EDIT

Первый пример дополнен и объяснен ниже:

'Declare you connection to the SQL dB. Connection String looks like "Data Source=192.168.71.10\dBName; Initial Catalog=dBName; User ID=USER; Password='PASSWORD!';MultipleActiveResultSets=true"  -  You may well already have an open connection, and can use that instead. Not sure what your 
StockBindingSource is...
    Dim oConn As New SqlConnection("CONNECTION STRING")
    'Open the connection
    oConn.Open()
    'Declare Your DataAdapter and initialise using your connection
    Dim DA As New SqlDataAdapter With {.SelectCommand = New SqlCommand With {.Connection = oConn, .CommandText = "SELECT * FROM Stock WHERE ID=0"}}
    'Declare you DataSet
    Dim DS As New DataSet
    'Fill Your DataSet with the Stock table from your DataAdapter
    DA.Fill(DS, "Stock")
    'Declare a DataView for easy use (really the same as using DS.Tables("Stock").DefaultView)
    Dim DV As New DataView(DS.Tables("Stock"))
    'Declare a CommandBuilder and initialise with your DataAdapter. This will now watch for changes made to your data and build the appropriate SQL UPDATE/INSERT/DELETE command. the "[" and "]" are in case any column names use reserved words
    Dim Builder As New SqlCommandBuilder(DA) With {.QuotePrefix = "[", .QuoteSuffix = "]"}
    'Decalre a DataRowView for data population, based on your DataView table structure
    Dim R As DataRowView = DV.AddNew()
    'Populate the fileds with your Form data
    R("Supplier") = Supplier.Text
    R("Producer_code") = ProducerCode.Text
    R("Barcode") = Barcode.Text
    R("Comp_name") = ComponentName.Text
    R("Warehouse") = Warehouse.Text
    R("Internal_Code") = InternalCode.Text
    R("Description_IT") = ITDescr.Text
    R("Description_EN") = ENDescr.Text
    R("Quantity") = "0"
    'Notify that the edit has finished
    R.EndEdit()
    'Get the SQL command from the CommandBuilder 
    DA.UpdateCommand = Builder.GetUpdateCommand()
    'Execute the update (in this case it will be an INSERT) 
    DA.Update(DS, "Stock")
...