Пожалуйста, ознакомьтесь с примером VB.Net, связанным с Oracle, и помогите мне с String.Format. - PullRequest
1 голос
/ 03 апреля 2010

Если база данных не Oracle, то это MS SQl 2008. Моя задача: если Oracle, добавьте еще два параметра при вызове хранимого процесса.

Сгенерированы хранимые процедуры Oracle и MSFT; У Oracle есть 3 дополнительных параметра:

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

(На самом деле они не называются Vparam2 и Vparam3, но это не должно иметь значения). Итак, код для вспомогательного класса VB.Net, который вызывает хранимый процесс:

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
    ...

Вопрос: Я озадачен тем, что делает String.Format("{{call {0}(?)}}", spName), в частности, часть (?). Насколько я понимаю, String.Format просто заменяет {0} на spName. {{, }} и (?) действительно отбрасывают меня, потому что { напоминает мне о форматировании, (?) намекает на некоторое расширенное использование регулярных выражений.

К сожалению, мне не помогает ключевой человек, который находится в отпуске без привязи [умного] телефона.

Я предполагаю, что я просто добавляю еще 5 строк для каждого дополнительного параметра и меняю String.Format("{{call {0}(?)}}", spName) на String.Format("{{call {0}(?,?,?)}}", spName). Я забыл упомянуть, что я кодирую это «вслепую» - у меня есть компилятор, чтобы помочь мне, но среда для этого не настроена.

Это закончится через несколько дней, но мне нужно сделать все возможное, чтобы попытаться закончить его вовремя:)

Спасибо.

1 Ответ

1 голос
/ 03 апреля 2010

String.Format("{{call {0}(?)}}", spName) создаст такую ​​строку: "{call ProcName(?)}" (при условии, что spName содержит строку ProcName). {{ и ´}} are needed if you want the to include {or} `в строке, не являясь частью форматирования.

Это упомянуто в документации для string.Format:

Ведущая и конечная скобка символы '{' и '}' являются обязательными. Чтобы указать одну буквенную скобку символ в формате, укажите два начальные или конечные фигурные скобки; то есть "{{" или "}}".

(?) не означает ничего особенного для функции string.Format, но будет использоваться при выполнении данной процедуры, каждый знак вопроса представляет параметр, который должен быть передан в процедуру.

...