2016-08-01 2 views
-1

Ceci est probablement une chose facile à faire, mais je ne fais que faire mon premier projet vb donc je ne suis pas sûr comment faire 100%, donc des excuses à l'avance si le problème suivant est en fait très simple.Retour nombre maximum d'identification à partir d'une base de données

Fondamentalement, ce que je dois faire est, lors du chargement d'une table de base de données dans un UltraGrid, je dois récupérer l'entier maximal qui est stocké dans un champ. Pour expliquer cela plus clairement, chaque enregistrement dans la base de données a son propre numéro d'identification, donc j'ai besoin d'itérer chaque enregistrement et de trouver celui avec le numéro d'identification le plus élevé, et retourner l'ID, de sorte que cela peut alors être utilisé dans d'autres calculs.

Je sais que je peux utiliser SQL = SELECT MAX(supportID) FROM tblIncidents par exemple pour récupérer le plus grand nombre d'ID stocké dans ce tableau. Alors, comment dois-je déclarer le résultat de ceci (donc, le numéro d'identification le plus élevé) comme variable de sorte que je puisse d'abord l'afficher dans un messagebox pour me prouver que la requête a fonctionné, et deuxièmement Je peux utiliser la variable comme moyen d'utiliser l'identifiant dans tout mon code?

Un exemple; C'est le code pour enregistrer un nouvel enregistrement dans la table 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 

fonction de base de données qui est appelée

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

Qu'avez-vous essayé jusqu'à présent? En outre, ce type de logique n'est souvent pas une bonne approche car que se passe-t-il si une fois que vous récupérez cette valeur, une nouvelle est insérée par quelqu'un d'autre? –

+0

@SeanLange Bonjour Sean, cette application ne va être utilisée que par 1 personne, donc la confusion d'insertion ne se produira pas. La raison pour laquelle je dois faire ceci, est parce que j'ai écrit une fonction d'importation au programme pour écraser une base de données existante avec un nouveau, mais cela signifiait éteindre Identity_Insert dans SQL Server. Alors maintenant sur mon bouton Enregistrer, je dois récupérer l'ID courant le plus élevé et incrémenter pour déterminer la valeur d'utilité dans la colonne ID –

+1

Pourquoi ne pas insérer la ligne et utiliser la clause SORTIE? De cette façon, vous n'avez pas à espérer que votre valeur est la même. –

Répondre

0

ce que vous pouvez faire dans VB.net est de définir une sqlCommand qui nécessitera une connexion SQL attachée à elle - puisque votre requête renvoie une seule valeur que vous voulez être en mesure d'exécuter avec ExecuteScalar pour renvoyer une seule valeur, par exemple

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

puis

cmd.connection.open 

puis

dim x as MaxId = cmd.executeScalar 

et terminer avec

cmd.connection.dispose 

bien sûr

+0

Salut Andrew, la ligne 'Dim x As MaxID' ne fonctionne pas car maxID n'est pas déclaré? –

+0

@joe il devrait être 'Dim x comme Integer = cmd.executeScalar' ... – Codexer