Pass-Tabelle mit dem Wert der Parameter an die gespeicherte Prozedur mit PetaPoco
Während ich versuche zu rufen, SQL Server 2008 R2 gespeicherte Prozedur mit PetaPoco.
Meine gespeicherten Prozedur akzeptiert eine table valued Parameters.
Wie kann ich rufen Sie die gespeicherte Prozedur in petapoco mit Tabelle Wert param?
Hier, was ich versuche zu tun:
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);
Dieser code gibt mir eine Ausnahme :
Der eingehende tabular data stream (TDS) remote procedure call (RPC) Protokollablauf falsch ist.
Parameter 3 ("@0"): Daten-Typ 0x62 (sql_variant) hat eine ungültige Art für Typ-spezifische Metadaten.
Wenn ich parametar ty Wert
param.SqlDbType = SqlDbType.Structured;
Dann bekomme ich die exception wie
The table type parameter '@0' must have a valid type name.
Wenn ich definiere meine param-wie
param.SqlDbType = SqlDbType.Structured;
param.SqlValue = table;
param.ParameterName = "@art_id";
param.TypeName = SqlDbType.Structured.ToString();
Dann bekomme ich die exception
Spalte, parameter oder variable @0. : Cannot find-Datentyp Strukturiert.
Wie kann ich definieren SqlParam
mit table valued Parameter, so kann ich senden Sie es whit Daten auf SQL Server?
Lösung:
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
- Ich kann zwar nicht sagen, die oben nicht funktioniert. Ich konnte nicht einen benannten parameter arbeiten in meiner Lösung. Ich landete gerade dabei ein @0 statt. db.Query<Es>("INNER JOIN @0 rowIds AUF ...", param).ToList()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der entsprechenden MSDN-Dokumentation für Tabellenwert-parameter, die Sie verwenden sollten:
Den
SqlDbType.Structured
ist der Schlüssel dazu. Verwenden Sie nichtDbType.Object
.