C# a ukládání do Acces databáze

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Verxes 8. 4. 2008 22:14

Zdravím, po nějaké době co jsem vše ukládal do souborů jsem se rozhodl naučit se ukládat do databáze. Jenže po prolistování knih a hledání na internetu jsem nenašel žádnej návod pro "lamy", jak to teda funguje.
Jde mi o editování, mazání, přidávání do databáze, kterou jsem si vytvořil v Accesu a připojil na formulářovou aplikaci.
Zkrátka nejjednodušší postup ukládání do databáze. Kdyby jste někdo měl odkaz, nebo mi to osvětlil.

Dám příklad:
Zkusil jsem si dát na formulář listBox a textBoxy, v listBoxu jsem dal tu šipečku a zaškrtnul checkbox use databound item, pak jsem v tom samém okně přidal databázi do projektu, zvolil celou všechny tabulky a vybral zobrazovaný údaj. Na každém textBoxu jsem v properties vybral v (DataBindings), jak za Tag tak za Text požadovaný údaj - už se mi tam příslušný BindingsSource objevil, ve kterém jsem jen vybral tabulku a položku. Takto jsem to udělal pro všechny TextBoxy..
Po spuštění se data zobrazí korektně, po kliknutí na jinou položku v listBoxu se textBoxy samy aktualizují na příslušný údaj.. takže to je ok..
Jak se teď ale dělá aktualizace dat?
Aplikace si po tom postupu co jsem udělal sama vytvořila TableAdapter a DataSet. Pokud jsem hledal dobře, tak TableAdapter by měl metodou update aktualizovat databázi ne? Jako parametr jsem mu předal ten Dataset, ale nic, kosa na kámen :-(

Závěr:
Potřebuji vysvětlit postup při ukládání do databáze, co by mělo všechno být v reakci na klik na tlačítko?
Jak spolu souvisejí ty pojmy TableAdaptér(zprostředkovává spojení s databází a DataSet ne?), DataSet(je "nakešovaná" databáze do paměti?).. hledal jsem hledal, to v závorkách jsem pochopil a našel, zkusil jsem přepsat hodnoty v textBoxexh a po kliku zavolat table adaptér s metodou update a parametr jsem dal ten DataSet co se vytvořil implicitně, pak dataset.acceptchanges, ale žádné změny se neprojevili..

Omlouvám se za delší topic, ale jsem už zoufalej a potřebuju jeden krátkej, jednoduchej a dobře vysvětlenej způsob spolupráce s databází, za odkazy na dobré postupy na nettu, nebo kdyby mi někdo někam hodil jednoduchej projekt - jeden, dva textboxy, navázané na položky v tabulce Acces databáze a tlačítko na uložení změn, smazání, přidání... abych to viděl v praxi.. :'( :-S
Verxes
Junior

Odeslat příspěvekod Verxes 8. 4. 2008 22:58

Tak ještě doplnění. Opravdu jsem hledal co jsem mohl, nenašel.
Nakonec jsem se pokusil do reakce na tlačítko přidat záznam dát toto:

Kód: Vybrat vše
private void btnPridat_Click(object sender, EventArgs e)
        {         
            DataTable tabulka = studentsDataSet.Tables["studenti"];
            DataRow novy_radek = tabulka.NewRow();
            novy_radek["Prijmeni"] = txtPrijmeni.Text;
            novy_radek["Jmeno"] = txtJmeno.Text;
            novy_radek["Ulozka 1"] = txtUlozka1.Text;
            novy_radek["Ulozka 2"] = txtUlozka2.Text;
            novy_radek["Ulozka 3"] = txtUlozka3.Text;
            novy_radek["Ulozka 4"] = txtUlozka4.Text;
            novy_radek["Ulozka 5"] = txtUlozka5.Text;
            novy_radek["Poznamka"] = txtPoznamka.Text;
            tabulka.Rows.Add(novy_radek);
   
            studentiTableAdapter.Update(studentsDataSet);
            MessageBox.Show("Aktualizováno ", "Úspěšná aktualizace"); 
        }


Výsledek je pořád stejný, prvek se přidá, ale do DTB se neuloží :-(
Verxes
Junior

Odeslat příspěvekod squad_leader 8. 4. 2008 23:54

Vyhledávání v anglickém internetu jste zkoušel ?

http://msdn2.microsoft.com/en-us/library/aa288452(VS.71).aspx

Kód: Vybrat vše
using System;
using System.Data;
using System.Data.OleDb;
using System.Xml.Serialization;

public class MainClass {
    public static void Main ()
    {
            // Set Access connection and select strings.
            // The path to BugTypes.MDB must be changed if you build
            // the sample from the command line:
#if USINGPROJECTSYSTEM
            string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\..\\BugTypes.MDB";
#else
            string strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BugTypes.MDB";
#endif
            string strAccessSelect = "SELECT * FROM Categories";

            // Create the dataset and add the Categories table to it:
            DataSet myDataSet = new DataSet();
            OleDbConnection myAccessConn = null;
            try
            {
                  myAccessConn = new OleDbConnection(strAccessConn);
            }
            catch(Exception ex)
            {
                  Console.WriteLine("Error: Failed to create a database connection. \n{0}", ex.Message);
                  return;
            }

            try
            {
           
                  OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect,myAccessConn);
                  OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand);

                  myAccessConn.Open();
                  myDataAdapter.Fill(myDataSet,"Categories");

            }
            catch (Exception ex)
            {
                  Console.WriteLine("Error: Failed to retrieve the required data from the DataBase.\n{0}", ex.Message);
                  return;
            }
            finally
            {
                  myAccessConn.Close();
            }

            // A dataset can contain multiple tables, so let's get them
            // all into an array:
            DataTableCollection dta = myDataSet.Tables;
            foreach (DataTable dt in dta)
            {
            Console.WriteLine("Found data table {0}", dt.TableName);
            }
         
            // The next two lines show two different ways you can get the
            // count of tables in a dataset:
            Console.WriteLine("{0} tables in data set", myDataSet.Tables.Count);
            Console.WriteLine("{0} tables in data set", dta.Count);
            // The next several lines show how to get information on
            // a specific table by name from the dataset:
            Console.WriteLine("{0} rows in Categories table", myDataSet.Tables["Categories"].Rows.Count);
            // The column info is automatically fetched from the database,
            // so we can read it here:
            Console.WriteLine("{0} columns in Categories table", myDataSet.Tables["Categories"].Columns.Count);
            DataColumnCollection drc = myDataSet.Tables["Categories"].Columns;
            int i = 0;
            foreach (DataColumn dc in drc)
            {
                  // Print the column subscript, then the column's name
                  // and its data type:
                  Console.WriteLine("Column name[{0}] is {1}, of type {2}",i++ , dc.ColumnName, dc.DataType);
            }
            DataRowCollection dra = myDataSet.Tables["Categories"].Rows;
            foreach (DataRow dr in dra)
            {
                  // Print the CategoryID as a subscript, then the CategoryName:
                  Console.WriteLine("CategoryName[{0}] is {1}", dr[0], dr[1]);
            }
     
   }
}


