Staram się stworzyć małą aplikację pozwalającą użytkownikom na odczytanie zawartości tabeli opisującej stan magazynowy, wyszukiwanie w zależności od 2 wierszy wskazujących, w którym magazynie znajduje się towar oraz po przypisanym kodzie kreskowym, którym już udało mi się dotrzeć do pracy przy użyciu źródła powiązania i widoku Datagrid, aktualizując widok za pomocą zapytania pobierającego kod kreskowy i lokalizację jako ciągi z dwóch pól.

Drugą częścią, której potrzebowałbym, aby ta aplikacja spełniała mój podstawowy cel, jest możliwość dodawania nowych wierszy i przechowywania ich w oryginalnej tabeli w bazie danych, aby użytkownicy mogli dodawać nowe pozycje niezależnie od bezpośrednio magazynów.

Do tej pory napotkałem 2 problemy: potrzebuję klucza podstawowego, który reprezentowałby sekwencyjny identyfikator, ale nie wiem, jak utworzyć sekwencyjnie rosnący identyfikator, udaje mi się uzyskać pierwszy identyfikator dodawania za pomocą kombinacji zapytań top 1 order by desc ale dane nie są aktualizowane po dodaniu nowego wiersza, co powoduje błąd, ponieważ próbuje dodać kolejny wiersz o tej samej wartości dla klucza podstawowego. Drugi problem, z którym się spotykam, to: widok siatki jest zmieniany zgodnie z danymi, które wprowadzam w polach tekstowych, które ustawiłem, aby zebrać różne wartości dla tabeli, ale tabela w samej bazie danych nie wykazuje żadnych zmian, zachowując tylko dane testowe wprowadziłem przy jego tworzeniu.

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

Podsumowując:

  • Jak mogę przejść do aktualizacji tabeli bazy danych, aby uwzględnić nową linię?
  • Czy istnieje sprytny sposób na znalezienie ostatniej wartości, zwiększając ją o 1, aby uzyskać następną wartość i aktualizując ją podczas wstawiania nowej linii, aby nie skończyć z 2 liniami o tej samej wartości dla klucza podstawowego, generując błąd?
0
Wolfaloo 7 listopad 2018, 11:54

1 odpowiedź

Najlepsza odpowiedź

Aby ustawić przyrostowy identyfikator w Db, zakładając, że masz dostęp do SQL Server Management Studio, w projekcie tabeli, dla kolumny identyfikatora, we właściwościach kolumny, przewiń w dół do specyfikacji tożsamości i ustaw (to tożsamość) na tak.

Aby dodać nowy wiersz, używam tego kodu:

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

Oczywiście zmień, aby były odpowiednie dla nazw tabel i kolumn.

Jeśli potrzebujesz pobrać identyfikator do wyświetlenia, możesz dodać procedurę obsługi do aktualizacji, taką jak:

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

I użyj jak:

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

EDYTUJ

Pierwszy przykład zmieniony i wyjaśniony poniżej:

'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")
1
Simon Evans 8 listopad 2018, 13:41