Insert,Update u C# i .NET

red boy

Zainteresovan član
Poruka
353
Radi mi samo select i delete...Radio sam svoj primer za projekat koji moram da nosim profesoru...
Ne izbacuje gresku,ali ne vrsi upis u bazu.Zatim sam probao sa primerom iz knjige.Isti slucaj.

Dacu bolje primer iz knjige
Kod:
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;   //for MS Access

namespace ebook2
{
    public partial class Form1 : Form
    {
        private DataTable dataTable;
        private OleDbConnection conn;
        private OleDbDataAdapter dataAdapter;
        private DataSet ds;
        private int currRec = 0;
        private int totalRec=0;
        private bool insertSelected;
    
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void FillControls()
        {
            txtID.Text=dataTable.Rows[currRec]["id"].ToString();
            txtName.Text=dataTable.Rows[currRec]["name"].ToString();
            txtLast.Text=dataTable.Rows[currRec]["lastname"].ToString();
            txtJob.Text=dataTable.Rows[currRec]["job"].ToString();

        }

        private void btnLoadTable_Click(object sender, EventArgs e)
        {
            //MS Access
            this.Cursor = Cursors.WaitCursor;
            string targetConnection="provider=Microsoft.Jet.OLEDB.4.0;data source=baza_krofni.mdb";
            conn=new OleDbConnection(targetConnection);
            string commandString="SELECT * FROM person";
             dataAdapter=new OleDbDataAdapter(commandString,conn);
             ds=new DataSet();
            dataAdapter.Fill(ds,"prog");
            dataTable=ds.Tables["prog"];
            currRec=0;
            totalRec=dataTable.Rows.Count;
            FillControls();
            InitalizeCommands();
            ToggleControls(true);

            this.Cursor=Cursors.Default;

            //btnNext.Enabled=true;
            //btnPrevious.Enabled=true;


        }
        private void InitalizeCommands()
        {
            // preparing insert OleDB command
            dataAdapter.InsertCommand = conn.CreateCommand();
            dataAdapter.InsertCommand.CommandText = "INSERT INTO person (id,name,lastname,job)" +
                                                  "VALUES (@id,@name,@lastname,@job)";
            AddParams(dataAdapter.InsertCommand, "id", "name", "lastname", "job");

            // preparing Update OleDB command
            dataAdapter.UpdateCommand = conn.CreateCommand();
            dataAdapter.UpdateCommand.CommandText = "UPDATE person SET name=@name,lastname=@lastname,job=@job WHERE id=@id";
            AddParams(dataAdapter.UpdateCommand, "id", "name", "lastname", "job");

            // preparing delete OleDB command
            dataAdapter.DeleteCommand = conn.CreateCommand();
            dataAdapter.DeleteCommand.CommandText = "DELETE FROM person WHERE id=@id";
            AddParams(dataAdapter.DeleteCommand, "id");

        }
        private void AddParams(OleDbCommand cmd, params string[] cols)
        {

            foreach (string col in cols)
            {
                cmd.Parameters.Add("@" + col, OleDbType.Char, 0, col);

            }
        }

        private void ToggleControls(bool val)
        {
            txtID.ReadOnly = val;
            txtName.ReadOnly = val;
            txtLast.ReadOnly = val;
            txtJob.ReadOnly = val;

            btnLoadTable.Enabled = val;
            btnNext.Enabled = val;
            btnPrevious.Enabled = val;
            btnDeleteRecord.Enabled = val;
            btnEditRecord.Enabled = val;
            btnInsertRecord.Enabled = val;

            btnCancel.Enabled = !val;
            btnSave.Enabled = !val;

        }  

        private void btnNext_Click(object sender, EventArgs e)
        {
            currRec++;
            if (currRec >= totalRec)
                currRec = 0;
            FillControls();
        }

        private void btnPrevious_Click(object sender, EventArgs e)

        {
            currRec--;
            if (currRec < 0)
                currRec = totalRec - 1;
            FillControls();
        }

        private void btnEditRecord_Click(object sender, EventArgs e)
        {
            ToggleControls(false);
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            lblLabel.Text = "Save changes...";
            this.Cursor = Cursors.WaitCursor;
            DataRow row = dataTable.Rows[currRec];
            row.BeginEdit();
            row["id"] = Convert.ToInt32(txtID);
            row["name"] = txtName;
            row["lastname"] = txtLast;
            row["job"] = txtJob;
            row.EndEdit();
            dataAdapter.Update(ds, "prog");
            ds.AcceptChanges();
            ToggleControls(true);
            insertSelected=false;
            this.Cursor = Cursors.Default;
            lblLabel.Text = "Save changed";


        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            if (insertSelected)
            {
                btnDeleteRecord_Click(null, null);
                insertSelected = false;
            }
            FillControls();
            ToggleControls(true);
        }

