2011-10-28 3 views
2

J'ai été invité à créer un programme qui insère des enregistrements dans une table parente et plusieurs tables enfants. Ma question est, comment puis-je savoir ce que le PK est pour la table parent, afin que je puisse l'ajouter comme un FK dans l'enfant? Le PK pour le parent est un numéro automatique. Comme je l'ai indiqué dans mon titre, j'utilise VB.net, mySQL, via une connexion ODBC. Je dois le faire à travers le code et ne peux pas utiliser les procédures stockées. Aucune suggestion?VB.net ajouter des enregistrements parent et enfant à MySQL db

grâce

ma transaction ressemble à ceci:

 Dim cmdText As String = "INSERT INTO candidate(first_name, last_name, phone1, phone2, email1, city, " _ 
        & " state, country, zip,primary_contact_id) VALUES (?,?, ?, ?,?,?, ?,?,?,?)" 

    If conn.State = ConnectionState.Closed Then 
     conn.Open() 
    End If 
    Dim SqlStatus As Integer 
    Dim trans As Odbc.OdbcTransaction = conn.BeginTransaction(IsolationLevel.ReadCommitted) 
    Dim cmd As OdbcCommand = New OdbcCommand(cmdText, conn, trans) 


    Try 
     cmd.Parameters.Clear() 
     cmd.CommandType = CommandType.Text 'The default is CommandType.Text 

     With cmd.Parameters 
      .Add("@first_name", OdbcType.VarChar).Value = fName 
      .Add("@last_name", OdbcType.VarChar).Value = lName 
      .Add("@phone1", OdbcType.VarChar).Value = phone 
      .Add("@phone2", OdbcType.VarChar).Value = mobilePhone 
      .Add("@email1", OdbcType.VarChar).Value = email 
      .Add("@city", OdbcType.VarChar).Value = city 
      .Add("@state", OdbcType.VarChar).Value = state 
      .Add("@country", OdbcType.VarChar).Value = country 
      .Add("@zip", OdbcType.VarChar).Value = zip 
      .Add("@primary_contact_id", OdbcType.Int).Value = getContactFK 
     End With 

     SqlStatus = cmd.ExecuteNonQuery 

     If Not SqlStatus = 0 Then 
      trans.Commit() 
      Me.Close() 
     Else 
      MsgBox("Not Updated") 
     End If 



    Catch ex As Exception 
     MsgBox(ex.Message) 
    Finally 
     cmd.Dispose() 
     trans.Dispose() 
    End Try 

Je travaille toujours sur le code, donc je ne sais si cela fonctionne pour l'instant jason

Répondre

3

Jetez un oeil à How to Get the Unique ID for the Last Inserted Row

Comme vous passez par ODBC et que vous ne pouvez pas utiliser un proc stocké, vous devrez exécuter deux instructions SQL ensemble (as a batch). Tout d'abord votre insert puis SELECT LAST_INSERT_ID()

Il devrait ressembler à:

INSERT INTO ... ; 
SELECT LAST_INSERT_ID(); 

Puisque vous vous attendez à un résultat que vous devez exécuter à partir de votre code client comme une instruction SELECT. Et comme il s'agit d'une opération par lots avec une insertion, vous devez également prendre en compte using a transaction.

+0

Merci, je vais faire un essai! une autre question, si l'insertion de l'enfant échoue, je veux que toutes les insertions échouent. puis-je le faire dans une transaction? – jason

+0

Oui, vous pouvez. C'est là que la bonté de la transaction entre vraiment en jeu. Sachez simplement que votre lot deviendra de plus en plus volumineux et complexe car vous voudrez également configurer ces insertions dans cette déclaration, mais c'est la bonne façon de le faire. –

+0

Merci! vous n'auriez pas de code d'exemple pour faire une transaction avec select last_insert_idI()? Je n'ai pas travaillé avec des transactions sur vb.net auparavant. merci – jason

3

Vous pouvez utiliser

"; select last_insert_id()" 

A la fin de votre insert pour la table parent. Et puis utilisez

Dim id as Integer = cint(command.ExecuteScalar()) 

Pour obtenir la clé résultante d'utiliser chez l'enfant insère

+0

merci, aussi, je vais essayer ça! – jason

+0

+1 Pour l'extrait de code VB concis! –

Questions connexes