Проблема введения параметра VB в хранимую процедуру (FireBird) - PullRequest
1 голос
/ 18 марта 2009

Каждый здесь всегда оказывал такую ​​большую помощь, прямо или косвенно. И с большой надеждой, что это, опять же, звучит правдоподобно.

Для ясности, хранимая процедура работает под FireBird, а VB относится к .NET-разновидности

У меня есть хранимая процедура (отрывок ниже, важный бит ГДЕ)

  select pn, pnm.description, si_number, entry_date, cmp_auto_key, 
  parts_flat_price,    labor_flat_price, misc_flat_price, woo_auto_key, 
  wwt_auto_key
  from parts_master pnm, wo_operation woo
 where pn like :i_pn || '%'
   and pnm.pnm_auto_key = woo.pnm_auto_key
  into :pn, :description, :work_order, :entry_date, :cmp, :parts_price,
       :labor_price, :misc_price, :woo, :wwt

Я пытаюсь передать параметр из приложения vb, которое использует параметр I_PN, код которого приведен ниже (переменные для MyServer и MyPassword определены в более ранней части кода.)

    Try
        Dim FBConn As New FirebirdSql.Data.FirebirdClient.FbConnection()
        Dim FBCmd As FirebirdSql.Data.FirebirdClient.FbCommand

        Dim MyConnectionString As String
        MyConnectionString = _
        "datasource=" & MyServer & ";database=" & TextBox4.Text & "; & _
        user id=SYSDBA;password=" & MyPassword & ";initial catalog=;"

        FBConn = New FirebirdSql.Data.FirebirdClient. & _
        FbConnection(MyConnectionString)

        FBConn.Open()
        FBConn.CreateCommand.CommandType = CommandType.StoredProcedure

        FBCmd = New FirebirdSql.Data.FirebirdClient. & _
        FbCommand("WIP_COSTS", FBConn)

        FBCmd.CommandText = "WIP_COSTS"

        FBConn.CreateCommand.Parameters. & _
        Add("@I_PN", FirebirdSql.Data.FirebirdClient.FbDbType.Text). & _
        Value = TextBox1.Text

        Dim I_PN As Object = New Object()
        Me.WIP_COSTSTableAdapter.Fill(Me.WOCostDataSet.WIP_COSTS, @I_PN)
        FBConn.Close()
    Catch ex As System.Exception
        System.Windows.Forms.MessageBox.Show(ex.Message)
    End Try

Когда я запускаю VB.App и пытаюсь запустить программу, я получаю следующую ошибку:

Ошибка динамического SQL
Код ошибки SQL = -206
Столбец Неизвестный
I_PN
В строке 1, столбец 29

И я не могу понять, в чем проблема. То есть я не знаю, неверна ли моя логика на стороне VB или на хранимой процедуре.

Любое включенное кодирование объединяется из примеров, которые я обнаружил, с различными фрагментами кода, найденными во время длительного пребывания в GoogleFu.

Как любой, у кого есть опыт работы с VB более месяца или двух (в отличие от меня), может засвидетельствовать лишь один взгляд - мой код, вероятно, довольно дрянной и не очень хорошо сформирован - конечно, не изящен и, несомненно, работает. Я, конечно, развлекаю все советы с распростертыми объятиями.

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

Еще раз спасибо.

Jasoomian

Ответы [ 3 ]

1 голос
/ 26 марта 2009

