Problem med treeview, sammanband mellan C# och SQL

Permalänk
Medlem

Problem med treeview, sammanband mellan C# och SQL

Okej jag har en treeView (alternativt kan en checkedlistbox också användas) som har ca 40 olika nodes. Varje nodes text är skolrelaterat, vill säga att dom består av t.ex.

Svenska
Engelska
Matematik
Fysik
Religion
Geografi
Slöjd
Dator/it
programmering
Musik
digitalt skapande

osv.

Iaf, min databas har alla dessa ämnen tillsammans med ett användarnamn och en email, för att hålla reda på vem som har vad. Notera att varje ämne i SQL består av en VARCHAR(1). Jag har kommit så långt att jag lyckats kasta in SQL kommandot för att he in ett värde i username och emailadress ( i SQL) men jag kommer inte på ett smidigt snyggt sätt att på automatik lista ut vart i kommandot som den string som skapas när du klickar på eller checkar en checkbox ska hes.

Skulle vara otroligt tacksam om jag kan få hjälp med detta så fort som möjligt.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Kan du skriva om det lite, ge lite kod på vad du gör.

Förstår heller inte vad du menar med att ett ämne i SQLen består av en VARCHAR(1)? Lagrar du inte namnet på ämnet?

Denna biten är lite oförståelig:

Citat:

Jag har kommit så långt att jag lyckats kasta in SQL kommandot för att he in ett värde i username och emailadress ( i SQL) men jag kommer inte på ett smidigt snyggt sätt att på automatik lista ut vart i kommandot som den string som skapas när du klickar på eller checkar en checkbox ska hes.

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Kan du skriva om det lite, ge lite kod på vad du gör.

Förstår heller inte vad du menar med att ett ämne i SQLen består av en VARCHAR(1)? Lagrar du inte namnet på ämnet?

Denna biten är lite oförståelig:

Tja, vad jag menar är att jag (som nämnt) är att den sparar bara en string (1 lång) som fylls via C# programmet. Så om jag klickar på en checkbox ur treeviewen så kommer det läggas in i en lista och sedan skickas som ett kommando för att lägga in den (typ insert into databastabellnamn values(null, "1");
Ett grovt exempel då de första är användarnamn, email och sedan de 40 ämnena.

Koden jag har nu är meningslös och ser ut såhär:

try { lol.Add(treeView1.SelectedNode.Text); } catch (Exception ex) { MessageBox.Show("Prova annan kod."); }

senare så körs denna koden när användaren valt de ämnen som ska läggas in

foreach(string s in lol)
{
richTextBox1.Text += s;
}

Varje gång koden körs i själva programmet så får jag ett felmeddelande och efter det funkar det.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Kommer använda en ny metod för att sortera ut ärendena.
Eftersom jag kan plocka ut texten på varje item eller node i en treeview/checkekedListBox så kan jag slänga in det i en TEXT i SQL.

Sedan körs koden: "select errandText from errand where kvalification = " här körs sedan de kvalifikationer som kontroll där din användare matchar de kraven för ärendet(n) som existerar i databasen ";

Kvalifikationerna läggs in på följande sätt alltså:

Svenska Engelska Matematik Fysik DatorIT programmering osv.

Sedan efter kommandot för att ta ut det från databasen läggs ärendet in i en string.

Sedan tas stringen upp av en richTextBox genom följande kod.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

string errandText (internt i C#) = (string)lista[0]["errandText"];
richTextBox1.Text = errandText;

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Varje gång koden körs i själva programmet så får jag ett felmeddelande och efter det funkar det.

Detta berodde på att koden låg i en try sats, efter att jag tog bort den funkade det bra.
Koden såg då ut såhär istället:

Notera att jag använder en klass som innehåller följande metoder:

Query (skicka en fråga och få tillbaka svaret från databasen)
NonQuery (skicka en fråga eller skriv in något till databasen utan att få tillbaka svar)
DBConnection (uppkoppling mot databasen (därav conn)) (DBConnection conn = new DBConnection))

