2009-03-17 10 views
1

Tout le monde ici a toujours été d'une aide précieuse, directement ou indirectement. Et c'est avec grand espoir que cela, encore une fois, sonne vrai.Problème lors de l'injection d'un paramètre VB dans une procédure stockée (FireBird)

Pour l'amour de clarification, la procédure stockée est en cours d'exécution sous FireBird et le VB est de la variété .NET

J'ai une procédure stockée (extrait ci-dessous, peu important est WHERE)

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 

J'essaie de passer un paramètre d'une application vb, qui utilise le paramètre I_PN, dont le code suit ci-dessous (Les variables pour MyServer et MyPassword sont déterminées à partir d'une partie antérieure du code.)

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

Quand je l'exercerai VB.App et essayez d'exécuter le programme, je reçois l'erreur suivante:

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

Et je ne peux pas à mettre le doigt sur ce que le problème réel est. Ce qui signifie, je ne sais pas si ma logique est incorrecte sur le côté VB, ou, sur la procédure stockée.

Tout codage inclus est regroupé à partir d'exemples que j'ai trouvés avec divers bits de code trouvés au cours de longs séjours de GoogleFu. Comme n'importe qui avec plus d'un mois ou deux d'expérience (contrairement à moi) avec VB peut attester d'un simple coup d'œil - mon code est probablement assez moche et pas bien formé - certainement pas élégant et assurément opérationnel. Je suis certainement en train de divertir toutes les saveurs de conseils à bras ouverts.

Comme d'habitude, si vous avez d'autres questions, je vais y répondre au mieux de mes capacités.

Merci encore.

Jasoomian

Répondre

1

Après un peu Rethinking et un peu plus de recherche, je me suis enfin mon code de travail ..

 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 

J'avais aussi pensé que je aurais besoin d'apporter des modifications à la procédure stockée réelle, mais cela se dehors pour être incorrect.

Le code peut ne pas être joli, et je dois faire plus de travail dans mon bloc TRY pour une meilleure gestion des erreurs; mais ça marche.

Merci à tous ceux qui m'ont chuchoté et m'a aidé à me mettre en bonne voie.

0

Essayez de changer cette situation

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

... à ceci:

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

Fondamentalement, vous voulez ajouter des paramètres de procédure stockée à l'objet de commande, pas la connexion objet.

+0

HardCode - toujours pas de joie. Vous recevez toujours la même erreur lors de l'exécution. – Jasoomian

+0

Je ne connais pas la syntaxe des SP de Firebird, mais cette déclaration - où pn aime: i_pn || '%' - On dirait qu'il est dit "LIKE le paramètre OR%" - au lieu de - "LIKE le paramètre concaténé avec%". Devrait-il être "où pn comme: i_pn + '%'" – HardCode

+0

Dans Firebird, le || est le caractère de concaténation, donc, le code fait déjà ce que vous avez suggéré (au moins de cette manière.) – Jasoomian

0

Andreik,

Voici la procédure stockée entière. Et notre Oiseau de feu est la version 1.5.3, écrite avec la version IBExpert 13/12/2006, Dialect 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 

hardcode - Je lui ai répondu dans les commentaires à votre suggestion.