Autor Beitrag
Dimadon
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 19:57 
Hallo Zusammen,

ich habe hier ein Pronblem mit dem Übertrag bzw. dem auslesen meiner Ergebnisse. Meine Datenbankabfrage sieht wie folgt aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
 public static async Task<IList<String>> GetDocumentsAsync(string ProjectDocument)
        {
            IList<string> documents = new List<string>();
            using (SqlConnection conn = Connection.connection())
                try
                {

                    SqlCommand command = new SqlCommand("SELECT DocumentURL FROM dbo.projectdocuments WHERE Zuordnung= @Document;", conn);
                    conn.Open();
                    command.Parameters.AddWithValue("@Document", ProjectDocument);
                    SqlDataReader reader = command.ExecuteReader();

                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            Document d = new Document();
                            d.setDocumentURL(reader.GetString(0));
                            d.setZuordnung(reader.GetString(1));
                            documents.Add(d.getDocumentURL());


                            await reader.ReadAsync();
                            {
                                
                                return documents;
                            }
                        }

                    }
                    else
                    {
                        return null;
                    }
                    reader.Close();
                    conn.Close();
                }

                catch (Exception e)
                {

                    
                }
            return null;
Anschließend soll das Ergebnis an diese Methode übertragen werden:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
 private static async Task<IList<string>> GetDocument(string ProjectDocument)
        {
            
            IList<string> result;
            result = await DocumentBot_Database.GetDocumentsAsync(ProjectDocument);
            

            if (result == null)
            {
                IList<string> documentFail = new List<string>();
                documentFail.Add("Es konnten mit deiner Eingabe: \"{0}\" leider keine passenden Dokumente gefunden werden.");
                documentFail.Add(ProjectDocument);
         
                return documentFail;
            }
            else
            {
                IList<string> documentResult = new List<string>();
                documentResult.Add("Es wurdem folgende Dokumente für dich gefunden: {1}");
                documentResult.Add(ProjectDocument);

                string finalString = string.Join(",", documentResult, result);
                return documentResult;


            }

        }

Kann mir eventuell hier jemand weiterhelfen? Ich bekommen aktuell leider auf kein Ergebnis.

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Sa 07.01.2017 um 09:58
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1704
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 06.01.17 20:25 
Guten Abend Dimadon und Willkommen.

Sei so gut und formatiere bitte den Code ein wenig leserlicher, damit man dir auch besser helfen kann:
ausblenden Quelltext
1:
[cs]DeinCodeAusschnitt[/cs]					

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20111
Erhaltene Danke: 1939

Win 10
C# (VS 2015)
BeitragVerfasst: Fr 06.01.17 21:17 
Hallo und :welcome:!

Nur zum Verständnis, welcher Methode sollte welches Ergebnis liefern und tut dies aber nicht?

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 22:29 
Hallo Zusammen,

das Problem liegt im Return meiner Liste documents. Das Programm steigt bei documents.Add(d.getDocumentURL()); aus und ich weiß nicht warum.

Was mir noch aufgefallen ist, das bei setzen von d die URL dem falschen Paramter(Zuordnung) zugeordnet wird....
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20111
Erhaltene Danke: 1939

Win 10
C# (VS 2015)
BeitragVerfasst: Fr 06.01.17 22:44 
Was zuerst mal auffällt ist, dass Du im SQL nur eine Spalte selektierst, aber zwei lesen willst. Das kann ja schon mal nicht funktionieren.

Dann stellt sich die Frage, was das Reader.ReadAsync() bewirken soll und ob das return danach richtig ist.

Und wieso baust Du Instanzen der Klasse Document zusammen, wenn Du doch nur Strings rausgeben willst?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 22:57 
Ich möchte prinzipiell alle Einträge aus der Spalte DocumentuRL die als Zuordnung den übergebenen Wert besitzen in eine Liste übergeben und diese anschließend per Return ausgeben.

Den Async.reader habe ich genommen da ich bei einer Async Methode ja await einfügen muss, oder wie lößt man dies? Ich wäre hier echt froh wenn mir hier jemand helfen kann :(

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

Eine weitere Frage wäre es natürlich ob man das eleganter Lösen kann ohne eine neue Instanz aufzubauen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20111
Erhaltene Danke: 1939

Win 10
C# (VS 2015)
BeitragVerfasst: Fr 06.01.17 23:09 
Wenn Du nur die DocumentURLs haben willst, dann packe auch nur die in die Ergebnisliste, dann brauchst Du keine Instanzen der Document-Klasse erstellen.

Irgendwo einen sinnlosen Aufruf einzubauen, nur um eine Methode asynchron deklarieren zu können ist ... nun ja ... sinnlos. Wenn Du keinen sinnvolle Stelle findest, macht die Methode nicht asynchron.

Und es bleibt die Frage, was das return in der Schleife soll.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 23:16 
Danke für den Hinweis:

Wenn ich das jetzt so machen:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
public static async Task<IList<String>> GetDocumentsAsync(string ProjectDocument) 

IList<string> documents = new List<string>(); 
using (SqlConnection conn = Connection.connection()) 
try 


SqlCommand command = new SqlCommand("SELECT DocumentURL FROM dbo.projectdocuments WHERE Zuordnung= @Document;", conn); 
conn.Open(); 
command.Parameters.AddWithValue("@Document", ProjectDocument); 
SqlDataReader reader = command.ExecuteReader(); 

if (reader.HasRows) 

while (reader.Read()) 


documents.Add(reader["DocumentURL"].ToString()); 


await reader.ReadAsync(); 


return documents; 




else 

return null

reader.Close(); 
conn.Close(); 
}

