8

Per mentre sto cercando di richiamare la procedura memorizzata di SQL Server 2008 R2 utilizzando PetaPoco.Parametro valore tabella passata a stored procedure utilizzando PetaPoco

La mia stored procedure accetta un parametro con valori di tabella.

Come posso chiamare la procedura memorizzata in petapoco con valore tabella param?

Ecco quello che sto cercando di fare:

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); 

Questo codice mi dà un'eccezione:

Il flusso di dati tabulari in ingresso (TDS) Remote Procedure Call (RPC) flusso del protocollo non è corretto .
Parametro 3 ("@ 0"): il tipo di dati 0x62 (sql_variant) ha un tipo non valido per i metadati specifici del tipo.

Se ho impostato il valore Ty Parametar

param.SqlDbType = SqlDbType.Structured; 

Allora ottengo eccezione come

The table type parameter '@0' must have a valid type name. 

Quando definisco il mio param come

  param.SqlDbType = SqlDbType.Structured; 
      param.SqlValue = table; 
      param.ParameterName = "@art_id"; 
      param.TypeName = SqlDbType.Structured.ToString(); 

allora ottengo un'eccezione

Colonna, parametro o variabile @ 0. : Impossibile trovare il tipo di dati strutturato.

Come posso definire SqlParam con valori di tabella param modo che io possa inviare briciolo di dati in SQL Server?

Soluzione:

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 

risposta

4

Secondo il relevant MSDN documentation on table-valued parameter, è necessario utilizzare:

var param = new SqlParameter(); 
param.SqlDbType = SqlDbType.Structured; 

Il SqlDbType.Structured è la chiave di questo. Non utilizzare DbType.Object.

+0

L'ho fatto e ora ho un'eccezione diversa – adopilot

+0

Sono passato attraverso, Grazie di aiuto Guarda le mie modifiche per favore – adopilot

Problemi correlati