DbCommandSetDataProvider Klick auf die 1:1 Relation im Designer führt zum Fehler

Die Anzeige der Relationen erfolgt auf den Klick auf die Relation:


provider.AddCommand(new SqlCommand("SELECT accountid, ..., totallineitemdiscountamount, totaltax, totaltax_base FROM invoice WHERE invoiceid='xxxx903d-fe13-ed11-b83d-xxxxxxxxxxxx'", _cn), "invoice"); provider.AddCommand(new SqlCommand(SELECT accountid, ... , address1_line2, address1_line3, new_umsatzsteueridnummer FROM account), _cn), "account"); provider.AddRelation($"invoice2account", "account", "invoice", "accountid", "accountid");

usw.

Was mache ich falsch? :wink:

Hi Karsten, ohne jetzt tiefer in das Log zu schauen oder die Query, ändert den

provider.MinimalSelect = false;

etwas?

Hi Erdal,

das habe ich schon probiert. Leider ohne Erfolg. Ich habe das schon hier im Forum für einen anderen Fall gefunden. :frowning:

Welches DB-System/Treiber wird hier angebunden?

Sonst schau mal hier AddCommand an… da gibt es eine Überladung was die Trennzeichen angeht:

Es wird SQL-Server (System.Data.SqlClient) verwendet. Leider kein Erfolg:

Debwin4::CSV::V1;TypeCode;Timestamp;Level;Logger;Thread;Properties;Message
▪;1000;30.11.2022 14:50:34.960;1;LL.NetFX;69D0;100:2=CXLL28♦101:1=4;   ERR:Caught SqlException (The parameterized query '(@LLKeyVal0 nvarchar(4000),@userid uniqueidentifier,@privilegeDe' expects the parameter '@LLKeyVal0', which was not supplied.

Code:
       public DbCommandSetDataProvider Provider(string entityName, string id)
        {
            var resultProvider = new DbCommandSetDataProvider();
            var sqlDefinitions = JsonConvert.DeserializeObject<dynamic>(File.ReadAllText(@"Invoicesql.json"));

            resultProvider.AddCommand(new SqlCommand(string.Format(sqlDefinitions[entityName].sql.ToString(), id), _connection), entityName, "\"{0}\"", "@{0}");

            foreach (var subTable in sqlDefinitions[entityName].subtables)
            {
                resultProvider.AddCommand(new SqlCommand(subTable.definition.sql.ToString(), _connection), subTable.name.ToString(), "\"{0}\"", "@{0}");
                resultProvider.AddRelation($"{entityName}2{subTable.name}", subTable.name.ToString(), entityName, subTable.definition.key.ToString(), subTable.definition.parentkey.ToString());
            }

            return resultProvider;
        }


Die “Subtablellen” werden korrekt angezeigt, aber nicht bei der Relation in “invoice”.

invoicesql.zip (791 Bytes)

Schonmal mit Parameter versucht

command.Parameters.AddWithValue(“@invoiceid”, “irgendwas”);

Nun da haben Sie recht! Das gehört sich auch so. Die Ersetzung ist definitiv “böse” (SqlInjection). Ich glaube das Problem gefunden zu haben: Wenn keine Datensätze in der Relation verfügbar sind, kommt es zu dem Fehler (accountid in invoice = null). Da muss ich für den Designer in diesem Fall “künstliche” Datensätze erzeugen.
… oder gibt es eine andere Möglichkeit?

Wir müssten einmal versuchen, das nachzustellen. An sich sollte in diesem Fall automatisch eine leere Schemarow verwendet werden. Geben Sie uns bitte kurz Zeit, wir melden uns hier wieder :slight_smile:.

Hallo ich habe einmal geschaut ob die Schemata abrufbar sind. Daran liegt es wohl nicht, alle Schemas konnten abgerufen werden:

        public DbCommandSetDataProvider Provider(string entityName, string id)
        {
            var resultProvider = new DbCommandSetDataProvider();
            var sqlDefinitions = JsonConvert.DeserializeObject<dynamic>(File.ReadAllText(@"C:\Users\k.krieger\source\repos\DocumentServicesWeb\DataDefinitions\Invoicesql.json"));

            var mainTableCommand = new SqlCommand(sqlDefinitions[entityName].sql.ToString(), _connection);

            TestSchema(sqlDefinitions[entityName].sql.ToString(), new SqlParameter("@invoiceid", id));

            mainTableCommand.Parameters.AddWithValue("@invoiceid", id);

            resultProvider.AddCommand(mainTableCommand, entityName, "\"{0}\"", "@{0}");

            foreach (var subTable in sqlDefinitions[entityName].subtables)
            {
                var subTableSql = subTable.definition.sql.ToString();
                TestSchema(subTableSql);
                subTableSql = subTableSql + " UNION " + subTableSql.Replace(",", ", '' AS ").Replace("SELECT", "SELECT TOP(1) '00000000-0000-0000-0000-000000000000' AS "); 
                resultProvider.AddCommand(new SqlCommand(subTableSql, _connection), subTable.name.ToString(), "\"{0}\"", "@{0}");
                resultProvider.AddRelation($"{entityName}2{subTable.name}", subTable.name.ToString(), entityName, subTable.definition.key.ToString(), subTable.definition.parentkey.ToString());
            }


            return resultProvider;
        }

        private void TestSchema(string sqlText, SqlParameter parameter = null)
        {
            var cmd = new SqlCommand(sqlText, _connection);
            if (parameter != null)
                cmd.Parameters.Add(parameter);

            var reader = cmd.ExecuteReader();

            var schema = reader.GetSchemaTable();

            reader.Close(); 
        }

Ja, aus irgendeinem Grund scheint das in dem von Ihnen oben genannten Fall nicht zu klappen. Wenn Sie uns direkt eine kleine Testanwendung haben, mit der Sie das reproduzieren können wäre das super, wir versuchen parallel aber einmal, genau diesen Fall nachzubauen - ggf. schicken wir Ihnen sonst (wenn wir es nicht reproduziert bekommen) unser Beispiel zum “kaputtmachen” :slight_smile:.

Hallo Jochen,
vielen Dank für die Unterstützung, das Problem wird die Anmeldung am SQL-Server sein. Zur Not müsste man das mit einer “leeren” Datenbank nachstellen. Ich probiere das mal.

1 Like

Hallo Herr Krieger,

wir haben uns das Verhalten angeschaut und können es nicht nachstellen. In diesem Fall bräuchten wir tatsächlich ein minimiertes Beispiel, mit welchen sich das Verhalten nachstellen lässt. Wäre es möglich, dass Sie uns ein solches Beispiel über das Supportportal zur Verfügung stellen?

Grüße vom Bodensee

Hallo Herr Rauchfuß, den Supportfall habe ich erstellt. Vielen Dank! Liebe Grüße

In den SQL-Anweisungen waren neben Feldern auch Formeln (… CASE WHEN… AS …) . Das hat das Problem verursacht. Combit hat das Problem erkannt und in einer Vorabversion auch gelöst. Also ab dem nächsten Update, denke ich, ist das dann für alle Verfügbar. Bis da hin hilft es in diesem Fall eine Sicht zu erstellen…
Super.

2 Likes

Vielen Dank Herr Krieger für die zielführende Zusammenarbeit und das Feedback.

Und genau so ist es wie Sie sagen Herr Krieger: Es ist geplant im nächsten Service Pack der Version 28 von List & Label die entsprechend Anpassung auszuliefern. Sollte Vorabversion jemand jedoch früher eine Version zu diesem Szenario benötigen, so kann gerne jederzeit auf uns aktiv zugegangen werden.