+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

MS SQL DbCommandSetDataProvider Relationen


(Moshe Schmidt) #1

Hallo,

ich versuche gerade mich in List & Labels 20 einzuarbeiten. Dabei möchte ich aus einer bestehenden MS SQL Datenbank Daten abrufen und in Relation setzen. Dabei erhalte ich immer eine IndexOutOfRangeException die ich mir nicht erklären kann. Ich habe mal ein einfaches Beispiel erstellt mit dem das gleiche Problem auftritt:

CREATE TABLE [dbo].[Address](
	[nId] [int] IDENTITY(1,1) NOT NULL,
	[sStreet] [nvarchar](50) NOT NULL,
	[sCity] [nvarchar](50) NOT NULL,
	[nPersonId] [int] NOT NULL
)
CREATE TABLE [dbo].[Person](
	[nId] [int] IDENTITY(1,1) NOT NULL,
	[sName] [nvarchar](50) NULL
)

Bei diesen beiden Tabellen würde ich jetzt gerne eine Liste mit allen Adressen ausgeben, wobei auch der Name der Person enthalten ist. Soweit ich das jetzt im Selbststudium verstanden habe, muss ich um dies zu erreichen folgenden Code verwenden:

var personCommand = connection.CreateCommand();
personCommand.CommandText = "SELECT * FROM [Person]";
var addressCommand = connection.CreateCommand();
addressCommand.CommandText = "SELECT * FROM [Address]";
var providerWithRelations = new DbCommandSetDataProvider();
providerWithRelations.AddCommand(personCommand, "Person");
providerWithRelations.AddCommand(addressCommand, "Address");
providerWithRelations.AddRelation("Person2Address", "Person", "Address", "[nId]", "[nPersonId]");

Wenn ich nun den Designer mit dem Provider starte, erhalte ich eine IndexOutOfRangeException. Für die Spaltennamen der Relation habe ich schon verschiedene Varianten mit und ohne Klammern getestet.

Hat jemand eine Idee wie ich dies lösen kann oder ob es eine bessere Möglichkeit gibt, ohne die Datenbank zu verändern? Fremdschlüssel-Beziehungen kann ich leider nicht einführen.

Mit freundlichen Grüßen
Moshe Schmidt


(Günther Schwarze) #2

Kannst Du noch mal versuchen, die beiden AddRelations-Parameter für die Feldnamen ohne “[…]” zu schreiben, also einfach nur

providerWithRelations.AddRelation(“Person2Address”, “Person”, “Address”, “nId”, “nPersonId”);

Das muss - wenn es die Felder gibt - definitiv funktionieren, so mache ich es auch. Sonst würde ich mal ein Debug-Log mitlaufen lassen und schauen, welche Felder wo angemeldet werden. Da solltest Du dann auch den Stacktrace der Exception sehen können.

G.


(Moshe Schmidt) #3

Vielen Dank, das hat mich in die richtige Richtung geführt.

Ich habe die Klammern weggemacht(das hatte ich auch vorher schon probiert) und es kam der Fehler “Der mehrteilige Bezeichner ‘[Person].nId’ konnte nicht gebunden werden.” Im debug log hab ich dann gesehen, dass beim SELECT mit der Relation um die Eckigen Klammern des Tabellennamen noch " eingefügt wurden. Lasse ich die Eckigen Klammern auch aus den Commands raus funktioniert es einwandfrei.

Vielen Dank nochmal.

Vielleicht noch als Hinweis an das combit-Team: Eine IndexOutOfRangeException finde ich persönlich an dieser Stelle nicht sehr aussagekräftig.

Mit freundlichen Grüßen
Moshe


(combit - Jochen Bartlau) #4

Hallo Herr Schmidt,

da haben Sie recht :slight_smile: - ich habe eben eine Change Request für LL21 eingetragen, wir werden eine bessere Exception werfen und insbesondere den Message-Text so anpassen, dass klarer wird, wo das Problem zu suchen ist.

Viele Grüße aus Konstanz,

Jochen Bartlau