Forum » Programiranje » problem v C#
problem v C#
dvojka ::
rabim search preko accessove baze v C# windows aplikaiciji in imam problem, ko hočem primerjati textbox ter polje koda. če dam primer da mam v bazi samo dva polja id ter koda:
v aspju se lahko bazo preprosto pregleda:
for(int i = 0; i< GridView1.Rows.Count ; i++)
{
id = GridView1.Rows[i].Cells[z].Text; z++;
koda = GridView1.Rows[i].Cells[z].Text; z++;
if(textBox1.text == koda)
naprej druge stavi kaj naj naredi
}
ko pa hočem to enako narediti v windows aplikaciji vrže vn napako zarad .text
se komu svita kako bi to popravil??
lp andrej
v aspju se lahko bazo preprosto pregleda:
for(int i = 0; i< GridView1.Rows.Count ; i++)
{
id = GridView1.Rows[i].Cells[z].Text; z++;
koda = GridView1.Rows[i].Cells[z].Text; z++;
if(textBox1.text == koda)
naprej druge stavi kaj naj naredi
}
ko pa hočem to enako narediti v windows aplikaciji vrže vn napako zarad .text
se komu svita kako bi to popravil??
lp andrej
frudi ::
DataGridViewCell class nima lastnosti .Text, ampak .Value, ki vrne vsebino celice. Value je tipa 'object', zato boš moral še castat v string: id = GridView1.Rows[i].Cells[z].Value.ToString();
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
ok to tud ne dela ve kdo kako kodo za search po bazi? se prav da bi vnesu v text box neko besedo in jo potem z pritiskom na gumb najde v bazi??
frudi ::
a lahko podaš kaj več informacij? 'ne dela' ne pove prav nič... kakšno napako dobiš? v kateri vrstici?
kot naslednje se izjasni točno kaj bi rad dosegel - iskanje po bazi ali po gridu? kako sploh napolniš datagridview s podatki iz baze? če želiš filtrirati že resultset, ki ga dobiš iz baze, moraš v SELECT stavek dodati ustrezen WHERE pogoj, v katerem filtriran stolpec primerjaš s podanim parametrom, bodisi z operatorjem '=' ali pa z 'LIKE', recimo:
SELECT id, koda FROM tabela WHERE koda = @koda,
kjer je @koda parameter, katerega vrednost prebereš iz tekst polja.
kot naslednje se izjasni točno kaj bi rad dosegel - iskanje po bazi ali po gridu? kako sploh napolniš datagridview s podatki iz baze? če želiš filtrirati že resultset, ki ga dobiš iz baze, moraš v SELECT stavek dodati ustrezen WHERE pogoj, v katerem filtriran stolpec primerjaš s podanim parametrom, bodisi z operatorjem '=' ali pa z 'LIKE', recimo:
SELECT id, koda FROM tabela WHERE koda = @koda,
kjer je @koda parameter, katerega vrednost prebereš iz tekst polja.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
ok tole je celotna koda:
int limiter = kodaDataGridView.Rows.Count;
string id = null;
string koda = null;
string cena = null;
string ime = null;
string opis = null;
for (int i = 0; i < limiter; i++)
{
int z = 1;
id =Convert.ToString( kodaDataGridView.Rows[i].Cells[z].Value); z++;
koda =Convert.ToString( kodaDataGridView.Rows[i].Cells[z].Value); z++;
cena = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
ime = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
opis = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
label1.Text="ne deluje";
if (textBox1.Text == koda)
{
label1.Text = koda;
ko pritisnem na gumb mi vrže vn napako: System.ArgumentOutOfRangeException was unhandled
Message="Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"
int limiter = kodaDataGridView.Rows.Count;
string id = null;
string koda = null;
string cena = null;
string ime = null;
string opis = null;
for (int i = 0; i < limiter; i++)
{
int z = 1;
id =Convert.ToString( kodaDataGridView.Rows[i].Cells[z].Value); z++;
koda =Convert.ToString( kodaDataGridView.Rows[i].Cells[z].Value); z++;
cena = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
ime = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
opis = Convert.ToString(kodaDataGridView.Rows[i].Cells[z].Value); z++;
label1.Text="ne deluje";
if (textBox1.Text == koda)
{
label1.Text = koda;
ko pritisnem na gumb mi vrže vn napako: System.ArgumentOutOfRangeException was unhandled
Message="Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"
dvojka ::
potem imam pa še eno kodo:
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/RFID.mdb");
OleDbCommand aCommand = new OleDbCommand("select * from Koda", aConnection);
aConnection.Open();
//create the datareader object to connect to table
OleDbDataReader aReader = aCommand.ExecuteReader();
// label1.Text = "This is the returned data from emp_test table";
//Iterate throuth the database
while(aReader.Read())
{
if(textBox1.Text == )
{}
}
//close the reader
aReader.Close();
//close the connection Its important.
aConnection.Close();
}
pa me zanima kaj gor v pogoj unesem še poleg textBox1.Text, da bi preverjalo ali je textbox enak vnosu v bazi?
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/RFID.mdb");
OleDbCommand aCommand = new OleDbCommand("select * from Koda", aConnection);
aConnection.Open();
//create the datareader object to connect to table
OleDbDataReader aReader = aCommand.ExecuteReader();
// label1.Text = "This is the returned data from emp_test table";
//Iterate throuth the database
while(aReader.Read())
{
if(textBox1.Text == )
{}
}
//close the reader
aReader.Close();
//close the connection Its important.
aConnection.Close();
}
pa me zanima kaj gor v pogoj unesem še poleg textBox1.Text, da bi preverjalo ali je textbox enak vnosu v bazi?
frudi ::
"Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"
ta napaka pomeni, da si v zbirki želel po indexu dostopati do elementa, ki ga v zbirki ni; kot ti tudi error message pove - index mora biti pozitiven in (strogo!) manjši od velikosti zbirke. v tvojem konkretnem primeru pride do napake, ker spremenljivko 'z' na začetku zanke nastaviš na 1, namesto na 0. v gridu imaš 5 stolpcev, zato gredo indeksi celic od 0 do 4, ne od 1 do 5.
mimogrede, spremenljivke, ki jih uporabljaš znotraj zanke, deklariraj zunaj nje.
kar se pogoja za filtriranje tiče...
if (textBox1.Text == aReader["koda"]) { blablabla... }
"koda" predstavlja ime stolpca v bazi, ki vsebuje kodo; če se imenuje drugače, pač vpiši to, kakor se dejansko imenuje.
ampak, boljša rešitev je, da ti že baza sfiltrira podatke. namesto tega if-a, vnesi pogoj že direktno v select stavek:
OleDbCommand aCommand = new OleDbCommand("select * from Koda where koda = '" + textBox1.Text + "'", aConnection);
oziroma za lepšo preglednost:
OleDbCommand aCommand = new OleDbCommand(String.Format("select * from Koda where koda = '{0}'", textBox1.Text), aConnection);
spet 'koda' zamenjaz z dejanskim imenom stolpca v bazi.
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
frudi ::
baby steps... naj se prvo nauči o WHERE, preden se začne ubadat z sql parametri... .
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
spet uprašanje: kako se izbriše vrstica v bazi ?? recimo k najdem polje ga rabim potem še izbirsati.
frudi ::
no, da nehata jeti in darkolord skakati do stropa...
zgornjega načina sestavljanja sql stavkov se izogibaj, ker omogoča t.i. sql injection napade; za vajo premisli, kaj bi se zgodilo, če bi nekdo v zgornjem primeru v textBox1 vpisal recimo: '; DROP TABLE Koda; --
zato se za podajanje parametrov uporablja razred SqlParameter, oziroma v tvojem primeru OleDbParameter. parametre ustvariš in dodaš Command objektu, v njegov Parameters collection. za to imaš na voljo več načinov, najenostavneje kar:
kar pa mislim da deluje le pod .NET 2.0. v 1.1 (lahko pa tudi v 2.0) uporabi:
zgornjega načina sestavljanja sql stavkov se izogibaj, ker omogoča t.i. sql injection napade; za vajo premisli, kaj bi se zgodilo, če bi nekdo v zgornjem primeru v textBox1 vpisal recimo: '; DROP TABLE Koda; --
zato se za podajanje parametrov uporablja razred SqlParameter, oziroma v tvojem primeru OleDbParameter. parametre ustvariš in dodaš Command objektu, v njegov Parameters collection. za to imaš na voljo več načinov, najenostavneje kar:
OleDbCommand aCommand = new OleDbCommand("select * from Koda where koda = @koda", aConnection); OleDbCommand.Parameters.AddWithValue("@koda", textBox1.Text);
kar pa mislim da deluje le pod .NET 2.0. v 1.1 (lahko pa tudi v 2.0) uporabi:
OleDbCommand aCommand = new OleDbCommand("select * from Koda where koda = @koda", aConnection); OleDbParameter param = new OleDbParameter("@koda", textBox1.Text); OleDbCommand.Parameters.Add(param);
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
am itq mam mal drgač use skp zastavlen kt si nekateri predstavlate. napisau sm program k prebere rs232 port na katerga mam priklučen rfid. ta program shrani kodo v datoteko, ker pač mora menda u datoteko shrant drgač bi direkt u glavni program pisal nato pa z programom kličem to datoteko čekiram vrstice in primerjam kode in če je koda enaka kakor u datoteki potem operira naprej. tako da ni pisanaja v textboxe. pisanje bo edino pri dodajanju novih polj v tabelo.
frudi ::
sej to ne spremeni kaj dosti; edino namesto textBox1.Text bo povsod nastopala neka spremenljivka string tipa.
kar se pa brisanja tiče...
kar se pa brisanja tiče...
OleDbCommand aDeleteCommand = new OleDbCommand("delete from Koda where koda = @koda", aConnection); aDeleteCommand.Parameters.AddWithValue("@koda", nekaSpremenljivkaSKodo); int deletedRowsCount = aDeleteCommand.ExecuteNonQuery();
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
tkole zgleda trenutno program:
System.Diagnostics.Process.Start("neki.bat");
FileStream datoteka = new FileStream("basane.txt", FileMode.Open, FileAccess.Read);
StreamReader read = new StreamReader(datoteka);
String kodadat = read.ReadLine();
read.Close();
datoteka.Close();
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/RFID.mdb");
OleDbCommand aDeleteCommand = new OleDbCommand("delete from Koda where koda = @koda", ?);
aConnection.Open();
aDeleteCommand.Parameters.AddWithValue("@koda", kodadat);
int deletedRowsCount = aDeleteCommand.ExecuteNonQuery();
System.Diagnostics.Process.Start("neki.bat");
FileStream datoteka = new FileStream("basane.txt", FileMode.Open, FileAccess.Read);
StreamReader read = new StreamReader(datoteka);
String kodadat = read.ReadLine();
read.Close();
datoteka.Close();
OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/RFID.mdb");
OleDbCommand aDeleteCommand = new OleDbCommand("delete from Koda where koda = @koda", ?);
aConnection.Open();
aDeleteCommand.Parameters.AddWithValue("@koda", kodadat);
int deletedRowsCount = aDeleteCommand.ExecuteNonQuery();
frudi ::
nekaSpremenljivkaSKodo - pač neka spremenljivka tipa string, v katero si shranil tekst, ki ga iščeš v bazi.
sej kolikor vidim, si v svoji kodi pravilno dodal parameter, torej si 'nekaSpremenljivkaSKodo' pravilno zamenjal s svojo 'kodadat' spremenljivko. tam kjer si postavil vprašaj, pa nastopa aConnection, kot sem že v prejšnjem primeru napisal:
OleDbCommand aDeleteCommand = new OleDbCommand("delete from Koda where koda = @koda", aConnection);
sej kolikor vidim, si v svoji kodi pravilno dodal parameter, torej si 'nekaSpremenljivkaSKodo' pravilno zamenjal s svojo 'kodadat' spremenljivko. tam kjer si postavil vprašaj, pa nastopa aConnection, kot sem že v prejšnjem primeru napisal:
OleDbCommand aDeleteCommand = new OleDbCommand("delete from Koda where koda = @koda", aConnection);
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)
dvojka ::
se opravičujem moja napaka ker nisem klical baze v datoteki debug vendar drugje in se ni spremenila.
dvojka ::
imam pa samo se eno vprasanje: kako se zapis v texboxu shrani v določeno polje v bazi. primer v textboxu zapisana cena katera naj se shrani v polje cena v bazi. lahko se to kdo pove ?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C# okna in podoknaOddelek: Programiranje | 1676 (1270) | FlashM |
» | VC# insert into oledb ne delujeOddelek: Programiranje | 1654 (1425) | Good Guy |
» | razložitev nekaterij elementov v visual studio 05Oddelek: Programiranje | 2136 (1941) | darkolord |
» | OleDb in visual studio .netOddelek: Programiranje | 2315 (2094) | Kovalchuk |
» | branje byte[] iz MS access-ove bazeOddelek: Programiranje | 1956 (1866) | BHawk |