SqlHelper und benutzerdefinierte Tabellentypen mit SQL Server 2008

Martin Zeller .net, sql server 0 Comments

Arbeitest du mit SQL Server 2008, SqlHelper und benutzerdefinierten Tabellentypen und erhältst folgende Fehlermeldung?

Der eingehende Tabular Data Stream (TDS) für das 
RPC-Protokoll (Remote Procedure Call) ist nicht richtig.
Tabellenwertparameter ('@xxx'), Zeile n, Spalte n: 
Für den Datentyp xxx (benutzerdefinierter Tabellentyp) wurde ein 
Datenbankname mit einer Nicht-Null-Länge angegeben. Der Datenbankname 
ist mit einem Tabellenwertparameter nicht zulässig. Es sind nur ein 
Schemaname und ein Typname gültig.

Wichtig beim SqlHelper ist bei dieser Fehlermeldung, dass du den CommandType angibst. So wie hier:

// C#
dr = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "MyProcedureName", sqlParams);

Die andere Fehlermeldung, mit der ich Bekanntschaft schließen durfte, war:

Es ist keine Zuordnung zwischen dem Objekttyp 
System.Collections.Generic.List`1[[Microsoft.SqlServer.Server.SqlDataRecord, System.Data, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
und einem bekannten verwalteten systemeigenen Providertyp vorhanden.

Erhältst du diese Meldung, dann solltest du eventuell den SqlDbType deiner übergebenen Liste auf SqlDbType.Structured setzen. Siehe hier:

List<SqlDataRecord> datList = new List<SqlDataRecord>();
SqlMetaData[] tvp_definition = { new SqlMetaData("n", SqlDbType.BigInt) };
foreach (MyDataInfo dat in datas)
{
  SqlDataRecord rec = new SqlDataRecord(tvp_definition);
  rec.SetInt64(0, dat.SomePropertyId);
  datList.Add(rec);
}
SqlParameter[] sqlParams = new SqlParameter[1];
SqlParameter param = new SqlParameter("@MyParameter", datList);
param.Direction = ParameterDirection.Input;
param.TypeName = "long_list_tbltype"; // long_list_tbltype ist ein von mir definierter Tabellentyp
param.SqlDbType = SqlDbType.Structured; // IMPORTANT!!!
sqlParams[0] = param;

dr = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, GetFullyQualifiedName("MyProcedureName"), sqlParams);

Ich bin auf diese Probleme gestoßen, weil ich eine generische Liste an eine Procedure übergeben wollte. Wie das geht, siehst du in diesem Artikel: Arrays and Lists in SQL Server

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.