2009-03-16 5 views
2

Existe-t-il une meilleure solution (en utilisant moins de code) pour l'extrait de code suivant? C'est quelque chose que je trouve beaucoup dans VB6 et j'espérais le réduire.Solution plus élégante pour extraire la valeur de la base de données à l'aide du jeu d'enregistrements

Si je comprends bien Connection.Execute ne fonctionnera pas

SQL = "SELECT SomeID FROM TableA" 
    RecordSet.Open SQL, Connection, adOpenStatic, adLockOptimistic, adCmdText 
    SomeID = RecordSet.Fields(0).Value 
    RecordSet.Close 

    SQL = "SELECT AnotherID FROM TableB" 
    RecordSet.Open SQL, Connection, adOpenStatic, adLockOptimistic, adCmdText 
    AnotherID = RecordSet.Fields(0).Value 
    RecordSet.Close 

Ce n'est pas une question fonctionnelle regarder juste pour voir s'il y a un moyen plus net.

+0

En C# J'exécutons une requête scalaire . Je ne suis pas sûr si VB a quelque chose d'analogue. – Will

Répondre

1

Les paramètres par défaut pour les RecordSet.Open() et Connection.Execute() sont:

  • adOpenForwardOnly
  • adLockReadOnly

Vous utilisez des paramètres différents, mais il n'y a aucune raison apparente de ne pas aller avec les valeurs par défaut dans votre Cas.

Je ne sais pas pourquoi vous pensez que Connection.Execute() ne fonctionnera pas, d'autant plus que vous semblez avoir SQL statique:

Function FetchOneField(Connection, SQL) 
    With Connection.Execute(SQL) 
    FetchOneField = .Fields(0).Value 
    .Close 
    End With 
End Function 

SomeID = FetchOneField(Connection, "SELECT SomeID FROM TableA") 
AnotherID = FetchOneField(Connection, "SELECT AnotherID FROM TableB") 

' or, not expressed as a function (not less lines, but "tidier" nevertheless)' 
With Connection.Execute("SELECT SomeID FROM TableA") 
    SomeID = .Fields(0).Value 
    .Close 
End With 
0

En supposant que vous avez 1 enregistrement par requête, vous pouvez le faire de cette façon

SQL = "SELECT TableA.SomeID, TableB.AnotherID FROM TableA, TableB" 
RecordSet.Open SQL, Connection, adOpenStatic, adLockOptimistic, adCmdText 
SomeID = RecordSet.Fields(0).Value 
AnotherID = RecordSet.Fields(1).Value 
RecordSet.Close 
0

Connection.Executedevrait travailler. Cela fonctionne pour moi:

Const Sql1 As String = "SELECT SomeID FROM TableA" 
    SomeID = Connection.Execute(Sql1)(0).Value 

    Const Sql2 As String = "SELECT AnotherID FROM TableB" 
    AnotherID = Connection.Execute(Sql2)(0).Value 

... mais personnellement j'encapsulent ces Connection.Execute lignes où je pourrais être explicite sur la libération des connexions du pool de connexion, etc.

Questions connexes