Avatar billede keenkbh Nybegynder
16. februar 2007 - 22:14 Der er 18 kommentarer og
1 løsning

Hjæp til SQL LIKE

Hej alle sammen.

Hvorfor virker det her ikke?

SqlCommand kategorier = new SqlCommand("SELECT * FROM Kategori WHERE Navn LIKE @katNavn + '%'", con);
        SqlParameter katNavn = new SqlParameter();
        katNavn = kategorier.Parameters.Add("@katNavn", SqlDbType.Char);
        katNavn.Direction = ParameterDirection.Input;
        katNavn.Value = hardware;
        kategorier.Connection.Open();
        SqlDataReader katRead = kategorier.ExecuteReader();

Jeg får følgende fejl:

System.InvalidOperationException: Invalid attempt to read when no data is present.

Problemet er bare, at jeg ved, at der er data til stede i databasen. Og jeg er ret overbevist om, at det er noget med min SQL sætning omkring LIKE og %-tegnet.

Pointen med SQL-sætningen er, at jeg har noget string input, som f.eks. kan være "Bund" og "Adaptere" og "Mus".

Sådan som jeg ser problemet, er det, at den ikke kan finde f.eks. "Bundkort" som ligger i databasen ved hjælp af %-tegnet, som da ellers burde være muligt, og det er det også via mit SQL-administrationsmodul.

Jeg håber, at der er en der kan hjælpe mig.
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 22:21 #1
Måske

SqlCommand kategorier = new SqlCommand("SELECT * FROM Kategori WHERE Navn LIKE @katNavn# + '%', con);
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 22:21 #2
eh, ramte forkert:
SqlCommand kategorier = new SqlCommand("SELECT * FROM Kategori WHERE Navn LIKE @katNavn" + '%', con);
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 22:23 #3
Nej, ser også forkert ud. 3de forsøg :)
Men du jo bruger jo parameters som man egentlig skal .... så er det

SqlCommand kategorier = new SqlCommand("SELECT * FROM Kategori WHERE Navn LIKE @katNavn + '%'", con);

og

    katNavn.Value = hardware + "%";
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 22:23 #4
En gang til!


SqlCommand kategorier = new SqlCommand("SELECT * FROM Kategori WHERE Navn LIKE @katNavn", con);

og

    katNavn.Value = hardware + "%";
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 22:37 #5
alle gode gange 4 :)
Avatar billede keenkbh Nybegynder
16. februar 2007 - 22:40 #6
Får stadig samme fejl, i hvert fald ved brug af det sidste, som du foreslog.

Invalid attempt to read when no data is present.

Du siger bare til, hvis du skal se noget mere kode eller noget for at kaste lys over sagen.
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 22:49 #7
Ja, den sidste sku' ha' en chance for at virke ;)
Når du udfører sql-sætningen direkte, hvad sker er så?
Avatar billede keenkbh Nybegynder
16. februar 2007 - 22:57 #8
jeg har prøvet at køre følgende SQL direkte i mit SQL-administrationsmodul:

SELECT * FROM Kategori WHERE Navn LIKE 'Bund%';

Og her finder den ganske rigtigt én række.
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 23:08 #9
brug
katNavn.Value = "'"+hardware + "%'";
Avatar billede erikjacobsen Ekspert
16. februar 2007 - 23:22 #10
Eller (kun et gæt, jeg har ikke lige noget at teste på)

        katNavn = kategorier.Parameters.Add("@katNavn", SqlDbType.Char,100);
Avatar billede keenkbh Nybegynder
16. februar 2007 - 23:32 #11
Nu får jeg i det mindste ikke nogen fejlmeddelse, men det ser stadig ikke ud til, at den finder noget, for jeg har nedenunder en if-sætning, som lidt forenklet ser sådan her ud:

if(katRead.HasRows)
{
  Response.Write("Der er resultat af søgningen");
}
else
{
  Response.Write("Der er ikke resultat af søgningen");
}

Og det er kun den nederste der bliver skrevet ud.
Avatar billede keenkbh Nybegynder
17. februar 2007 - 12:24 #12
Har lige fundet ud af, at hasRows ikke er med i v. 2.0. Så jeg må jo lave koden om. Men I kan begge smide et svar.
Avatar billede erikjacobsen Ekspert
17. februar 2007 - 13:16 #13
.net 2.0 ?  Den sku' da gerne have HasRows. Den kom i 1.1
Avatar billede keenkbh Nybegynder
17. februar 2007 - 13:24 #14
Avatar billede erikjacobsen Ekspert
17. februar 2007 - 14:24 #15
Nu har dokumentation og Microsoft det jo ikke altid lige godt med hinanden ;)
Man kan nemlig også læse den side du linker til som at HasRows ikke findes i .NET 1.0, men at den findes fra 1.1 og frem. Når du ikke får syntaksfejl på den, så virker den - tro på det ;))
Avatar billede keenkbh Nybegynder
17. februar 2007 - 19:08 #16
Nåh, men nu har jeg løst det vha. if(katRead.Read() == true) og det spiller.

Men læg svar, hvis I vil have point for jeres inputs.
Avatar billede erikjacobsen Ekspert
17. februar 2007 - 19:13 #17
Jeg samler ikke på point, tak.
Avatar billede erikjacobsen Ekspert
17. februar 2007 - 19:14 #18
Og så er  if(katRead.Read() == true)  og  if(katRead.Read())  det samme  ;)
Avatar billede keenkbh Nybegynder
17. februar 2007 - 19:19 #19
okay... men tror jeg lader det jeg har skrevet stå... for min egen dårlige hukommelses skyld... :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester