Problema al inyectar un parámetro VB en un procedimiento almacenado (FireBird)
-
19-08-2019 - |
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
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.