        private void btnInsertRecord_Click(object sender, EventArgs e)
        {
            insertSelected = true;
            DataRow row = dataTable.NewRow();
            dataTable.Rows.Add(row);
            totalRec = dataTable.Rows.Count;
                currRec=totalRec-1;
            row["id"]=totalRec;
            txtID.Text = totalRec.ToString();
            txtName.Text = "";
            txtLast.Text = "";
            txtJob.Text = "";
            ToggleControls(false);


        }

        private void btnDeleteRecord_Click(object sender, EventArgs e)
        {
            DialogResult res = MessageBox.Show("Da li sigurno brisete \n", "Potvrdi\n", MessageBoxButtons.YesNo);
            if (res == DialogResult.Yes)
            {
                DataRow row=dataTable.Rows[currRec];
                row.Delete();
                dataAdapter.Update(ds, "prog");
                ds.AcceptChanges();
                lblLabel.Text = "Record Deleted";
                totalRec--;
                currRec = totalRec - 1;
                FillControls();

            }
        }
    }
}
A gresku koju javlja

Unable to cast object of type 'System.Windows.Forms.TextBox' to type 'System.IConvertible'.
// Ukazuje na red

row["id"] = Convert.ToInt32(txtID);

Pre nego sto sam dodao ToInt32 ,javljao je istu gresku sa dodatkom da ocekuje convert ToInt32,a kada sam uradio skoro ista prica...

Svoj primer bolje da ne stavljam.Baza mi se nalazi u Debug pored exe verzije....
Jel ima neko ideju.Mislim da je ovo osnova povezivanja sa bazom,sta bi bilo da radim nesto komplikovanije...
 
Poslednja izmena:
Na InitializeCommands() promeni Update command sa

// preparing Update OleDB command
dataAdapter.UpdateCommand = conn.CreateCommand();
dataAdapter.UpdateCommand.CommandText = "UPDATE person SET name=@name,lastname=@lastname,job=@job WHERE id=@id";
AddParams(dataAdapter.UpdateCommand, "name", "lastname", "job");

OleDbParameter workParm = dataAdapter.UpdateCommand.Parameters.Add("@id", OleDbType.Integer);
workParm.SourceColumn = "id";
workParm.SourceVersion = DataRowVersion.Original;
 
Radi ... Hvala
Samo jel moze malo pojasnjenje.Zasto mi nije radilo,posto su primeri iz knjige??
I jos jedno pitanje.Radim obican select ,ali mi javlja gresku.Nece da proradi kod
WHERE LIKE ;
Kod:
string all = dates +""+" LIKE "+"" +"'"+values+"'";
            string S1targetConnection = "provider=Microsoft.Jet.OLEDB.4.0;data source=book.mdb";
            S1conn = new OleDbConnection(S1targetConnection);
            

            string S1commandString = "SELECT * FROM member WHERE @alls ";
            OleDbCommand SearchCommand = S1conn.CreateCommand();
           
            // definisanje vrednosti
            SearchCommand.Parameters.Add("@alls", OleDbType.Char, 50);
            SearchCommand.Parameters["@alls"].Value = all;
dates i values ,mi uredno prenose vrednosti,Npr " name" i "jovana".Proverio preko label.Text.
Problem sto mi uvek prvog ucita iz baze,ne radi LIKE.
 
Poslednja izmena:
E, sad, što se tiče objašnjenja, nisam mnogo ulazio u problematiku zašto. Ono što sam ja dobio kao objašnjenje je to, da .Net radi sa kopijom, odnosno dataset je kopija podataka originalne baze, pa u update-u moraš eksplicitno da navedeš koja je to originalna verzija! Ja sam to prihvatio i, iskreno, nisam se ni potrudio da pronađem pravi odgovor!! A drugo pitanje mi nije najjasnije, LIKE formiraš kao %values% ako hoćeš da ti izbaci sve zapise u kojima se, u koloni "name", bilo gde pojavljuje npr. "jovana"! Jesi li probao da napraviš query u bazi da vidiš šta ti vraća? Okači bazu sa nekim, bezveze, podacima.
 
Radi... puno hvala.Sada vec mogu da uradim i za knjige i da povezem forme.
Mada si mogao primetiti po onoj Labeli ,lblInfo,da mi je parametre prosledjivao...
neznam sto onako nije sljakalo...
Jos jedno pitanje vezano za prvi projekat.Ako treba stavicu isto kod.Pravio sam meni,I za File,radi close();
ili resimo radi MessageBox();
Ali... U aplikaciji sam napravio dugme dodaj novog clana.Kada kliknem na njega pokrece se samo jedan red kod,pozivanje funkcije NewAdd();
Ona ispisuje Prazne TextBox-ove,panele,i button Save.U svakom slucaju radi lagano.
Onda sam otisao u meni,napravio stavku "Novi Clan",dva puta kliknuo na nju,i isto dodao ovaj red kao za button.
Problem je kada pokrenem aplikaciju,i kliknem u File/Novi Clan,nista se ne pokrece...Kao da nisam stavio kod.
A kod dugmete radi bez problema,isti kod.
 