После небольшого переосмысления и дополнительных исследований я наконец-то получил свой код на работу ..

        Try

        ' Code for checking server location and required credentials

        Dim FBConn As FbConnection
        ' Dim FBAdapter As FbDataAdapter
        Dim MyConnectionString As String

        MyConnectionString = "datasource=" _
                        & MyServer & ";database=" _
                        & TextBox4.Text & ";user id=SYSDBA;password=" _
                        & MyPassword & ";initial catalog=;Charset=NONE"

        FBConn = New FbConnection(MyConnectionString)
        Dim FBCmd As New FbCommand("WIP_COSTS", FBConn)

        FBCmd.CommandType = CommandType.StoredProcedure
        FBCmd.Parameters.Add("@I_PN", FbDbType.VarChar, 40)
        FBCmd.Parameters("@I_PN").Value = TextBox1.Text.ToUpper


        Dim FBadapter As New FbDataAdapter(FBCmd)
        Dim dsResult As New DataSet
        FBadapter.Fill(dsResult)

        Me.WIP_COSTSDataGridView.DataSource = dsResult.Tables(0)

        Dim RecordCount As Integer
        RecordCount = Me.WIP_COSTSDataGridView.RowCount
        Label4.Text = RecordCount

    Catch ex As System.Exception
        System.Windows.Forms.MessageBox.Show _
        ("There was an error in generating the DataStream, " & _
        "please check the system credentials and try again. " &_ 
        "If the problem persists please contact your friendly " &_ 
        "local IT department.")
    End Try

    ' // end of line

Я также думал, что мне нужно будет внести изменения в фактическую хранимую процедуру, но это оказалось неправильно.

Код может быть не очень красивым, и мне нужно больше работать в моем блоке TRY для лучшей обработки ошибок; но это работает.

Спасибо всем, кто присоединился и помог мне встать на путь.

0 голосов
/ 18 марта 2009

Андрейк,

Вот вся хранимая процедура. И наш Firebird - это версия 1.5.3, написанная с использованием IbExpert версии 2006.12.13, диалект 3

Begin
For
select pn, pnm.description, si_number, entry_date, cmp_auto_key, parts_flat_price,
       labor_flat_price, misc_flat_price, woo_auto_key, wwt_auto_key
  from parts_master pnm, wo_operation woo
 where pn like :i_pn || '%'
   and pnm.pnm_auto_key = woo.pnm_auto_key
  into :pn, :description, :work_order, :entry_date, :cmp, :parts_price,
       :labor_price, :misc_price, :woo, :wwt

Do begin
   labor_hours = null;
   work_type = null;
   parts_cost = null;
   labor_cost = null;
   ro_cost = null;
   customer = null;

   select company_name
     from companies
    where cmp_auto_key = :cmp
     into :customer;

   select work_type
     from wo_work_type
    where wwt_auto_key = :wwt
     into :work_type;

   select sum(sti.qty*stm.unit_cost)
     from stock_ti sti, stock stm, wo_bom wob
    where sti.wob_auto_key = wob.wob_auto_key
      and sti.stm_auto_key = stm.stm_auto_key
      and wob.woo_auto_key = :woo
      and sti.ti_type = 'I'
      and wob.activity <> 'Work Order'
      and wob.activity <> 'Repair'
     into :parts_cost;

   select sum(sti.qty*stm.unit_cost)
     from stock_ti sti, stock stm, wo_bom wob
    where sti.wob_auto_key = wob.wob_auto_key
      and sti.stm_auto_key = stm.stm_auto_key
      and wob.woo_auto_key = :woo
      and sti.ti_type = 'I'
      and wob.activity = 'Repair'
     into :ro_cost;

   select sum(wtl.hours*(wtl.fixed_overhead+wtl.variable_overhead+wtl.burden_rate)),
          sum(wtl.hours)
     from wo_task_labor wtl, wo_task wot
    where wtl.wot_auto_key = wot.wot_auto_key
      and wot.woo_auto_key = :woo
     into :labor_cost, :labor_hours;

   suspend;
   end
End

Жесткий код - я ответил в комментариях на ваше предложение.

0 голосов
/ 18 марта 2009

Попробуйте изменить это:

FBConn.CreateCommand.Parameters. & _
        Add("@I_PN", FirebirdSql.Data.FirebirdClient.FbDbType.Text). & _
        Value = TextBox1.Text

... на это:

FBCmd.Parameters.AddWithValue("@I_PN", TextBox1.Text)

По сути, вы хотите добавить параметры хранимой процедуры в объект Command, а не в объект Connection.

...