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?
1 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")
Podobne pytania
Nowe pytania
sql-server
Microsoft SQL Server to system zarządzania relacyjnymi bazami danych (RDBMS). Użyj tego tagu dla wszystkich wersji SQL Server, w tym Compact, Express, Azure, Fast-track, APS (dawniej PDW) i Azure SQL DW. Nie używaj tego tagu dla innych typów DBMS (MySQL, PostgreSQL, Oracle itp.). Nie używaj tego tagu w przypadku problemów z oprogramowaniem i programowaniem mobilnym, chyba że jest on bezpośrednio powiązany z bazą danych.