Vinnaren i pepparkakshustävlingen!
2016-06-02, 22:23
  #1
Medlem
Hjälp önskas!
Jag är en nybörjare som lär mig från mestadels youtube men även från lite sidor jag hittar.
Nu har jag stött på problem som jag inte kommer runt, jag förstår bara inte vilket felet är.
Det är två problem men båda har med sökning från min databas att göra.

Jag jobbar i Visual Studio med C# och Windows Forms.

Första problemet är att jag ska söka upp alla poster i databasen som har ett visst datum.
Jag använder mig av en DateTimePicker som jag har konfigurerat att söka på yyyy-mm för att hitta samtliga poster med den månaden.

Jag får det inte att fungera. Jag får inte någon syntax kod eller dyl.
Jag får upp DataGridView men den visar ingen data, endast kolumner.

Jag har lagt till
Kod:
using System.Data.SqlClient;

i Public Partial Class har jag lagt till

Kod:
SqlCommand cmd;
SqlConnection con;
SqlDataAdapter da;
DataTable dt;

På sökknappen har jag lagt till

Kod:
con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\deiko\OneDrive\Dokument\SHTest.mdf;Integrated Security=True;Connect Timeout=30");

con.Open();
dt = new DataTable();
da = new SqlDataAdapter("SELECT * FROM Sinfo where Datum LIKE " + dateTimePicker1.Text, con);
da.Fill(dt);
dataGridView1.DataSource = dt;


*Edit Jag har provat att göra sökningen på yyyy-mm-dd och då fungerar det efter att jag ändrade sökfrasen till denna. Får det dock inte att fungera med yyyy-mm
OBS, i databasen så ligger datumet som varchar. Kan ej ändra till numeric


Kod:
da = new SqlDataAdapter("SELECT * FROM Sinfo where Datum LIKE'" +dateTimePicker1.Text +"'", con);

Problem 2,

Jag ska söka på telefonnummer men kan endast få fram posten om jag skriver HELA telefonnummret. Skriver jag tex de 4 första siffrorna så får jag samma resultat som när jag söker med datumet (får endast fram kolumnerna, ej data)
OBS det är i samma form så endast knappen som skiljer sig åt.
Där har jag lagt in detta

Kod:
con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\deiko\OneDrive\Dokument\SHTest.mdf;Integrated Security=True;Connect Timeout=30");

con.Open();
dt = new DataTable();
da = new SqlDataAdapter("SELECT * FROM Sinfo where Telefon LIKE " + textBox1.Text, con);            
da.Fill(dt);
dataGridView1.DataSource = dt;

Jag har säkert lite onödig kod eftersom jag inte är 100 på vad jag gör ännu, men det hoppas jag ni har överseende med.
Frågan är, vad är problemet?
__________________
Senast redigerad av deikoo 2016-06-02 kl. 23:12.
Citera
2016-06-02, 23:20
  #2
Medlem
Du söker väl på exakt match om du inte använder % eller _?
Inte så insatt i SQL och vet inte om du har testat men...

Exempel 070-0000001, %-0000001, 07_-0000001

SELECT * FROM Table WHERE Nummer LIKE '%-1234567'
SELECT * FROM Table WHERE Nummer LIKE '070-123456_'
Citera
2016-06-02, 23:33
  #3
Medlem
Citat:
Ursprungligen postat av HenkaN94
Du söker väl på exakt match om du inte använder % eller _?
Inte så insatt i SQL och vet inte om du har testat men...

Exempel 070-0000001, %-0000001, 07_-0000001

SELECT * FROM Table WHERE Nummer LIKE '%-1234567'
SELECT * FROM Table WHERE Nummer LIKE '070-123456_'

Ja, % är ju wildcars som jag förstått det.
Jag har även förstått att när man lägger in LIKE så innebär det att man söker efter mönster.
Stämmer det inte då att om jag ska kunna söka på något nummer som har 666 i sig så ska jag inte ha något mer statement?

Jag letar o letar info på detta men det är ju galet svårt att hitta på nätet.
Citera
2016-06-02, 23:45
  #4
Medlem
Om nummret är 666123 då ska du söka '666%' om du vet att det är 666 + tre siffror till kan du använda tre stycken understreck '666___'.

Samma sak åt andra hållet, '%666', '___666' eller '%666%' osv. du fattar nog.

% kan vara oändligt antal tecken och _ är ett okänt

Antar att dina sök inte funkar på delar av data då du inte använder dessa tecken...
__________________
Senast redigerad av HenkaN94 2016-06-02 kl. 23:48. Anledning: Aasd
Citera
2016-06-03, 11:11
  #5
Medlem
Citat:
Ursprungligen postat av HenkaN94
Om nummret är 666123 då ska du söka '666%' om du vet att det är 666 + tre siffror till kan du använda tre stycken understreck '666___'.

Samma sak åt andra hållet, '%666', '___666' eller '%666%' osv. du fattar nog.

% kan vara oändligt antal tecken och _ är ett okänt

Antar att dina sök inte funkar på delar av data då du inte använder dessa tecken...


Om jag förstår dig rätt då så måste jag ha såhär

Kod:
("SELECT * FROM Sinfo where Telefon LIKE '" +%textbox1.text%+ "'", con);

Ska hem o testa efter jobbet.
Citera
2016-06-03, 12:14
  #6
Medlem
Citat:
Ursprungligen postat av deikoo
Om jag förstår dig rätt då så måste jag ha såhär

Kod:
("SELECT * FROM Sinfo where Telefon LIKE '" +%textbox1.text%+ "'", con);

Ska hem o testa efter jobbet.

Mja, snarare:

Kod:
("SELECT * FROM Sinfo where Telefon LIKE '%" +textbox1.text+ "%'", con);
Citera
2016-06-03, 20:10
  #7
Medlem
Citat:
Ursprungligen postat av RoyBatty
Mja, snarare:

Kod:
("SELECT * FROM Sinfo where Telefon LIKE '%" +textbox1.text+ "%'", con);

Jag får datumsök till att fungera med % (modifierat datetimepicker till yyyy-mm, men har hela datumet i databas)
Den är byggd på varchar.

Det ser ut såhär
Kod:
("SELECT * FROM Sinfo where Datum LIKE '%" +dateTimePicker1.Text +"%'", con);

Jag får inte samma funktion att fungera på Telefon. Den är ju dock byggd på Numeric i databasen.
Hur skall jag få det att lyckas ? Har provat med massor av olika positioner på % men hittar inte rätt.

Tacksam för hjälp där med!!
Citera
2016-06-10, 16:29
  #8
Medlem
Om den är numeric i db, t.ex. millisekunder sedan 1970, måste du antingen omvandla det till ett datum innan du jämför, eller omvandla ditt datum till en numeric och jämföra det.

MySQL har t.ex. en datumfunktion man kan använda.
Citera
2016-06-16, 21:28
  #9
Medlem
scarlots avatar
Kan tipsa dig om att kolla in "Entity Framework" samt "Linq to SQL"
Citera
2016-06-20, 11:22
  #10
Medlem
Citat:
Ursprungligen postat av deikoo
<... om datum ...> Den är byggd på varchar.

Bygg om. Idioti på hög nivå att spara allt som char och inte ha några typer.


Citat:
Kod:
("SELECT * FROM Sinfo where Telefon LIKE '%" +textbox1.text+ "%'", con);

Tydlig SQL injections, du måste validera indata (eller låta ditt sql-lib hantera det åt dig). Jag har inte koll på det sql-bibliotek du använder funkar men sök efter prepared statements. Grundregel: lita aldrig någonsin på indata från användarna.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback