zapis do bazy danych z datagridview

0

napisałem program obsługujący baze danych jednak przycisk zapisz nie chce działac oto jego kod:

private void button2_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = @"Data Source=C:\bazadanych.mdb";
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM bazadanych", conn);
SqlCommandBuilder cb = new SqlCommandBuilder(adapter);

       adapter.Update((DataTable)dataGridView2.DataSource);
    }

progr sie kapiluje ale gdy cos dodam i chce zapisac to wywala komunikat:
unable to cast object of type'System.Windows.Forms.BindingSource' to type 'System.Data.DataTable'.

nie bardzo wiem na czym polega ten bład gdyz przedzie gdzie szukałem w wlasnie taki był updata??
Z góry dziękuje za pomoc
pzdr

0

Witam.

Myślę, że skoro pracujesz z bazą Access to powinieneś używać klasy OleDbConnection.
Co do komnikatu, to otrzymujesz informację o niezgodności typów.

Pozdrawiam.

0

tez tak próbowałem i ten sam błąd, doszedłem juz do tego ze dane dopisane sa w obiekcjie datagridview2.datasource, tylko jak ten obiekt zapisac zeby działało??
Naprawde bardz o dziekuje z góry za pomoc bo przedzie szukam i nie moge znalezc:(
pozdr

0

(DataTable)dataGridView2.DataSource – takie rzutowanie jest blednę. Możesz to rzutować do DataSet.
Jeśli powiążesz kontrolkę DataGridView z danymi „dataGridView2.DataSource = DataSet.DataTable[x]" to modyfikacje w kontrolce zostaną odzwierciedlone w powiązanym obiekcje.

DataAdapter oraz DataSet za pomocą których odczytałeś dane z bazy i powiążałeś kontrolkę zrób publiczne. Gdy będziesz chciał Updatować zmiany z DataSet do bazy danych, utworzysz CommandBuilder przekazując w argumencie konstruktora istniejący obiekt DataAdapter i updatujesz przekazując dokładnie to samo (DataSet.DataTable[x]) czym powiązałeś kontrolkę.

Mam pytanie. Odczytałeś w ogóle coś z bazy danych?

0

Tak cos sie wyswietlalo, Dziekuje za pomoc, zmieniłem tak kod, ale teraz mi przy próbie zapisu wyswietla komunikat o jakims błedzie kwerendy(?) co to w ogóle jest i skad sie wzieło Oto kod mojego programu :

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

namespace bz5
{
public partial class Form1 : Form
{

    public string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\cme.mdb";
    public string Zapytanie = "SELECT * FROM cme";
    
    DataSet DataSethh = new DataSet();
  OleDbDataAdapter AdapterKlientow = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM cme", new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\cme.mdb")));
  
   

    public Form1()
    {   
        InitializeComponent();
        AdapterKlientow.Fill(DataSethh, "cme");
        dataGridView2.DataSource = DataSethh.Tables["cme"];
       
     
         
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      
        this.cmezTableAdapter.Fill(this.cmeDataSet.cme);
                
    }

    private void button1_Click(object sender, EventArgs e)
   {
     


OleDbConnection PolaczNorthwind = new OleDbConnection(conString);
PolaczNorthwind.Open();
string Zapytanie = "SELECT * FROM cmentarz WHERE nazwisko LIKE @NazwaMiasta";
OleDbCommand Polecenie = new OleDbCommand(Zapytanie, PolaczNorthwind);
Polecenie.Parameters.Add("NazwaMiasta", textBox1.Text);
OleDbDataAdapter AdapterKlientow = new OleDbDataAdapter(Polecenie);
dataSet1.Clear(); // wyczyszczenie wyników poprzedniego zapytania
AdapterKlientow.Fill(dataSet1, "cme");
dataGridView1.DataSource = dataSet1.Tables["cme"];
PolaczNorthwind.Close();
    }
 

private void button2_Click(object sender, EventArgs e)
{

        OleDbCommandBuilder cb = new OleDbCommandBuilder(AdapterKlientow);
       AdapterKlientow.Update(DataSethh.Tables["cme"]);
     
    }
  
}

}

0

Strasznie namieszane masz. W innym Twoim temacie dałem Ci przykład szukania. Skorzystaj z niego. Jeśli już wklejasz kod wykorzystaj znaczniki cpp. Kod jest o niebo czytelniejszy.

0

