|
[ spezia @ 26.10.2008. 18:52 ] @
| Pravim formu za unos podataka u bazu ili update...
I nikako da upise podatak ,a jos manje azurira...
Stavicu problem za UPDATE ...
U knjizi je uradjen primer za konzolu slican,a ja ne vidim gde gresim.Tacnije u knjizi nije jasno uradjen primer. Ove kod za dugme SAVE ,kada vec popunimo TextBox-ove podacima i zelimo da azuriramo bazu.
Evo koda
Code:
private void btnEditSaveUser_Click(object sender, EventArgs e)
{
string conn2 = "provider=Microsoft.Jet.OLEDB.4.0;data source=book.mdb";
OleDbConnection connect2 = new OleDbConnection(conn2);
string userUpdate = "Update member SET IDmember=@IDmember,name=@name,lastname=@lastname," +
"location=@location,street=@street,streetnum=@streetnum,expired=@expired," +
"bookdate=@bookdate,bookser=@bookser";
OleDbCommand editCommand = connect2.CreateCommand();
editCommand.CommandText = updateString;
// dodatak Add metode
editCommand.Parameters.Add("@userID", OleDbType.Char, 10);
editCommand.Parameters["@userID"].Value = 21;
editCommand.Parameters.Add("@IDmember", OleDbType.BigInt, 10);
editCommand.Parameters.Add("@name", OleDbType.Char, 20);
editCommand.Parameters.Add("@lastname", OleDbType.Char, 20);
editCommand.Parameters.Add("@location", OleDbType.Char, 20);
editCommand.Parameters.Add("@street", OleDbType.Char, 20);
editCommand.Parameters.Add("@streetnum", OleDbType.Integer, 10);
editCommand.Parameters.Add("@expired", OleDbType.Date, 10);
editCommand.Parameters.Add("@bookdate", OleDbType.Date, 10);
editCommand.Parameters.Add("@bookser", OleDbType.Char, 10);
// stavljanje vrednosti za promenljive
editCommand.Parameters["@IDmember"].Value = 10002;
editCommand.Parameters["@name"].Value = "Mikica";
editCommand.Parameters["@lastname"].Value ="Tipic";
editCommand.Parameters["@location"].Value = txtLocation.Text; // vrednost TextBox polja koje smo uneli
editCommand.Parameters["@street"].Value = txtStreet.Text;
editCommand.Parameters["@streetnum"].Value = txtStreetNum.Text;
editCommand.Parameters["@expired"].Value = txtExpired.Text;
editCommand.Parameters["@bookdate"].Value = txtBookDate.Text;
editCommand.Parameters["@bookser"].Value = txtIDbook.Text;
// izvrsavanje upita
editCommand.ExecuteNonQuery();
}
|
[ vujkev @ 26.10.2008. 22:08 ] @
Nisi rekao koja je greška.
Koliko mogu iz ovoga da primetim imaš nekoliko grešaka:
1. nemaš otvaranje konekcije "connect2.open"
2. u editCommand dodaješ parametar @UserID, ali taj parametar se ne koristi u samom upitu
3. kad izvršiš upit svi slogovi u bazi će ti biti promenjeni jer nigde ne ograničavač na kojim redovima vršiš update (iskoristi @UserID koji si definisao kao parametar)
Inače kod može i kraće da se napiše
Code:
editCommand.Parameters.Add("@IDmember", OleDbType.BigInt, 10);
editCommand.Parameters["@IDmember"].Value = 10002;
može da se napiše kao
Code:
editCommand.Parameters.Add("@IDmember", OleDbType.BigInt, 10).Value = 10002;
i time dobijaš dupo manji broj linija i malo je jasnije za čitanje
[ spezia @ 27.10.2008. 00:24 ] @
Ma ima u upitu "WHERE IDmember=@userID"...
U ocajnom pokusaju gledao sam da uprostim...
Recimo SELECT mi radi...Ne radi Update,insert...
A greska je da ne azurira polje ,ne vrsi upis u bazu...Baza mi je u Debug pored exe verzije.
Evo celog koda kako treba da bude (po meni)
Code:
private void btnEditSaveUser_Click(object sender, EventArgs e)
{
string conn2 = "provider=Microsoft.Jet.OLEDB.4.0;data source=book.mdb";
OleDbConnection connect2 = new OleDbConnection(conn2);
connect2.Open();
string userUpdate = "Update member SET IDmember=@IDmember,name=@name,lastname=@lastname," +
"location=@location,street=@street,streetnum=@streetnum,expired=@expired," +
"bookdate=@bookdate,bookser=@bookser WHERE IDmember=@userID";
OleDbCommand editCommand = connect2.CreateCommand();
editCommand.CommandText = userUpdate;
// dodatak Add metode
editCommand.Parameters.Add("@userID", OleDbType.Char, 10);
editCommand.Parameters["@userID"].Value = 21;
editCommand.Parameters.Add("@IDmember", OleDbType.BigInt, 10);
editCommand.Parameters.Add("@name", OleDbType.Char, 20);
editCommand.Parameters.Add("@lastname", OleDbType.Char, 20);
editCommand.Parameters.Add("@location", OleDbType.Char, 20);
editCommand.Parameters.Add("@street", OleDbType.Char, 20);
editCommand.Parameters.Add("@streetnum", OleDbType.Integer, 10);
editCommand.Parameters.Add("@expired", OleDbType.Date, 10);
editCommand.Parameters.Add("@bookdate", OleDbType.Date, 10);
editCommand.Parameters.Add("@bookser", OleDbType.Char, 10);
// stavljanje vrednosti za promenljive
editCommand.Parameters["@IDmember"].Value = txtIDmember.Text;
editCommand.Parameters["@name"].Value = txtUserName.Text;
editCommand.Parameters["@lastname"].Value = txtUserLast.Text ;
editCommand.Parameters["@location"].Value = txtLocation.Text;
editCommand.Parameters["@street"].Value = txtStreet.Text;
editCommand.Parameters["@streetnum"].Value = txtStreetNum.Text;
editCommand.Parameters["@expired"].Value = txtExpired.Text;
editCommand.Parameters["@bookdate"].Value = txtBookDate.Text;
editCommand.Parameters["@bookser"].Value = txtIDbook.Text;
// izvrsavanje upita
editCommand.ExecuteNonQuery();
connect2.Close();
}
[ sallle @ 27.10.2008. 09:31 ] @
ne mozes stringove da prosledjujes kao parameters values...konvertuj te silne textbox.Text u odgovarajuci tip.
[ spezia @ 27.10.2008. 12:23 ] @
Nisam te najbolje razumeo ...
Pokusao sam recimo za prvi primer OleDbType.BigInt ili samo int.
Neznam koje tipove dozvoljava Value.Uglavnom mi izbacuje ne moze da konvertuje 'string' u 'tip'...
Moze mali primer na sta si konkretno mislio.
Hvala
[ sallle @ 27.10.2008. 15:13 ] @
Code:
editCommand.Parameters["@IDmember"].Value = Convert.ToInt64(txtIDmember.Text);
editCommand.Parameters.Add("@expired", OleDbType.Date, 10); = Convert.ToDateTime(txtExpired.Text); /*ovde ces imati verovatno zajebanciju (treba da zoves overridovanu Convert.ToDateTime(string, iformat...), pa da mu kazes koji je format*/
//@bookdate kao i prethodni
editCommand.Parameters["@streetnum"].Value = Convert.ToInt32(txtStreetNum.Text);
znaci kao value treba da dostavljas .net tipove koji su "ekvivalentni" ili moze da se izvrsi preslikavanje u odgovorajuce sql tipove...
sql / .net:
bit - bool
integer - int
money - decimal
char(n) - string
varchar(n) - string
itd...
za te stringovne tipove u bazi, najbolje je da koristis nvarchar (varijabilna duzina, sa podrskom za unicode)
[ spezia @ 27.10.2008. 16:31 ] @
Radim sa Access bazom,posto mi je i mali projekat a i lakse je tako predstaviti profesoru.
Uradio sam ,kako si rekao i opet ne upisuje.
Prvo mi je javljao gresku @location dont have default value.
A ako izbrisem taj red.onda ide redom street dont have dafoult value...Cudno sto preskace IDmember i LastName.Kao
da su ispravno.
Sada mi vise to ne javlja ali zato nista se i ne desava.
Ako je lakse mogu da postavim ceo kod od using ...
Izbacio sam privremeno i redove za Date ,koje kazes da mozda ce praviti problem i opet isto.
ne javlja gresku ali i ne upisuje.
Da li recimo treba da stavim neke default vrednosti ako ne update-ujem sva polja.
Mada meni pri editovanju sva polja su popunjena.
[Ovu poruku je menjao spezia dana 27.10.2008. u 17:42 GMT+1]
[ sallle @ 27.10.2008. 22:12 ] @
trebalo je samo izmenis datetime, int i sl parametre. a ostale da ostavis (ne da ih izbrises).
[ spezia @ 28.10.2008. 00:37 ] @
Ostavio sam .Nisam brisao .Kasnije pise i da expired nema default value....
Nije do toga.Radio sam ovaj primer po knjizi.Od slova do slova...i radi samo delete.
Dok za insert i update javlja gresku.
Code:
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();
}
}
}
}
Ja sam ocekivao da je Insert,Update ,Delete osnova C# sa bazom.Koliko vidim ispade da nije lako ...
Javja gresku
Code:
Unable to cast object of type 'System.Windows.Forms.TextBox' to type 'System.IConvertible'.
// Ukazuje na red
row["id"] = Convert.ToInt32(txtID);
[ sallle @ 28.10.2008. 08:43 ] @
zato sto ne mozes objekat klase TextBox da dodjeljujes.
kod treba da glasi:
Code:
row["id"] = Convert.ToInt32(txtID.Text);
pri cemu, ukoliko u to polje ne upises nesto sto moze da se konvertuje u int, bacice ti exception... (cak i ako ga ostavis prazno)
[ spezia @ 28.10.2008. 09:01 ] @
Glupa greska.
Najbolje je da ja ovu verziju prilagodim sebi i izmenim kod...
Hvala
[ spezia @ 28.10.2008. 18:18 ] @
Sve radi osim Update koji mi najvise znaci...Posto mi je projekt Biblioteka.
Kada ucitam polja ,izvrsim izmenu i kliknem na Save:
Javlja gresku : the Update command affected 0 of expected 1 records.
Radi mi Insert,select i delete...a ovo samo nece.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|