Bez ohledu na to, co tvrdí nějaká praštěná psychložka o češtině na Nově ve Zprávách, když fušujete do díla programátorům, tak je Vám irelevantní čeština k ničemu ! Čeština pouze dělá problémy v kódování.
String value
squad_leader
Junior
Uživatelský avatar

Odeslat příspěvekod spajdo 9. 4. 2008 02:18

aj takto sa to da napriklad spravit... ;-)


Kód: Vybrat vše
        private void btn_add_Click(object sender, EventArgs e)
        {
            string appPath = Application.StartupPath;
            string connectionString = @"provider=Microsoft.Jet.OLEDB.4.0;data source = " + appPath + "\\DATABAZA.mdb;Jet OLEDB:Database Password=HESLO";
            OleDbConnection conn = new OleDbConnection(connectionString);
            string commandString = "INSERT INTO TABULKA VALUES('nieco1','nieco2','nieco3'...)";
            OleDbCommand dotaz = new OleDbCommand();
            dotaz.CommandText = commandString;
            dotaz.Connection = conn;

            dotaz.Connection.Open();
            dotaz.ExecuteNonQuery();
            dotaz.Connection.Close();


        }
"I cesta dlhá tisíc kilometrov sa začína prvým krokom."
spajdo
Junior
Uživatelský avatar

Odeslat příspěvekod mudrakp 9. 4. 2008 09:10

riesil som nieco porobne pred casom s kamosom, ktory mal podobny problem, myslel si ako ty ze to bude updatovat automaticky ...

takze nasledovne (EXAMPLE):

SqlCommand command = new SqlCommand(
"UPDATE Customers SET CustomerID = @CustomerID, CompanyName = @CompanyName " +
"WHERE CustomerID = @oldCustomerID", connection);

// Add the parameters for the UpdateCommand.
command.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
command.Parameters.Add("@CompanyName", SqlDbType.NVarChar, 40, "CompanyName");
SqlParameter parameter = command.Parameters.Add("@oldCustomerID", SqlDbType.NChar, 5, "CustomerID");

adapter.UpdateCommand = command;

//az teraz treba zavolat ten tvoj update
adapter.Update();

vyznas sa v tom trochu? ak treba pomoct viac, daj vediet ...

PS: tiez sa mi zda ze miesas insert a update. Tak napis co vlastne chces ...
mudrakp
Kolemjdoucí

Odeslat příspěvekod petrusek 9. 4. 2008 16:04

tady mas ukazkovou aplikaci v ktere jsem nenapsal ani pismenko kodu - cele je to jenom naklikane v designeru asi za 2minuty, vsechno za mne "napsalo" visualstudio a dela asi neco takoveho co chces...
Nevim presne jak je to v express edici, ale v normalnim studiu kde je k dispozici nastroj "Data Sources" se to takhle da udelat a kdyz obslehnes ten kod co to generuje tak to zkompilujes i v expressu.
petrusek
Junior
Uživatelský avatar