Nie chce mi się wycinać istotnych fragmentów z mojego przykładu, sam dojdziesz o co biega, apropos ds mozesz stworzyć szybko używając odpowiedniego kreatora poźniej mozesz ja zoptymalizować pod swoje rzeczy inaczej musisz pobierać schemat bazy jeśli to ma być dla dowlonej, a o to i fragment

 #region Zmienne

        protected string connString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Documents and Settings\Krzysiu\Moje dokumenty\Visual Studio 2008\Projects\obsługa bazy SQL\obsługa bazy SQL\SRP.mdf;Integrated Security=True;Max Pool Size=200;Asynchronous Processing=True;Connect Timeout=30;User Instance=True";
        private BindingSource bsrc;
        private SqlConnection northwindConnection;
        private SqlDataAdapter adapter;


        #endregion

        #region DataGridView

        private void inicjuj_tabele(string sqlCommand)
        {
            try
            {
                dgv.AutoGenerateColumns = true;
                bsrc = new BindingSource();
                northwindConnection = new SqlConnection(connString);
                adapter = new SqlDataAdapter();

                SqlCommand selectCommand = northwindConnection.CreateCommand();
                SqlCommand insertCommand = northwindConnection.CreateCommand();
                SqlCommand updateCommand = northwindConnection.CreateCommand();
                SqlCommand deleteCommand = northwindConnection.CreateCommand();

                //-------------------------kierunki------------------------
                sqlCommand =
                    "SELECT id_kierunek, nazwa " +
                    "FROM kierunki";

                selectCommand.CommandText = sqlCommand; //wyswietlanie odpowiednich danych

                insertCommand.CommandText = "INSERT INTO kierunki (nazwa) VALUES (@nazwa)"; //wstawianie danych oraz parametry
                insertCommand.Parameters.Add(
                    new SqlParameter("@nazwa", SqlDbType.NVarChar, 50, "nazwa"));

                updateCommand.CommandText = "UPDATE kierunki SET nazwa = @nazwa WHERE id_kierunek = @id_kierunek"; //aktualizowanie wybranych danych
                updateCommand.Parameters.Add(
                    new SqlParameter("@id_kierunek", SqlDbType.Int, 5, "id_kierunek"));
                updateCommand.Parameters.Add(
                    new SqlParameter("@nazwa", SqlDbType.NVarChar, 50, "nazwa"));

                deleteCommand.CommandText = "DELETE kierunki WHERE id_kierunek=@id_kierunek"; //usuwanie wybranych danych
                deleteCommand.Parameters.Add(
                    new SqlParameter("@id_kierunek", SqlDbType.Int, 5, "id_kierunek"));

                bsrc.DataSource = ds.kierunki; //przypisanie tabeli danych do binding source
                //--------------------------------------------------------

                adapter.SelectCommand = selectCommand; //przypisanie odpowiednich polecen adaptera dla danych
                adapter.InsertCommand = insertCommand;
                adapter.UpdateCommand = updateCommand;
                adapter.DeleteCommand = deleteCommand;

                adapter.Fill(ds.kierunki); //wypelnienie adaptera danymi 

                dgv.DataSource = bsrc;
                //dgv.Columns[0].Visible = false; //pokazuje lub ukrywa pierwsza kol
                northwindConnection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Program wygenerował bład: \n\n" + ex.Message, "ERROR",
                    MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
        }

        #endregion

        public frm_glowne()
        {
            InitializeComponent();
        }

        #region Zdarzenia

        private void frm_glowne_Load(object sender, EventArgs e)
        {
            northwindConnection = new SqlConnection(connString); //stworzenie polaczenia
            inicjuj_tabele("");
        }

        private void bt_przeladuj_Click(object sender, EventArgs e)
        {
            dgv.ClearSelection();
            inicjuj_tabele("");
        }

        private void bt_odswiez_Click(object sender, EventArgs e)
        {
            // po zabraniu // powinno wstawiac jeden rekord
            //ds.kierunki.AddkierunkiRow(
            //    "Nowo powstały kierunek");
            adapter.Update(ds.kierunki);
            //dgv.Refresh();
        }

Zapomnialem dodac polecenie insertu w Access bedzie nie co inne np
INSERT INTO (id,kierunek) KIERUNKI VALUES ( ?, ?) prócz tego oczywiście inny connStr, ale to co tutaj masz powinno ci troche to rozjaśnić i oczywiscie na Accesa USING SYSTEM.DATA.OLEDB i adaptery itd również z tej klasy;

1 użytkowników online, w tym zalogowanych: 0, gości: 1