2009-03-17 8 views
1

Jeder hier war schon immer eine große Hilfe, entweder direkt oder indirekt. Und es ist mit großer Hoffnung, dass dies wieder einmal wahr ist.Problem beim Eingeben eines VB-Parameters in eine gespeicherte Prozedur (FireBird)

Zur Klarstellung sakes wird die gespeicherte Prozedur unter Firebird läuft und der VB ist die .NET Vielzahl

Ich habe eine gespeicherte Prozedur (Auszug unten, wichtige Bit ist die 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 

ich versuche, einen Parameter aus einer vb app passieren, die den Parameter I_PN verwendet, den Code von der unten folgt (die Variablen für MyServer und MyPassword sind einen früheren Teil des Codes bestimmt Form.)

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 

Wenn ich die VB.App ausführen und versuchen, das Programm auszuführen, bekomme ich folgende Fehler:

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

Und ich kann ganz meinen Finger nicht setzen auf das, was das eigentliche Problem ist. Das heißt, ich weiß nicht, ob meine Logik auf der VB-Seite oder auf der Stored Procedure falsch ist.

Jede Codierung, die enthalten ist, wird aus Beispielen zusammengefügt, die ich mit verschiedenen Code-Stücken gefunden habe, die während langer Aufenthalte von GoogleFu gefunden wurden.

Als jemand mit mehr als einem Monat oder zwei Erfahrung (im Gegensatz zu mir) mit VB kann nur mit einem Blick bestätigen - mein Code ist wahrscheinlich ziemlich beschissen und nicht gut geformt - sicherlich nicht elegant und sicher in Betrieb. Ich bin auf jeden Fall mit offenen Armen in allen Geschmacksrichtungen.

Wie üblich, wenn Sie weitere Fragen haben, werde ich sie nach besten Kräften beantworten.

Nochmals vielen Dank.

Jasoomian

Antwort

1

Nach ein wenig Umdenken und ein bisschen mehr Forschung, Ich habe endlich meinen Code arbeiten ..

 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 

dachte ich auch habe, dass ich brauche, um Änderungen an der tatsächlichen gespeicherten Prozedur machen würde, aber es stellte sich falsch sein.

Der Code möglicherweise nicht schön, und ich muss mehr Arbeit in meinem TRY-Block für eine bessere Fehlerbehandlung; Aber es funktioniert.

Vielen Dank an alle, die hereingeschlüpft sind und mir geholfen haben, auf Kurs zu kommen.

0

Versuchen Sie, diese zu ändern:

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

... dazu:

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

Grundsätzlich Sie Parameter für gespeicherte Prozeduren zu dem Command-Objekt hinzufügen möchten, nicht die Verbindung Objekt.

+0

HardCode - immer noch keine Freude. Immer noch den gleichen Fehler zur Laufzeit erhalten. – Jasoomian

+0

Ich kenne nicht die Syntax von Firebirds SPs, aber diese Aussage - wo pn wie: i_pn || '%' - sieht so aus, als würde es sagen "LIKE der Parameter OR%" - anstatt - "LIKE der mit% verkettete Parameter". Sollte es vielleicht "wo pn wie: i_pn + '%'" – HardCode

+0

In Firebird, die || ist das Verkettungszeichen, also tut der Code bereits, was Sie vorgeschlagen haben (zumindest auf diese Weise.) – Jasoomian

0

Andreik,

Hier ist die gesamte gespeicherte Prozedur. Und unsere Firebird ist Version 1.5.3, geschrieben mit IBExpert Version 2006.12.13, 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 - ich in den Kommentaren auf Ihren Vorschlag reagiert.