2016-08-01 38 views
-1

Dies ist wahrscheinlich eine einfache Sache zu tun, aber ich mache nur mein erstes vb-Projekt, so bin ich mir nicht sicher, wie dies zu 100% zu tun, so entschuldigt, wenn das folgende Problem ist eigentlich sehr einfach.Return maximale ID-Nummer aus einer Datenbank

Grundsätzlich, was ich tun muss, wenn ich eine Datenbanktabelle in ein Ultraregid lade, muss ich die maximale Ganzzahl, die in einem Feld gespeichert ist, abrufen.

Um dies deutlicher zu erklären, hat jeder Datensatz in der Datenbank seine eigene ID-Nummer, daher muss ich jeden Datensatz durchlaufen und den mit der höchsten ID-Nummer finden und die ID zurückgeben, damit diese verwendet werden kann in anderen Berechnungen.

Ich weiß, dass ich SQL = SELECT MAX(supportID) FROM tblIncidents zum Beispiel verwenden kann, um die höchste ID-Nummer in dieser Tabelle abzurufen.

Also, wie gehe ich über Deklaration das Ergebnis davon (also, die höchste ID-Nummer) als Variable, so dass ich es zuerst in einer Nachricht anzeigen kann, um mir zu beweisen, dass die Abfrage funktioniert hat, und zweitens so Ich kann die Variable verwenden, um die ID in meinem Code zu verwenden?

Ein Beispiel; Dies ist der Code zum Speichern eines neuen Datensatzes in der Tabelle tblIncidents.

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click 

    Dim incidentSolved As Boolean = False 
    If cboxSolved.Checked Then 
     incidentSolved = True 
    End If 

    If txtClientSave.Text = "" Then 
     MsgBox("Client name cannot be blank") 

    ElseIf rtbProblem.Text = "" Then 
     MsgBox("Problem cannot be blank") 

    ElseIf cboxSolved.Checked = True And rtbSolution.Text = "" Then 
     MsgBox("Please enter solution") 

    Else 
     database.SaveNewIncident(txtClientSave.Text, dtpStart.Value, dtpEnd.Value, rtbProblem.Text, dtpStartTime.Value, dtpEndTime.Value, cboxSolved.Checked, rtbSolution.Text, _con) 

     txtClientSave.Text = "" 
     rtbProblem.Text = "" 
     rtbSolution.Text = "" 
     dtpStart.Value = Date.Today 
     dtpEnd.Value = Date.Today 
     dtpStartTime.Value = DateTime.Now 
     dtpEndTime.Value = DateTime.Now 
     cboxSolved.Checked = False 

    End If 
End Sub 

Datenbank-Funktion, die

Public Shared Function SaveNewIncident(ByVal clientName As String, dateStart As Date, dateEnd As Date, ByVal incidentProblem As String, ByVal timeStart As String, ByVal timeEnd As String, 
             ByVal incidentSolved As Boolean, ByVal incidentSolution As String, _Con As OleDbConnection) 

    Dim tr As OleDbTransaction = Nothing 

    Try 
     tr = _Con.BeginTransaction() 

     Dim Dc As New OleDbCommand 
     Dc.Connection = _Con 

     Dc.CommandType = CommandType.Text 
     Dc.CommandText = "INSERT INTO dbo.tblIncidents VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)" 
     Dc.Transaction = tr 
     Dc.Parameters.Add("@clientName", OleDbType.VarChar).Value = clientName 
     Dc.Parameters.Add("@dateStart", OleDbType.Date).Value = dateStart 
     Dc.Parameters.Add("@dateEnd", OleDbType.Date).Value = dateEnd 
     Dc.Parameters.Add("@incidentProblem", OleDbType.LongVarChar).Value = incidentProblem 
     Dc.Parameters.Add("@timeStart", OleDbType.VarChar).Value = timeStart 
     Dc.Parameters.Add("@timeEnd", OleDbType.VarChar).Value = timeEnd 
     Dc.Parameters.Add("@incidentSolved", OleDbType.Boolean).Value = incidentSolved 
     Dc.Parameters.Add("@incidentSolution", OleDbType.LongVarChar).Value = incidentSolution 

     Dc.ExecuteNonQuery() 

     tr.Commit() 

     MsgBox("Save successful") 

    Catch ex As Exception 

     mdInit.errorLog(ex.Message, ex.StackTrace) 
     MsgBox("Failed to save data, refer to error log") 
     tr.Rollback() 

    End Try 

End Function 
+1

Was Sie bisher versucht haben? Außerdem ist diese Art von Logik oft kein guter Ansatz, denn was passiert, wenn ein neuer von jemand anderem eingefügt wird, nachdem Sie diesen Wert abgerufen haben? –

+0

@SeanLange Hallo Sean, diese Anwendung wird nur von 1 Person verwendet, so dass die Insertion Verwirrung nicht passieren wird. Der Grund dafür ist, dass ich eine Importfunktion in das Programm geschrieben habe, um eine vorhandene Datenbank durch eine neue zu überschreiben, was jedoch bedeutete, Identity_Insert in SQL Server zu deaktivieren. Also jetzt auf meiner Schaltfläche Speichern, muss ich die höchste aktuelle ID abrufen und erhöhen, um den Wert zu bestimmen, der in die ID-Spalte –

+1

Warum nicht die Zeile einfügen und die OUTPUT-Klausel verwenden? Auf diese Weise müssen Sie nicht hoffen, dass Ihr Wert derselbe ist. –

Antwort

0

genannt wird, was Sie in VB.net tun können, ist ein SqlCommand definieren, die eine SQL-Verbindung zu ihm angebracht benötigen - da Ihre Abfrage einen einzelnen Wert zurückgibt werden Sie der Lage sein, es mit ExecuteScalar auszuführen einen einzelnen Wert zB

Dim cmd AS New SqlClient.SQLCommand("SELECT MAX(billID) FROM tblRecurring",connectionString) 

dann

zurückzukehren

und dann

dim x as MaxId = cmd.executeScalar 

und fertig machen mit

cmd.connection.dispose 

natürlich

+0

Hi Andrew, die Zeile 'Dim x As MaxID' funktioniert nicht, da maxID nicht deklariert wird? –

+0

@joe es sollte 'Dim x als Integer = cmd.executeScalar' ... – Codexer