» »

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

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.
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"

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?

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 :)

jeti51 ::

Čestitam za varnostno luknjo. :P

Daj, nauči ga tako, kot je pravilno. :)

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 :)

darkolord ::

NE! Takoj s parametri

dvojka ::

odlično sedaj dela hvala lepa.

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:
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...
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 :)

darkolord ::

Better :)

dvojka ::

kaj v zgornem primeru pomeni neka spremenljivka s kodo ??

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();

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);
1ACDoHVj3wn7N4EMpGVU4YGLR9HTfkNhTd... in case I've written something useful :)

dvojka ::

vse lepo in prav vendar noče izbirsati vrstice iz baze. vendar ne vrže vn nobene napake

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# okna in podokna

Oddelek: Programiranje
111562 (1156) FlashM
»

VC# insert into oledb ne deluje

Oddelek: Programiranje
191507 (1278) Good Guy
»

razložitev nekaterij elementov v visual studio 05

Oddelek: Programiranje
71981 (1786) darkolord
»

OleDb in visual studio .net

Oddelek: Programiranje
162183 (1962) Kovalchuk
»

branje byte[] iz MS access-ove baze

Oddelek: Programiranje
81781 (1691) BHawk

Več podobnih tem