Odeslat příspěvekod Verxes 9. 4. 2008 21:52

Tak díky všem za příspěvky, pomalu jsem to začal zkoušet a docela se daří, nakonec jsem ale kvůli pochopení udělal nový projekt a vše co se týká připojení a updatu jsem napsal kódem - udělal jsem si 2 textBoxy a tlačítko a dal do stisku na tlačítko následující kód:
Kód: Vybrat vše
  OleDbConnection pripojeni = new OleDbConnection();
            pripojeni.ConnectionString = "Provider=" + "Microsoft.Jet.OLEDB.4.0;Data Source=" +  "D:\\C#\\ZKOUSIM_DB\\Zkusebni.mdb;";
            pripojeni.Open();
           
            OleDbCommand prikaz = new OleDbCommand();
            prikaz.CommandText="INSERT INTO tabulkaJedna VALUES('5','"+textBox1.Text+"','"+textBox2.Text+"')";
            prikaz.Connection = pripojeni;
            prikaz.ExecuteNonQuery();
            prikaz.Connection.Close();

Jediné co by mě zajímalo, jak do řádku:
prikaz.CommandText="INSERT INTO tabulkaJedna VALUES('5','"+textBox1.Text+"','"+textBox2.Text+"')";
- ta 5ka co tam je - na této pozici se nachází v databázi ID a příkaz prikaz.ExecuteNonQuery(); mi pyskoval že nesouhlasí počet položek, tak jak tam dát aby dal automatické ID?
dík
Verxes
Junior

Odeslat příspěvekod spajdo 9. 4. 2008 22:02

no neviem ci sa na toto pitas ale jeden zo sposobov je selectom si najskor zistit ake je maximalne ID v tabulke a potom ho len jednoducho incrementovat zakazdym....
"I cesta dlhá tisíc kilometrov sa začína prvým krokom."
spajdo
Junior
Uživatelský avatar

Odeslat příspěvekod Verxes 9. 4. 2008 22:40

spajdo píše:no neviem ci sa na toto pitas ale jeden zo sposobov je selectom si najskor zistit ake je maximalne ID v tabulke a potom ho len jednoducho incrementovat zakazdym....

Jo, toby šlo.. zatím udělám tak, dík, já jen jestli třeba na to tvůrci už nějakým implementovaným příkazem nemysleli.
zatim dík, určitě ještě další dotazy přibudou :shock: 8-D 8-)
Verxes
Junior

Odeslat příspěvekod petrusek 10. 4. 2008 00:09

Kód: Vybrat vše
prikaz.CommandText="INSERT INTO tabulkaJedna(sloupeca, sloupecb) VALUES('"+textBox1.Text+"','"+textBox2.Text+"')";

...pokud nechces vyplnit vsechny sloupce, musis vyjmenovat ty, ktere vyplnit chces
petrusek
Junior
Uživatelský avatar

Odeslat příspěvekod Verxes 10. 4. 2008 09:49

petrusek píše:
Kód: Vybrat vše
prikaz.CommandText="INSERT INTO tabulkaJedna(sloupeca, sloupecb) VALUES('"+textBox1.Text+"','"+textBox2.Text+"')";

...pokud nechces vyplnit vsechny sloupce, musis vyjmenovat ty, ktere vyplnit chces

Jo paráda, ID si to vyplňuje samo.. dík
Verxes
Junior

Odeslat příspěvekod petrusek 10. 4. 2008 10:53

no a v dalsim levelu muzes zkusit:

Kód: Vybrat vše
OleDbConnection pripojeni = new OleDbConnection("Provider=" + "Microsoft.Jet.OLEDB.4.0;Data Source=" + "D:\\C#\\ZKOUSIM_DB\\Zkusebni.mdb;");
OleDbCommand prikaz = new OleDbCommand("INSERT INTO tabulkaJedna(sloupeca, sloupecb) VALUES(?,?)", pripojeni);
prikaz.Parameters.AddWithValue("", textBox1.Text);
prikaz.Parameters.AddWithValue("", textBox2.Text);
pripojeni.Open();
prikaz.ExecuteNonQuery();
pripojeni.Close();


a uz se pomalu zacnes priblizovat tomu, co za tebe muze vygenerovat ten designer kdyz to jenom naklikas mysi...

Jinak kdyby slo o neco jineho nez OleDb, tak by se nepouzil "?" jako zastupny symbol pro parametr, ale byl by tam ten parametr pojmenovany a jeho oznaceni by muselo figurovat i v tom AddWithValue namisto "", takze neco jako:
Kód: Vybrat vše
SqlCommand prikaz = new SqlCommand("INSERT INTO tabulkaJedna(sloupeca, sloupecb) VALUES(@param1,@param2)", pripojeni);
prikaz.Parameters.AddWithValue("@param1", textBox1.Text);
prikaz.Parameters.AddWithValue("@param2", textBox2.Text);
petrusek
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků