SqlHelper und benutzerdefinierte Tabellentypen mit SQL Server 2008

Martin Zeller.net, sql server Leave a Comment

Arbeitest du mit SQL Server 2008, SqlHelper und benutzerdefinierten Tabellentypen und erhältst folgende Fehlermeldung?
[text]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.[/text] Wichtig beim SqlHelper ist bei dieser Fehlermeldung, dass du den CommandType angibst. So wie hier:
[csharp] // C#
dr = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "MyProcedureName", sqlParams);
[/csharp] Die andere Fehlermeldung, mit der ich Bekanntschaft schließen durfte, war:
[text]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.[/text] Erhältst du diese Meldung, dann solltest du eventuell den SqlDbType deiner übergebenen Liste auf SqlDbType.Structured setzen. Siehe hier:
[csharp]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);[/csharp] 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

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.