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