Poslednja izmena:
Dodeljuje ti vrednosti, ali ne prosleđuje dobro, odnosno ne znam da li uopšte možeš da tako napišeš u Accessu! Može nešto ovako: name LIKE @alls , pa parametru proslediš vrednost, to je ok, ali za ovo ne znam kako se izvodi!! Ja kad radim sa Access-om, radim onako kako sam ti već rekao, napravim svoj WHERE i dodam na upit!! Što se tiče ovog drugug, možeš da okačiš kod, al pre toga proveri da li ti je event click, da li na klik uopšte ulazi u proceduru (po onome što si ti rekao ne ulazi)!
 
Kod:
 private void oProgramuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            
            MessageBox.Show("Predmet: .NET Tehnologije \n \n"+
                            "Student: ****  \n \n"+
                            "Naziv projekta: Biblioteka \n \n"+
                            "Programcki jezik: C#");
        }

        private void izađiToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void dodajČlanaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ViewControls(3);

        }
a treba funkcija da pozove ovo

txtIDmember.ReadOnly = false;
txtUserName.BackColor = System.Drawing.Color.Gainsboro;
txtUserLast.ReadOnly = false;
txtLocation.ReadOnly = false;
txtStreet.ReadOnly = false;
txtStreetNum.ReadOnly = false;
txtBorn.BackColor = System.Drawing.Color.Gainsboro;
txtSerial.BackColor = System.Drawing.Color.Gainsboro;
txtBookName.BackColor = System.Drawing.Color.Gainsboro;
txtExpired.ReadOnly = false;
txtIDbook.ReadOnly = false;
txtBookDate.ReadOnly = false;
btnEditSaveUser.Visible = true;
 
Napravio sam za slucajeve koji su mi potrebni...

Kod:
public void ViewControls(int x) // Ponasanje kontrola TextBox
        {
            int y=x;
            if ( y==1)
            {
                txtIDmember.ReadOnly = true;
                txtUserName.ReadOnly = true;
                txtUserLast.ReadOnly = true;
                txtLocation.ReadOnly = true;
                txtStreet.ReadOnly = true;
                txtStreetNum.ReadOnly = true;
                txtBorn.ReadOnly = true;
                txtSerial.ReadOnly = true;
                txtExpired.ReadOnly = true;
                txtBookDate.ReadOnly = true;
                txtIDbook.ReadOnly = true;
                txtBookName.ReadOnly = true;
                txtUserName.BackColor = System.Drawing.Color.White;
                txtBorn.BackColor = System.Drawing.Color.White;
                txtSerial.BackColor = System.Drawing.Color.White;
                txtBookName.BackColor = System.Drawing.Color.White;
            }
            if (y== 2)
            {
                txtIDmember.ReadOnly = false;
                txtUserName.ReadOnly = false;
                txtUserLast.ReadOnly = false;
                txtLocation.ReadOnly = false;
                txtStreet.ReadOnly = false;
                txtStreetNum.ReadOnly = false;
                txtBorn.ReadOnly = false;
                txtSerial.ReadOnly = false;
                txtExpired.ReadOnly = false;
                txtBookDate.ReadOnly =false;
                txtIDbook.ReadOnly = false;
                txtBookName.ReadOnly = true;
                txtBookName.BackColor = System.Drawing.Color.Gainsboro;
            }
            if (y== 3)
            {
                txtIDmember.ReadOnly = false;
                txtUserName.BackColor = System.Drawing.Color.Gainsboro;
                txtUserLast.ReadOnly = false;
                txtLocation.ReadOnly = false;
                txtStreet.ReadOnly = false;
                txtStreetNum.ReadOnly = false;
                txtBorn.BackColor = System.Drawing.Color.Gainsboro;
                txtSerial.BackColor = System.Drawing.Color.Gainsboro;
                txtBookName.BackColor = System.Drawing.Color.Gainsboro;
                txtExpired.ReadOnly = false;
                txtIDbook.ReadOnly = false;
                txtBookDate.ReadOnly = false;
                btnEditSaveUser.Visible = true;
            }


        }
Boja je potrebna,jer pri edit-u,textbox-ovi kojima je zabranjen edit menjaju boju.a kasnije pri ponoovnom ulasku boja mora da im se vrati ,da bude ista kao i u ostalim poljima..Recimo pri Update,ime osobe nece da se menja a prezime moze..
 
Poslednja izmena:

Back
Top