8

Podczas gdy próbuję wywołać procedurę przechowywaną SQL Server 2008 R2 przy użyciu PetaPoco.Przekaż wartość parametru tabeli do procedury przechowywanej przy użyciu PetaPoco

Moja procedura przechowywana przyjmuje parametr o wartości w tabeli.

Jak mogę wywołać procedurę przechowywaną w petapoco z parametrem wartości tabeli?

Oto co próbuję zrobić:

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

Ten kod daje mi wyjątek:

Strumień przychodzących danych tabelarycznych (TDS) zdalnego wywoływania procedur (RPC) strumień protokołu jest niepoprawna .
Parametr 3 ("@ 0"): Typ danych 0x62 (sql_variant) ma nieprawidłowy typ dla metadanych specyficznych dla typu.

Jeżeli ustawić parametar wartość TY

param.SqlDbType = SqlDbType.Structured; 

Potem dostać wyjątek jak

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

Kiedy definiować moje param jak

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

Potem dostać wyjątek

Kolumna, parametr lub zmienna @ 0. : Nie można znaleźć typu danych Strukturalnych.

Jak mogę zdefiniować SqlParam z wartością ustaloną w tabeli, aby móc wysłać dane do SQL Server?

Rozwiązanie:

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 

Odpowiedz

4

Według relevant MSDN documentation on table-valued parameter, należy użyć:

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

SqlDbType.Structured jest kluczem do tego. Nie używaj DbType.Object.

+0

Zrobiłem to i teraz mam inny wyjątek – adopilot

+0

Przeszedłem przez, Thanx przy pomocy Zobacz moje edycje proszę – adopilot