[C#] Access DATE != DataGridView DATE ? + Daten ändern, aber wie?

Blackhawk50000

Erfahrenes Mitglied
Hallo,

Frage eins:
ich habe ein keines weiteres Problem.
Ich schreibe eine ZEIT in eine Access DB z.B. 12:45
Die Zeit gebe ich in eine MaskedTextBox ein (Format: __:__) dannach wandle ich das in DateTime um und dann in einen ShortTimeString.
Mein Feld In der Datenbank ist vom Typ DATE. So und nun habe ich die Frage. Warum steht in meinem DataGridView ein Wert wie dieser: 30.12.1899 12:45
Habe ich ein Typdreher drin, den ich selbst noch nicht gefunden habe? Braucht ihr mehr informationen oder nötigenfalls Code?

(Hat sich fast in Luft aufgelöst. es war natürlich ein String... durch ShortTimeString. Nach dem ändern des Feldtyps DATE in TEXT in der DB war alles perfekt.
doch kann man das Dennoch irgendwie als Datumstyp lassen? Denn das ist ja schon irgendwie recht unsauber!)




Frage zwei:

Wie kann ich von einer DataGridView Daten ändern und anschließend in die datenbank schreiben?

Meine Datagrid fülle ich nicht mit dem Assistenten, sondern Manuell mit Code

Code:
 private void f_Auslesen_Load(object sender, EventArgs e)
        {
            _queryString = "SELECT * FROM SMS";
            loadDataGrid(_queryString);
        }


 public void loadDataGrid(string sqlQueryString)
        {
            SQLQuery = new OleDbCommand();
            DataTable data = null;
            dataGridView1.DataSource = null;
            SQLQuery.Connection = null;
            OleDbDataAdapter dataAdapter = null;
            dataGridView1.Columns.Clear(); // <-- clear columns
            //---------------------------------
            SQLQuery.CommandText = sqlQueryString;
            SQLQuery.Connection = database;
            data = new DataTable();
            dataAdapter = new OleDbDataAdapter(SQLQuery);
            dataAdapter.Fill(data);
            dataGridView1.DataSource = data;
            dataGridView1.AllowUserToAddRows = false; // remove the null line
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //dataGridView1.ReadOnly = true;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView1.Columns[1].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            
            database.Close();
        }
 
Zuletzt bearbeitet:
Hallo

Du kannst den Datentyp auf DateTime lassen.
Einfach die Spalte im DataGridView formatieren.

Beispiel:
Code:
DataGridView1.Columns("DeinSpaltenname").DefaultCellStyle.Format = "HH:mm"
 
Danke schön =) hat funktioniert =)


nun zur zweiten frage

Frage zwei:

Wie kann ich von einer DataGridView Daten ändern und anschließend in die datenbank schreiben?

Meine Datagrid fülle ich nicht mit dem Assistenten, sondern Manuell mit Code

Code:
private void f_Auslesen_Load(object sender, EventArgs e)
        {
            _queryString = "SELECT * FROM SMS";
            loadDataGrid(_queryString);
        }


 public void loadDataGrid(string sqlQueryString)
        {
            SQLQuery = new OleDbCommand();
            DataTable data = null;
            dataGridView1.DataSource = null;
            SQLQuery.Connection = null;
            OleDbDataAdapter dataAdapter = null;
            dataGridView1.Columns.Clear(); // <-- clear columns
            //---------------------------------
            SQLQuery.CommandText = sqlQueryString;
            SQLQuery.Connection = database;
            data = new DataTable();
            dataAdapter = new OleDbDataAdapter(SQLQuery);
            dataAdapter.Fill(data);
            dataGridView1.DataSource = data;
            dataGridView1.AllowUserToAddRows = false; // remove the null line
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //dataGridView1.ReadOnly = true;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            dataGridView1.Columns[0].Visible = false;
            dataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView1.Columns[1].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            
            database.Close();
        }
 
Hallo!

Wenn ich das jetzt richtig im Kopf habe, ändert sich automatisch die DataTable da sie ja als DataSource angebunden ist. Und die DataTable kannst du via DataAdapter.Update(DataTable) in die Datenbank zurückschreiben.

Müsste so gehen... Probier mal.
 
Nein brauchst du nicht. Die DataRows in der DataTable haben einen entprechenden Status der bei einer Änderung automatisch verändert wird. Anhand dieses Status "weiss" der DataAdapter welche Rows er aktualisieren oder einfügen muss.

Guck mal in der MSDN.

Link MSDN - ODBC.DataAdapter.
 
Okay, aller letzte Frage, dann dürfte ichs haben =)

wo schreibe ich das DataAdapter.Update(DataTable) genau hin? sicher nicht in die FormLoad oder?.... sondern ehr ins Closing event nachdem ich eine MessageBox angezeigt habe?... so denk ich mir das jetzt,
und dannach schreib ich mein database.close();
 
Naja also da du für DataAdapter:Update eine Datenbankverbindung brauchst, würde ich da eine separate Funktion für schreiben. Wo du die aufrufst ist eigentlich egal. Ob über einen "Änderungen Speichern" Button, oder beim schließen des Formulars. Das ist ganz dir überlassen.
 
Okay, also jetzt steh ich auf dem Schlauch. Ich habe keine ahnung wie ich das vernünftig realisiere, dass die änderungen erst übernommen werden wenn man n Button drückt.
Hier der Code der gesammten Form.


Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace SMS_Archiv
{
    public partial class f_Auslesen : Form
    {

        #region Deklarationen
        OleDbConnection database = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + f_Hauptmenue._DatenbankPfad);
        OleDbCommand SQLQuery = new OleDbCommand();
        private string _queryString;
        #endregion

        public f_Auslesen()
        {
            InitializeComponent();
        }

       

        private void f_Auslesen_Load(object sender, EventArgs e)
        {
            _queryString = "SELECT * FROM SMS ORDER BY SMS_Datum, SMS_Zeit ASC";
            loadDataGrid(_queryString);
        }

        private void b_Close_Click(object sender, EventArgs e)
        {
            DialogResult result;
            result = MessageBox.Show(this, "Sollen alle Änderungen gespeichert werden?", "Schließen/Speichern", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

            if (result == DialogResult.Yes)
            {
                
            }

            this.Close();
        }

        private void f_Auslesen_FormClosing(object sender, FormClosingEventArgs e)
        {
            database.Close();
            f_Hauptmenue.Auslesen_Offen = false;
        }

        #region DataGridView Laden
        public void loadDataGrid(string sqlQueryString)
        {
            DataTable data = null;
            dataGridView1.DataSource = null;
            SQLQuery.Connection = null;
            OleDbDataAdapter dataAdapter = null;
            dataGridView1.Columns.Clear(); // <-- clear columns
            //---------------------------------
            SQLQuery.CommandText = sqlQueryString;
            SQLQuery.Connection = database;
            data = new DataTable();
            dataAdapter = new OleDbDataAdapter(SQLQuery);
            dataAdapter.Fill(data);
            dataGridView1.DataSource = data;
            dataGridView1.AllowUserToAddRows = false; // remove the null line
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //dataGridView1.ReadOnly = true;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            dataGridView1.Columns["ID"].Visible = false;
            dataGridView1.Columns["SMS_Text"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridView1.Columns["SMS_Text"].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
            dataGridView1.Columns["SMS_Zeit"].DefaultCellStyle.Format = "HH:mm";
            dataGridView1.Columns["SMS_Zeit"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.Columns["SMS_Datum"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopRight;
            dataGridView1.RowHeadersVisible = false;
        }
        #endregion
    }
}
 

Neue Beiträge

Zurück