Det är dom jag behöver ifrån klasserna/kodbiblioteken

JBMySQL.dll och MySql.dll

lista.Add(listBox1.SelectedItem.ToString());

Kontakta databasen: conn.Connect(server, användarnamn, lösenord); conn.SelectDB(databas);

Sedan så använder jag följande kod för att hämta ut från databasen:

string sqlKommando = "select errandText from errand where kvalification = '" + kvalifikationer + "';"; List<Hashtable> resultat = conn.Query(sqlKommando); if(resultat.Count > 0) { richTextBox1.Text = (string)resultat[0]["errandText"]; }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Kommer skicka lite screens om hur det vart sen.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Inte läst allt du skrivit men två reaktioner direkt:
1. Du måste akta dig för SQLInjections, det är väldigt känsligt nu och man kan enkelt droppa dina tables
2. Använd inte åäö i dina variabelnamn (förutsatt att användarnamn och lösenord är variabler och inte bara utbytt för att dölja)
3. Använd inte svenska när du programmerar. Kommentarer och alla sorters namn (funktioner, variabler etc) ska vara på engelska

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

det jag skriver här är exempel. I mitt program heter alla variabler, funktioner, metoder osv alltid på engelska. SQL servern kommer ligga på ett nätverk och kommer vara låst med lösen och användarnamn som inte går att få tag i.

Jag behöver dock ta ställning till punkt 2 där.

Hur konverterar jag åäö samtidigt som jag skriver?
Antar bara att koden ska ligga i en timer som kollar om å ä ö existerar men det går inte använda richTextBox1.Text.Replace("å","ae");

Eftersom inte varken å ä ö existerar i Keys (keycode) så kan jag inte heller kolla det på keypress eller keydown.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Hur menar du samtidigt som du skriver? I textfält så får det ju vara åäö, och i databaser

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

wow haha måste råkat sovit under mysql lektionerna ^^, alltid trott att SQL inte kan ta åäö i text. Då spelar det absolut ingen roll. Tänkte specifikt på när jag lägger till ett värde i en rad på en sqltabell så tänkte jag bara automatiskt att det inte var möjligt att ha det ^^,

Men nu är allt perfekt. Har fixat ett program som lägger in i databasen, nu ska jag bara skaffa ett som läser det som finns där.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Vore tråkigt om man var tvungen att ta bort alla åäö i databaser

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

anständigt om inte annat

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Skrivet av freddyfresh:

SQL servern kommer ligga på ett nätverk och kommer vara låst med lösen och användarnamn som inte går att få tag i.

Det har inget med SQL-injections att göra. Du får kolla upp SQL-injections så du förstår vad det är och hur du skyddar dig mot de.

Visa signatur

Nikon D90, Nikon D7000, SB-600, 2xYN-460, Nikkor 18-105mm/3.5-5.6 VR, Nikkor 35mm/1.8, Nikkor 50mm/1.8D, Tamron 70-200/2.8, Tokina 11-16/2.8, Nikon 85/3.5 Macro
Flickr

Permalänk
Medlem

Nu är ju inte jag så insatt i att ta mig in i andras datorer eller servrar, men hur kan dom ens komma åt servern om dom inte ens får se vad den heter eller lösenordet är?

Är det verkligen så simpelt att ta sig in i andras databaser eller?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Egentligen borde det väl bara vara att kontrollera i mitt inloggningsformulär att om någon av textboxarna innehåller en symbol är det inte accepterat och man kan inte använda login knappen automatiskt? Eller har jag tappat förståndet?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Nu är inte jag helt insatt heller, men du vill tex inte tillåta tecken som ' eller "

Exempel

SELECT somecolumn FROM sometable WHERE username = " + användarnamn + " 'x OR 'x'='x'' + ;"

