Announcement

Collapse
No announcement yet.

SQL Server: richtiger Datentyp für Datum/Uhrzeit?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Server: richtiger Datentyp für Datum/Uhrzeit?

    Hallo Leute,

    länger nichts mehr voneinander gehört.

    Ich habe schon hin- und hergegoogelt, aber ich komm auf kein sinnvolles Ergebnis. Ich möchte gerne die Daten (pl. Datum) ohne Uhrzeit, und die Uhrzeit ohne Sekunden aus der Datenbank über Visual Studio auslesen. Hierfür nutze ich SQL Server Management Studio 2014 und Visual Studio 2015 Community.

    In der Datenbank wird das Datum zwar ohne Uhrzeit angezeigt, aber in Visual Studio hängt er immer noch 00:00:00 als Zeit ran:

    http://www2.pic-upload.de/img/30408838/Unbenannt.png

    Um die Relation auszulesen verwende ich folgende Methode:
    Code:
        public class TicketOrderSQL
        {
            public DataTable GetMatches()
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = @"Data Source=server;Initial Catalog=STADION;Persist Security Info=True;User ID=Stadion;Password=*****";
                SqlCommand selecter = new SqlCommand();
    
                selecter.Connection = conn;
                selecter.CommandText = "SELECT * FROM Match";
    
                conn.Open();
    
                SqlDataAdapter dataAdapter = new SqlDataAdapter(selecter);
                var dataTable = new DataTable();
    
                dataAdapter.Fill(dataTable);
                conn.Close();
    
                return dataTable;
            }
          }
    Und hier fülle ich die DataGridView:
    Code:
        public partial class TicketOrder : Form
        {
            TicketOrderSQL ticketOrderSQL = new TicketOrderSQL();
    
            public TicketOrder()
            {
                InitializeComponent();
    
                DataTable games = ticketOrderSQL.GetMatches();
    
                foreach (DataRow game in games.Rows)
                    dgwGames.Rows.Add(game[0], game[1], game[2], game[3], game[4], game[5]);
            }
         }
    Liegt die falsche Anzeige am Datentyp im SQL Server? Oder dichtet sich Visual Studio an dieser Stelle einfach die Uhrzeit 00:00:00 dazu? Wie könnte ich das unterbinden?

    Und achja nebenbei.... Meint ihr, die Programmierweise ist so in Ordnung mit der Klasse und dem Aufruf? In der View (Form) greife ich über Indexern blind auf die DataRow zu. Ist das so üblich, oder sollte ich noch eine Klasse für die einzelnen Spiele anlegen? Denn würde meine GetMatches()-Methode den Typ "Spiel" zurückgeben, statt der DataTable.

    MfG

  • #2
    Und achja nebenbei.... Meint ihr, die Programmierweise ist so in Ordnung mit der Klasse und dem Aufruf? In der View (Form) greife ich über Indexern blind auf die DataRow zu. Ist das so üblich, oder sollte ich noch eine Klasse für die einzelnen Spiele anlegen? Denn würde meine GetMatches()-Methode den Typ "Spiel" zurückgeben, statt der DataTable.
    Kann man so machen. Würde ich es so machen? Nein. Es gibt aber so viele verschiedene Wege das zu lösen so das ein typisiertes Ding am Ende raus kommt das ich die hier nicht alle nennen kann. Wenn du die Daten aus einer untypisierten DataTable in Klassen umkopieren wolltest dann würde ich sagen lass es lieber so wie es jetzt ist. Die Version mit manuellen Umfüllen ist nur minimal besser. Zumindest nur sowenig besser das der Aufwand nicht lohnt. Wenn es ein so großes Projekt ist das du den Faden verlierst weil du irgendwo die Daten holst und an andere Stelle auf die Daten per Index zugreifst dann solltest du eh gleich ganz anders vorgehen und 2, 3 Schritte zurückgehen und neu ansetzen.
    Hier solltest du eher erstmal auf die einfachen Sachen achten die man falsch machen kann und Probleme bereiten. Z.B. die Kombination aus 'Select *' und dann nachher per Index auf die Zeilen zugreifen schreit förmlich schon nach Ärger. Gewöhne dir erstmal den * ab und benenne die Spalten die du haben willst. Daneben kannst du auch die DataTable direkt an das Grid binden und mußt nicht blöd in einer Schleife umfüllen. Einfach
    [HIGHLIGHT=C#]dgwGames.DataSource = ticketOrderSQL.GetMatches();[/HIGHLIGHT]

    Das Problem mit der Anzeige ist simpel es gibt keinen Datentyp für Datum ohne Uhrzeit weder im SqlServer noch in .Net. Du bekommst immer ein DateTime Object und ob die Uhrzeit angezeigt wird oder nicht hängt davon ab wie du die für die Anzeige formatierst. Oder nochmal anders gesagt man kann nur strings anzeigen. Jeder andere Datentyp muß in einen string konvertiert werden und man muß explizit steuern wie konvertiert sonst bekommt man implizit das Standard string Format für einen Datentyp. Bei DateTime ist der nun mal mit Uhrzeit.

    Wenn du explizit Spalten in deinem Grid angelegt hast solltest du das Format im Designer festlegen. Im Designer die Column auswählen und am DefaultCellStyle die Format Property passend setzen. Für nur Datum wäre das einfach "d".
    Wenn du dir die Spalten implizit erzeugen lässt dann im Code

    [HIGHLIGHT=C#]dgwGames.DataSource = ticketOrderSQL.GetMatches();
    dgwGames.Columns["meinLieberSpaltenNameSoWieIchIhnAuchImSQLSelectGe nanntHabe"].DefaultCellStyle.Format = "d";[/HIGHLIGHT]

    Comment


    • #3
      Soweit mir bekannt ist date unter mssql das reine Datum. Ist in andern System u.U. nicht so.
      Ich nutze die von Dir genannten Programme nicht, aber ich vermute, dass bei Deiner "Select * from" Anweisung automatisch ein Typ (und halt nicht der passenste) an das Feld gebunden wird.
      Die Uhrzeit wird also nicht dazu erfunden (es kommt ja wohl immer 00:00) raus, sondern es ist wohl eher ein Formatierungsproblem bei der Ausgabe des Datums.
      Also wäre clientseitig eine passend(er)e Typbindung für das Feld notwendig oder alternativ eine gezielte Formatierung der Ausgabe, so wie Du es haben möchtest.

      Meine Empfehlung wäre sowieso, Datum und Uhrzeit in einem Feld gemeinsam zu speichern, damit kann man später einfacher rechnen (wenn es nötig ist), man muss nicht immer 2 Felder zusammenbauen, um Differenzen zu berechnen oder Stichtage, Wochenanfänge usw.
      Ist in Deinem Fall vielleicht nicht nötig, musst Du selber entscheiden.
      Gruß, defo

      Comment

      Working...
      X