Autor Beitrag
MarcinD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows 7 Ultimate (64Bit)
VS2008 Prof. - C#
BeitragVerfasst: So 26.12.10 20:02 
Hallo zusammen,

ich habe ein Problem beim Abfragen des Datum per ODBCCommand auf einen SQL Server 2008.

Ich habe eine .dll, die den Connect managed. Ich übergeben dort einen ODBCCommand (SQL + Parameter) und erhalte einen Datatable. Nun habe ich eine Tabelle, in der ein Gueltig_Bis Datum drin ist. Dieses ist vom Datentyp in der SQLServer Datenbank ein Datetime.

Wenn ich nun folgendes generiere und übergebe, erhalte ich ein Datatable mit 0 Rows, obwohl 100%ig Datensätze zu diesen Kriterien vorhanden sind.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
OdbcCommand cmd_Sicht_Verfuegbar = new OdbcCommand();
DataTable dt_Sicht_Verfuegung = new DataTable();

//Definieren der SQL-String mit dem die Verfügbaren Sichten gefüllt werden
cmd_Sicht_Verfuegbar.CommandText = "SELECT Bezeichnung FROM KVP_Kostenrechnungssichten WHERE gueltig_bis <= ?";
cmd_Sicht_Verfuegbar.Parameters.AddWithValue("@Gueltig_Bis", DateTime.Today);

//Laden der DataTable
dt_Sicht_Verfuegung = DBLayer.GetDataTable_OhneAenderungen(cmd_Sicht_Verfuegbar);

//Füllen der Listbox, in der die zur Verfügung stehenden Mandanten vorhanden sind
foreach (DataRow locDrSichtVerfuegbar in dt_Sicht_Verfuegung.Rows)
{
   this.lbSichten_Verfuegbar.Items.Add(locDrSichtVerfuegbar["Bezeichnung"].ToString());
}


Ich glaube, es liegt an den Date Format. In der Datenbank steht das Datum als 2099-01-01 00:00:00.000 und das Programm zeigt beim durchsteppen 26.12.2010 00:00:00 .
Liegt es daran? Wie kann ich dieses Problem beheben und das Datum korrekt abfragen? Oder leigt es an etwas anderem?

P.S. Sollte die Frage kommen, wieso ich nicht den SQLClient nutze:
Ich möchte dieses Tool Datenbankunabhängig machen. Im Moment erstelle ich einen ODBC Command und übergebe diesen an die .dll, die den Connect managed und die Daten holt. Diese .dll greift auf eine .dsn Datei zurück, die im System angelegt wird. Man kann also beim Anlegen der .dsn Datei entscheiden ob man den SQLNativeClient nutzt (für SQLServer) oder den OracleClient (für Oracle).
Somit bleibt das Programm immer gleich und die .dsn Datei entscheidet auf welche Datenbank man zugreift.

Soweit mein Plan. Aber vielleicht gibt es da einen Haken, den ich bislang nicht gesehen habe.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: So 26.12.10 21:17 
Hallo,

habe mal ein bisschen rumprobiert. Ist mal ganz entspannend nach dem ganzen Weihnachtstrubel :?
Musste erstmal ziemlich mit dem ConnectionString rumprobieren, um mich mal mit meinem lokalen Server connecten zu können. Ist halt ungewohnt, per ODBC auf den Server zuzugreifen. Beim Select scheint ja alles korrekt zu sein. Und an dem Datumsformat dürfte es nicht liegen, da DateTime vom Server = DateTime C# ist.
Hast Du mal probiert, was der Command zurückliefert, wenn Du die Daten mit einen OleDbDataReader einliest? Ist mal so 'ne Idee, dass es ja auch an der dll liegen könnte...
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
string connString = "provider=sqloledb;Data Source=DEIN SERVER;Initial Catalog=DEINE DATENBANK;Trusted_Connection=yes";
using (OleDbConnection conn = new OleDbConnection(connString))
{
  conn.Open();
  OleDbCommand cmd = new OleDbCommand("SELECT Bezeichnung FROM KVP_Kostenrechnungssichten WHERE gueltig_bis <= ?", conn);
  cmd.Parameters.AddWithValue("@Gueltig_Bis", DateTime.Today);
  OleDbDataReader reader = cmd.ExecuteReader();
  while (reader.Read())
  {
    string x = reader[0].ToString();    
  }
}

Marko
MarcinD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34

Windows 7 Ultimate (64Bit)
VS2008 Prof. - C#
BeitragVerfasst: Mo 27.12.10 16:44 
Hallo,

Danke Trashkid2000 für Deine Mühen, und schonmal im Voraus "Sorry". :oops:

Nachdem ich jetzt eben den ganzen Code umgeschrieben habe um OleDB zu testen und dort das gleiche Ergebnis kam, habe ich angefangen hier eine Antwort zu schreiben. Nach ca. 4 Screenshots, die drin waren und 25 kopierten Codezeilen, habe ich mir den Text in der Vorschau angeschaut.

Und ich weiß nicht, ob es der vorweihnachtsburnout war, oder was los war, aber Ihr dürft mich alle mal auslachen und die Eselsmütze aufsetzen.

Es ist ein logischer Fehler. Wenn etwas gültig ist, dann ist das gueltig_bis Datum doch größer als heute, und nicht kleiner. :oops:
Oh man was für ein Mist. Ist mir tierisch peinlich. Und nochmals danke Trashkid für Deine Mühen.

Habe mindestens einen Tag verloren, weil ich voll in die falsche Richtung gelaufen bin.