2009-03-17 2 views
1

Все здесь всегда были такой большой помощью, прямо или косвенно. И это с большой надеждой, что это, опять же, звучит правдоподобно.Проблема с введением параметра VB в хранимую процедуру (FireBird)

Для получения разъяснений пользы, хранимые процедуры выполняются под 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 и попытаться запустить программу, я получаю следующее сообщение об ошибке:

Dynamic SQL Error
SQL Error Code = -206
Column Unknown
I_PN
At Line 1, column 29

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

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

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

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

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

Jasoomian

ответ

1

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

 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

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

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

... к этому:

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

В принципе, вы хотите добавить параметры хранимых процедур для объекта Command, а не соединения объект.

+0

HardCode - до сих пор нет радости. По-прежнему получает ту же ошибку во время выполнения. – Jasoomian

+0

Я не знаю синтаксиса SPs Firebird, но этот оператор - где pn like: i_pn || '%' - похоже, что он говорит «LIKE параметр OR%» - вместо - «LIKE параметр, связанный с%». Должно ли это быть «где pn like: i_pn + '%» – HardCode

+0

В Firebird || является символом конкатенации, поэтому код уже делает то, что вы предложили (по крайней мере, таким образом). – Jasoomian

0

Andreik,

Здесь представлена ​​хранимая процедура. И наша 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 

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

Смежные вопросы