webForumDet fria alternativet

Typblandningsfel

.NET

13 svar · 383 visningar · startad av Annelie_82

Medlem sedan okt. 200221 inlägg
Frågan#1

Jag får ett typblandnings fel när jag kör min kod...
Den klagar på OleDbDataReader dbread = cmd.ExecuteReader();

protected void submit_Click(object sender, System.EventArgs e)
{
String varGenre = GenreList.SelectedItem.Value;
String varAlder =  AlderList.SelectedItem.Value;
String varAtmosfar = AtmosfarList.SelectedItem.Value;
String varEvenemang =EvenemangList.SelectedItem.Value;
String varKladsel = KladselList.SelectedItem.Value;
		
String myConn  ="Provider=Microsoft.JET.OLEDB.4.0;Data Source=C:/Inetpub/wwwroot/sthlmskrogar1/sthlmkrog.mdb;";
OleDbConnection cn = new OleDbConnection(myConn);
cn.Open();
	
String strSQL = "SELECT Krog.KrogNamn FROM Krog WHERE ((Genre='varGenre') AND (Ålder='varAlder') AND (Atmosfär='varAtmosfar') AND (Evenemang='varEvenemang') AND (Klädsel='varKladsel'))";
		
OleDbCommand cmd = new OleDbCommand(strSQL, cn);
OleDbDataReader dbread = cmd.ExecuteReader();
			
VisaLista.DataSource = dbread;
VisaLista.DataBind();
dbread.Close();
Medlem sedan mars 20007 896 inlägg
#2

Frågan är om du verkligen kan använda dig av å, ä och ö...

Medlem sedan okt. 200221 inlägg
#3

Jag vet att man egentligen inte ska göra det, men det har funkat förut...

Medlem sedan mars 20007 896 inlägg
#4

Hela SQL-frågan ser lite knasig ut. Du kommer nu att jämföra t.ex. fältets evenemangs värden mot strängen varEvenemang. Du använder inte dina variabler, med andra ord. Du får då göra:

...WHERE Genre='" + varGenre + "' AND Ålder='" + varAlder + "'...

S.k. konkatenering, du "klipper in" dina variablers värden till strängen 'strSQL'. Som du ser tog jag bort dina parenteser också, de är överflödiga.

Medlem sedan okt. 200221 inlägg
#5

Har ändrat nu så att det inte finns några å,ä,ö med.. men det e samma fel...

Medlem sedan dec. 20003 887 inlägg
#6

Vare sig man kan/får använda å, ä, ö eller inte, så ska man helt enkelt inte göra det. Frågan bör väl dock göras om...

string strSQL = "SELECT Krog.KrogNamn FROM Krog ";
       strSQL += "WHERE Genre = '" + varGenre + "' ";
       strSQL += "AND [red][b]Ålder[/b][/red] = '" + varAlder + "' "; [blue]//är Ålder verkligen en sträng?[/blue]
       strSQL += "AND Evenemang = '" + varEvenemang + "' ";
       strSQL += "AND [red][b]Klädsel[/b][/red] = '" + varKladsel + "')";

Jag sätter en slant på att felet ligger i att Ålder inte är en sträng...

Medlem sedan okt. 200221 inlägg
#7

Jag har har nu ändrat min SQL-fråga så som du (SPiN) sa, men jag får samma fel...

Medlem sedan mars 20007 896 inlägg
#8

Jo, jag visste att det inte skulle hjälpa mot problemet - det var bara för att visa att du inte skulle få rätt resultat av frågan. :)

Som Engine^ säger så är något av fälten inte en sträng, därav felmeddelandet. Ta bort fnuttarna runt värdet på det fältet, så ska problemet säkert lösas.

Medlem sedan okt. 200221 inlägg
#9

Ok, testade att skriva .ToString() ... men det hjälpte inte det heller..

Medlem sedan mars 20007 896 inlägg
#10

Nej, alltså inte variablerna. Utan fälten i databasen.

Vad är dina fält för typer? Vilken data klarar de av att lagra? Jag antar att fältet Ålder inte är en VARCHAR, och då borde du inte använda enkelfnuttar kring det värde du vill jämföra mot:

...Ålder = " + varAlder + " AND...
Medlem sedan okt. 200221 inlägg
#11

Aaahhh, dumt av mej. Nu funkar det, Jippi! Tack så jätte mycket för hjälpen!

Medlem sedan maj 20012 812 inlägg
#12
string strSQL = "SELECT Krog.KrogNamn FROM Krog ";
       strSQL += "WHERE Genre = '" + varGenre + "' ";
       strSQL += "AND Ålder = '" + varAlder + "' "; //är Ålder verkligen en sträng?
       strSQL += "AND Evenemang = '" + varEvenemang + "' ";
       strSQL += "AND Klädsel = '" + varKladsel + "')";

Usch... det är så man blir mörkrädd.
Det finns 2 vanliga prestandproblem i .NET. Det en är boxing och unboxing, det andra är stränghanteringe.

I detta fall så kommer det att skapas en ny sträng för varje + man har. Skall man lägga strängar med varandra så skall man använd StringBuilder klassen. Det finns prestanda vinster även om man bara lägger till 1 sträng till en annan. Den vinsten är dock liten. Men i exemplet ovan blir prestandavinsten betydande.

- M

Medlem sedan dec. 20003 887 inlägg
#13
StringBuilder sbSQL = new StringBuilder("SELECT Krog.KrogNamn FROM Krog WHERE Genre = '");
sbSQL.Append(varGenre).Append("' ").Append("AND Ålder = ").Append(varAlder);
sbSQL.Append(" AND Evenemang = '").Append(varEvenemang).Append("' AND Klädsel = '").Append(varKladsel).Append("');

OleDbCommand cmd= new OleDbCommand(sbSQL.ToString(), cn);
Medlem sedan maj 20012 812 inlägg
#14

Men Engine. Varfør skriver du inte rætt från børjan.

Man måste læra folk om prestanda och hur man skriver korrekt kod. Sitter på ett projekt nu, dær man inte har tænkt mycket på prestanda, eller att fundera på vad man har skrivit.

Gissa om jag ær lite irriterad nær jag får sitta och ændra i en massa VB6 kod før att mitt C# program skall fungera som jag vill.

- M

253 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
116 ms — ändringar (db)