Pregunta

Todos aquí siempre han sido de gran ayuda, ya sea directa o indirectamente. Y es con gran esperanza que esto, una vez más, suena cierto.

Por razones de aclaración, el Procedimiento almacenado se ejecuta en FireBird y el VB es de la variedad .NET

Tengo un procedimiento almacenado (extracto a continuación, un bit importante es el DÓNDE)

  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

Estoy tratando de pasar un parámetro de una aplicación vb, que usa el parámetro I_PN, cuyo código sigue a continuación (Las variables para MyServer y MyPassword se determinan forman una parte anterior del código).

    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

Cuando ejecuto la VB.App e intento ejecutar el programa, aparece el siguiente error:

  

Error de SQL dinámico
  Código de error SQL = -206
  Columna Desconocida
  I_PN
  En la línea 1, columna 29

Y no puedo identificar cuál es el problema real. Es decir, no sé si mi lógica es incorrecta en el lado VB o en el Procedimiento almacenado.

Cualquier codificación que se incluya se incluye a partir de ejemplos que he encontrado con varios bits de código encontrados durante largas estadías de GoogleFu.

Como cualquier persona con más de un mes o dos de experiencia (a diferencia de mí) con VB puede dar fe con solo una mirada: mi código es probablemente bastante malo y no está bien formado, ciertamente no es elegante y seguramente operacional. Ciertamente estoy entreteniendo todos los sabores de consejos con los brazos abiertos.

Como de costumbre, si tiene más preguntas, las responderé lo mejor que pueda.

Gracias de nuevo.

Jasoomian

¿Fue útil?

Solución

Después de un poco de replanteamiento y un poco más de investigación, finalmente conseguí que mi código funcionara ...

        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

También pensé que tendría que hacer cambios en el procedimiento almacenado real, pero resultó ser incorrecto.

El código puede no ser bonito, y necesito hacer más trabajo en mi bloque TRY para un mejor manejo de errores; pero funciona.

Gracias a todos los que intervinieron y me ayudaron a encaminarme.

Otros consejos

Intenta cambiar esto:

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

... a esto:

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

Básicamente, desea agregar parámetros de procedimientos almacenados al objeto Comando, no al objeto Conexión.

Andreik,

Aquí está todo el procedimiento almacenado. Y nuestro Firebird es la Versión 1.5.3, escrita con IbExpert versión 2006.12.13, Dialecto 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: respondí en los comentarios a su sugerencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top