2010-04-02 3 views
1

Si la base de données n'est pas Oracle, c'est MS SQl 2008. Ma tâche: si Oracle, ajoutez deux autres paramètres lors de l'appel d'un proc stocké.S'il vous plaît prendre un coup à cet échantillon VB.Net Oracle et aidez-moi avec String.Format

Les processus stockés Oracle et MSFT sont générés; les Oracle ont 3 paramètres supplémentaires:

Vret_val out number, 
Vparam2 in out number, 
Vparam3 in out number, 
... the rest 

(Le fait ne sont pas nommés Vparam2 et Vparam3, mais cela ne devrait pas d'importance). Ainsi, le code pour une aide classe VB.Net qui appelle un proc stocké:

Imports System.Data.Odbc 
Imports System.Configuration 

Dim objCon As OdbcConnection = Nothing 
Dim objAdapter As OdbcDataAdapter 
Dim cmdCommand As New OdbcCommand 
Dim objDataTable As DataTable 

Dim sconnection As String 

Try 
    sconnection = mConnectionString 
    objAdapter = New OdbcDataAdapter 
    objCon = New OdbcConnection(sconnection) 
    objCon.Open() 

    objAdapter.SelectCommand = cmdCommand 
    objAdapter.SelectCommand.Connection = objCon 
    objAdapter.SelectCommand.CommandType = CommandType.StoredProcedure 

    objAdapter.SelectCommand.CommandTimeout = Globals.mReportTimeOut 

    If Not mIsOracle Then 
     objAdapter.SelectCommand.CommandText = String.Format("{{call {0}}}", spName) 
    Else 
     Dim returnValue As New OdbcParameter 
     returnValue.Direction = ParameterDirection.Output 
     returnValue.ParameterName = "@Vret_val" 
     returnValue.OdbcType = OdbcType.Numeric 
     objAdapter.SelectCommand.Parameters.Add(returnValue) 

     objAdapter.SelectCommand.CommandText = String.Format("{{call {0}(?)}}", spName) 
    End If 

    Try 

     objDataTable = New DataTable(spName) 
     objAdapter.Fill(objDataTable) 

    Catch ex As Exception 
    ... 

Question: Je suis perplexe quant à ce String.Format("{{call {0}(?)}}", spName) le fait, en particulier la partie (?). Ma compréhension du String.Format est qu'il remplacera simplement {0} par spName. Le {{, }}, et (?) me rejettent parce que { me rappelle le formatage, (?) allusions à une certaine utilisation regex avancée.

Malheureusement, je reçois peu d'aide d'une personne clé qui est en vacances sans leash [smart] phone.

Je devine que j'ajoute simplement 5 lignes de plus pour chaque paramètre supplémentaire, et change String.Format("{{call {0}(?)}}", spName) en String.Format("{{call {0}(?,?,?)}}", spName). J'ai oublié de mentionner que je code ce "aveuglément" - j'ai un compilateur pour m'aider, mais aucun environnement mis en place pour tester cela.

Ce sera plus dans quelques jours, mais je dois faire de mon mieux pour essayer de terminer à temps :)

Merci.

Répondre

1

String.Format("{{call {0}(?)}}", spName) produira une chaîne comme ceci: "{call ProcName(?)}" (en supposant que spName contient la chaîne ProcName). {{ et '}} are needed if you want the to include {or} `dans la chaîne sans qu'ils fassent partie de la mise en forme.

Ceci est mentionné dans la documentation string.Format:

Les avant et arrière brace caractères, '{' et '}', sont obligatoires. Pour spécifier un caractère de renfort littéral unique au format, spécifiez deux caractères de renfort avant ou arrière ; c'est-à-dire "{{" ou "}}".

Le (?) signifie rien de spécial pour la fonction string.Format, mais sera utilisé lors de l'exécution de la procédure donnée, chaque marque de question représentant un paramètre qui doit être transmis à la procédure.

+0

Merci ... mais qu'advient-il du '(?)'? –

+0

@Hamish: J'ai mis à jour la réponse. –

+0

Merci encore ... maintenant, à propos de la signification de '(?)' - était-ce une supposition. Je dois en ajouter 2 de plus, donc devrait-il être '(???)', '(?,?,?)', '(?) (?) (?)', '(?), (?), (?) ', ou autre chose? Cette question de suivi est ouverte à tous. –

Questions connexes