Nu kanske detta var lite dåligt skrivet, men i detta fall har du SQL injectionen 'x OR 'x'='x'' där 'x'='x' alltid kommer att returnera TRUE och ja, det stämmer att det är så simpelt att exploatera SQL på det här sättet, det är ett mycket vanligt säkerhetshål.

PS. Någon mer kunnig får gärna rätta mig här...

Permalänk

Eftersom som din kod är:

"select errandText from errand where kvalification = '" + kvalifikationer + "';"

så ger ett vanligt värde, som "test":

"select errandText from errand where kvalification = 'test';

Men om man anger "test'; DROP TABLE errand; -- " så blir det:

"select errandText from errand where kvalification = 'test'; DROP TABLE errand; --';'"

Poff, så har du ingen tabell längre

Edit: Vad har du för databas?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Min databas är konstruerat med följande kod:

CREATE TABLE Errands( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(10), emailadress VARCHAR(120), errandCategory TEXT, question TEXT, answer TEXT, TimeOfDay VARCHAR(20) );

jag har nu slagit av: ' * " ^ ¨; : !"#¤%&/()=?` och blanksteg, känner mig lagom paranoid ^^,

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

TimeOfDay lagrar: datum (2010-00-00 16:25:08) <- exempel, right there.

errandText blev ändrad till question.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Du ska spara TimeOfDay som Datetime!

Jag frågade vilken databas du använder, inte hur din tabell ser ut.

Om du t.ex. kör MSSQL kan du köra SqlCommand-klassen etc, då kommer den per automatik att lösa allt med sånt för dig! Läs på lite, gör inte bara en massa ändringar

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Det borde jag tänkt på innan jag byggde koden för det isåfall. Tror inte det blir så stor skillnad mellan Datetime och att lägga in DateTime.Now genom C# till SQL. Kanske sparar arbete men det är redan gjort så.

vad skulle skillnaden vara (mer specifikt) om jag använder MSSQL?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Om du gör jämförelse etc, du slipper konverteringar, du slipper risken att något blir fel i din kod när databasvärdet inte är ett giltigt datetime etc.

Algorithm to avoid SQL injection on MSSQL Server from C# code? - Stack Overflow

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Men eftersom datetime sparas som en text i en varchar i automatik (läggs till oavsett) så finns det väl inte så stor risk att det blir fel?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Skrivet av freddyfresh:

Men eftersom datetime sparas som en text i en varchar i automatik (läggs till oavsett) så finns det väl inte så stor risk att det blir fel?

Nej, det gör det inte. Men det är fel att göra så! Du tjänar inget på att göra så.

Risken är även att jämförelser blir fel

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

så istället för att köra den via C# ska jag använda NOW() för att skriva in datum och tid ?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Iaf. Löste det där med datum/tid grejen genom att ersätta VARCHAR med DateTime, skulle tänkt på det lite tidigare innan jag designade tabellen också. Nu ser databastabellen ut såhär:

CREATE TABLE Errands( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(10), emailadress VARCHAR(120), errandCategory TEXT, question TEXT, answer TEXT, TimeInserted DateTime );

Och i C# ser kommandot ut som följande:

string sqlInsert = "insert into errands values(null,'" + p_username + "','" + textBox3.Text + "','" + errandCategory[0] + "','" + richTextBox1.Text + "','',NOW());";

Nu anser jag att problemen i första programmet är löst. Nu ska jag börja lite löst på det andra

Ska erkänna att DateTime är mer flexibelt än att skapa 2 metoder som hämtar dagens tid/datum.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk

Nu kan man ju fortfarande SQLInjecta dig..?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Nu måste man följa ett standardformat för användare, samt blockat alla symboler som inte behövs. Vill säga att bara . och @ funkar. Inloggningsknappen funkar inte om den inte följer mallen och Lösenordet är detsamma, förutom att den blockar alla symboler.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Även om inloggningsknappen skulle funka kommer programmet gå igenom en kontroll för att kolla vad som är i fälten.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40