Autor Beitrag
mutterholzbein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47
Erhaltene Danke: 1

[Win XP pro,Win 7pro, Ubuntu 10.04]
[MS Visual Studio 2008 pro TeamSystem,VS-2010-Ultimate [C, C++ (u.a. mit QT4), C#, PHP]
BeitragVerfasst: Do 01.12.11 14:03 
Hallo Community,


ich habe ein Problem mit einem Tool für einen Kunden von uns, und hoffe Ihr könnt mir weiterhelfen. Dieses Tool erzeugt eine CSV-Datei anahnd einer gespeicherten Abfrage aus einer Access-DB.
Um das Tool so allgemeingültig wie möglich zu halten habe ich einen COUNT Befehl integriert um die Größe der später benötigten Arrays dynamisch anpassen zu können. Soweit so gut, nun kam aber das Problem auf, dass bei einer Abfrage mit nur einem Resultat (in Acces getestet) ich trotzdem einen Wert zurück bekomme der größer ist als er sein kann/darf!

In der Db gibt es eine Abfrage die Produkte mit ean usw. aus vielen anderen Abfragen korrekt holt und erzeugt. Wenn ich jetzt aber eine Testabfrage mache:
ausblenden Quelltext
1:
SELECT * FROM [NAME_DER_ABFRAGE] WHERE product_id='123';					

bekomme ich genau ein Resultat (klar), allerdings im Tool, und das ist das Problem, erhalte ich einen Wert von 776 (was der korrekte Wert aus NAME_DER_ABFRAGE ist) wenn ich folgendes OleDbCommand nutze:
ausblenden C#-Quelltext
1:
...count = new OleDbCommand("SELECT COUNT(*) AS cnt FROM [" + NAME_DER_TESTABFRAGE + "]", verb);					

. Ausgewertet wird die Abfrage über einen OleDbDataReader in einer while-Schleife:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
OleDbDataReader cnt = count.ExecuteReader();
...
while (cnt.Read())
{
    val = cnt["cnt"].ToString();// val = cnt[0].ToString();
#if DEBUG
    lbResult.Items.Add(val);
#endif
}
cnt.Close();


Wenn ich die gleiche COUNT-Abfrage in Access mache bekomme ich das korrekte Resultat (1).. wo liegt also mein Fehler? :shock:

Danke für eure Hilfe...

greetz, me
lothi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: Do 01.12.11 15:10 
Hallo
ExcecuteScalar ist für einen einzelnen Wert gedacht. Dann brauchst du keine Schleife.

Ich versteh jetzt nicht was du Genau haben willst oder nicht geht.
Zitat:

Wenn ich die gleiche COUNT-Abfrage in Access mache bekomme ich das korrekte Resultat (1).. wo liegt also mein Fehler?


Was willst du denn jetzt 1 oder 722?

Gruss Lothi
mutterholzbein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47
Erhaltene Danke: 1

[Win XP pro,Win 7pro, Ubuntu 10.04]
[MS Visual Studio 2008 pro TeamSystem,VS-2010-Ultimate [C, C++ (u.a. mit QT4), C#, PHP]
BeitragVerfasst: Do 01.12.11 16:26 
Hoi,

nun ja, am besten wäre natürlich die korrekte Ausgabe, in dem Bsp. also 1 (welche sich ja, z.b. abhängig von der WHERE-Klausel, ändern kann).
ExecuteScalar() hatte ich zu Beginn drin -> selbes Ergebnis.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 01.12.11 17:09 
Hi,

also eine (gespeicherte) Access-Abfrage wird ja als Stored Procedure abgelegt.
Also musst Du diese auch so aufrufen.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
  using (OleDbCommand command = conn.CreateCommand())
  {
    command.CommandType = CommandType.StoredProcedure;
    command.CommandText = NAME_DER_TESTABFRAGE;

    ...
  }  
}
Die Einschränkungen könntest Du z.B. als Parameter an die SP übergeben.
mutterholzbein Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 47
Erhaltene Danke: 1

[Win XP pro,Win 7pro, Ubuntu 10.04]
[MS Visual Studio 2008 pro TeamSystem,VS-2010-Ultimate [C, C++ (u.a. mit QT4), C#, PHP]
BeitragVerfasst: Fr 02.12.11 10:58 
hmm,

werde das nochmal prüfen... Aber ist es nicht eigentlich so, das wenn eine Abfrage im dem SQL-String mit eckigen Klammern eingeschlossen ist, diese schon als gespeicherte Abfrage markiert ist und auch erkannt wird?

Danke erstmal für den Denkanstoß.

greetz, me