Bekomme ich laut Debugger keine Ergebnisse?
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1704
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 06.01.17 23:28 
Und wenn du es so machst:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// ...
if (reader.HasRows) 

    while (reader.Read()) 
    {
        string s = (string)reader["DocumentURL"];
        documents.Add(s);
    }
    return documents;
// ...

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 23:31 
Beim Debuggen ist mir gerade aufegefall das ich einen System.InvalidCastException Fehler bekommen bei conn.open()

Meine zugehörige Verbindung sieht so aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
 public class Connection
    {

        private static SqlConnection con = null;

        private static String connString = "url";

        public static SqlConnection connection()
        {
           
            if (con == null)
            {
                try
                {
            
                    con = new SqlConnection(connString);

                }
                catch (Exception e)
                {
                    con = null;
                    return null;
                }

            }


            return con;

        }
    }
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 06.01.17 23:39 
Vielen Dank Frühlingsrolle..laut Debugger bekomme ich ein Ergebis...Ich weiß aber leider noch nicht ob es mehere sind da meine Ausgabe noch nicht passt...

Ich habe die Übergabe so gelöst nur bin ich mir noch bei der string.Join Lösung nicht ganz klar, wie ich diese an die Return-Anweisung übergebe:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
private static async Task<IList<string>> GetDocument(string ProjectDocument)
        {
            
            IList<string> result;
            result = await Document_Database.GetDocumentsAsync(ProjectDocument);
            

            if (result == null)
            {
                IList<string> documentFail = new List<string>();
                documentFail.Add("Es konnten mit deiner Eingabe: \"{0}\" leider keine passenden Dokumente gefunden werden.");
                documentFail.Add(ProjectDocument);
         
                return documentFail;
            }
            else
            {
                IList<string> documentResult = new List<string>();
                documentResult.Add("Es wurden folgende Dokumente für dich gefunden: {1}");
                documentResult.Add(ProjectDocument);

                string finalString = string.Join(",", documentResult, result);
                return documentResult;


            }

        }


Ok Edit:

Wenn ich den return nur auf result stelle bekomme ich eine URL raus. Laut meiner DB müssten aber in diesem Fall zwei Einträge übergeben werden.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1704
Erhaltene Danke: 307

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 07.01.17 00:42 
1.) System.InvalidCastException sagt dir, dass in der betreffenden Zeile eine ungültige Typenunwandlung stattgefunden hat.
Welche das genau ist, kannst nur du wissen.
2.) Bezüglich des ConnectionStrings, vergiss nicht auf den @-Operator, sofern du die Slashes "Einfach" angibst:

ausblenden C#-Quelltext
1:
2:
3:
string s = @"...C:\..."// gilt ebenso für Urls
//oder
string s = "...C:\\...";

3.) Ein String-Format macht nur dann Sinn, wenn dafür auch ein Wert zugewiesen wird:

ausblenden C#-Quelltext
1:
2:
string name = "Dimadon";
string ausgabe = String.Format("Dein Name ist {0}"name);

4.) In der GetDocument-Task kannst du dir die 2 Listen (documentFail, documentResult) sparen.
Wenn du den result gegen null prüfst, so kannst du jene Meldung gleich an den Anfang der Liste (Index = 0) setzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// ...
string meldung = "";

if (result == null)
    meldung = String.Format("Es konnten mit deiner Eingabe: \"{0}\" leider keine passenden Dokumente gefunden werden.", ProjectDocument);
else
    meldung = "Es wurden folgende Dokumente für dich gefunden: ";

result.Insert(0, meldung); 

return result; // ...


5.) string.Join(",", ...) fasst alle List-Einträge zu einem string zusammen, wobei hier noch ein Komma dazwischen kommt. D.h. es wird eine Art Komma-Text ausgegeben.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 07.01.17 01:07 
Super vielen Dank für deine Hilfe...Der Übertrag funktioniert laut Debugger soweit. Es werden beide Datensätze im result gespeichert. Kannst du mir eventuell noch verraten wie ich die beiden jetzt noch returenen kann?

Derzeit bekomme ich nur den ersten raus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
 private static async Task<IList<string>> GetDocument(string ProjectDocument)
        {
            
            IList<string> result;
            result = await DocumentBot_Database.GetDocumentsAsync(ProjectDocument);
            

            if (result == null)
            {
                IList<string> documentFail = new List<string>();
                documentFail.Add("Es konnten mit deiner Eingabe: \"{0}\" leider keine passenden Dokumente gefunden werden.");
                documentFail.Add(ProjectDocument);
         
                return documentFail;
            }
            else
            {
                IList<string> documentResult = new List<string>();
                documentResult.Add("Es konnten folgende Dokumente für dich gefunden werden: {1}");
                documentResult.Add(ProjectDocument);
                
                return result;
Dimadon Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 07.01.17 01:37 
Frühlingsrolle...vielen lieben Dank. Habe die Ausgabe mit einem String Join hinbekommen. Danke für deine Hilfe!!