c#-4.0 - stored - ejecutar procedimiento almacenado sql server ejemplo
Pasar el parĂ¡metro de valor de la tabla al procedimiento almacenado usando PetaPoco (1)
Mientras trato de llamar al procedimiento almacenado de SQL Server 2008 R2 usando PetaPoco.
Mi procedimiento almacenado acepta un parámetro valuado de tabla.
¿Cómo puedo llamar al procedimiento almacenado en petapoco con el parámetro de tabla param?
Aquí lo que estoy tratando de hacer:
var db = new PetaPoco.Database("repikaciskaBaza");
DataTable table = new DataTable();
DataColumn id = table.Columns.Add("id", type: typeof(Int32));
for (int i = 0; i < 10;i++ )
{
DataRow row = table.NewRow();
row["id"] = i;
table.Rows.Add(row);
}
var param = new SqlParameter();
param.DbType = DbType.Object;
param.ParameterName = "@art_id";
param.SqlValue = table;
var lista = db.Query<pocoArts>(";exec dbo.test_sporc_param @0", param);
Este código me da una excepción:
La secuencia de protocolo de llamada a procedimiento remoto (RPC) de flujo de datos tabulares entrante es incorrecta.
Parámetro 3 ("@ 0"): el tipo de datos 0x62 (sql_variant) tiene un tipo no válido para los metadatos específicos del tipo.
Si configuro el valor del parámetro
param.SqlDbType = SqlDbType.Structured;
Entonces me sale una excepción como
The table type parameter ''@0'' must have a valid type name.
Cuando defino mi param como
param.SqlDbType = SqlDbType.Structured;
param.SqlValue = table;
param.ParameterName = "@art_id";
param.TypeName = SqlDbType.Structured.ToString();
Entonces recibo una excepción
Columna, parámetro o variable @ 0. : No se puede encontrar el tipo de datos Estructurado.
¿Cómo puedo definir SqlParam
con param con valores de tabla para que pueda enviarlo con datos a SQL Server?
Solución :
var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured; // According to marc_s
param.SqlValue = table;
param.ParameterName = "@art_id";
param.TypeName = "dbo.typ_art_id"; // this is TYP from SQL Server database it needs to be equal to type defined in SQL Server not type of param
De acuerdo con la documentación relevante de MSDN sobre el parámetro con valores de tabla , debe usar:
var param = new SqlParameter();
param.SqlDbType = SqlDbType.Structured;
El SqlDbType.Structured
es la clave para esto. No use DbType.Object
.