webForumDet fria alternativet

Problem med WHERE i SELECT-sats

C/C++

24 svar · 686 visningar · startad av LindaF

Medlem sedan aug. 200419 inlägg
Frågan#1

Hej!

Jag håller på att lära mig C++ och har kopplat min applikation mot en databas, so far so good.

Just nu försöker jag bygga en sök-funktion där användaren ska kunna ange bland annat förnamn för att få ut mer info.

Problemet är att jag inte vet hur jag ska få in varibeln fornamn i SELECT-satsen. När jag skriver så här

[this->hamtavarden = new OleDbDataAdapter(S"SELECT * FROM Adress WHERE Fornamn= '" & fornamn &"'", rofadatabas);]

så får jag felmeddelandet & illegal operand. Detta kan jag ju förstå eftersom &-tecknet har med pekare att göra (om jag förstått det hela rätt). Men vad skriver jag istället? Skriver jag in ett förnamn direkt i strängen så fungerar det ju *frustrerad*

Tacksam för svar.

Medlem sedan mars 20034 471 inlägg
#2

Tror problemet är här:
OleDbDataAdapter(S"SELECT * FROM Adress WHERE Fornamn= '" & fornamn &"'", rofadatabas);]

Det S:t ska väl inte vara där? :q

Medlem sedan juni 200032 967 inlägg
#3

Det är "bara" i VB och liknande språk man använder & för att konkatenera ihop strängar. Prova med + istället.

Och välkommen till webForum!

mvh

Medlem sedan juni 20008 205 inlägg
#4

@nders skrev:

Det är "bara" i VB och liknande språk man använder & för att konkatenera ihop strängar. Prova med + istället.

Det går inte med strängkonstanter. Jag skulle rekommendera nåt i stil med...

#include <sstream>
// ...
ostringstream oss;
oss << "SELECT * FROM Adress WHERE Fornamn= '" << fornamn << "'";
this->hamtavarden = new OleDbDataAdapter(oss.str(), rofadatabas);

ostringstream är en klass som kan användas som en ström, men i stället för att skriva till en fil eller liknande krämar den ner allt på en sträng. str() returnerar den strängen.

&-operatorn används f.ö. för bitmanipulering (bitvis AND, som den också kallas).

Medlem sedan juni 200032 967 inlägg
#5

OT:

spango skrev:

Det går inte med strängkonstanter.

Oki! Kan du ge ett exempel när man kan använda + för att konkatenera?

Medlem sedan aug. 200419 inlägg
#6

Hej och tack för snabba svar och för välkomnandet!

Det här med + verkar inte fungera.

När jag försöker med Spangos modell får jag ostringsstream och oss undeclared identifier. Vad har jag glömt?

Medlem sedan mars 20034 471 inlägg
#7

Troligen:
#include <sstream>

Medlem sedan aug. 200419 inlägg
#8

Tack för svaret aasah men nej, det har jag inte glömt. Några andra förslag?

Medlem sedan juni 200010 432 inlägg
#9

namespace?

Medlem sedan aug. 200419 inlägg
#10

PeW>> Vilka namespace behöver jag? Ny på området...

Medlem sedan juni 20008 205 inlägg
#11

Det namespace du ska använda är std. Tre varianter:

// dålig:
#include <sstream.h>
// resten som förut

// bra, variant 1:
#include <sstream>
using namespace std;
// resten som förut

// bra, variant 2:
#include <sstream>
// ...
std::ostringstream oss;
oss << "SELECT * FROM Adress WHERE Fornamn= '" << fornamn << "'";
this->hamtavarden = new OleDbDataAdapter(oss.str(), rofadatabas);

Slänger du in .h-suffixet i #includen ignoreras namespaces, vilket inte är särskilt god sed. Om du i stället explicit säger att du använder std, antingen genom using eller genom att lägga till std:: gör du det på "rätt" sätt.

@nders skrev:

OT:

spango skrev:

Det går inte med strängkonstanter.

Oki! Kan du ge ett exempel när man kan använda + för att konkatenera?

Jupp... stringklassen kan använda det:

string s = "naken";
doSomething(s + "chock");

Det är bara för char* + char* som är odefinierad har jag för mig, string + char* eller char* + string bör gå bra. string är en väldigt bra klass :)

Medlem sedan juni 200010 432 inlägg
#12

char * ger ju en pekare till något minnesutrymme som allokeras på stacken för "blablablabla...". En plusoperator på en primitiv pekare blir hur konstigt som helst för kompilatorn. Med string-klassen wrappas samma sak till ett nytt utrymme med utökad storlek som då ger intrycket av konkatenering på samma variabel.

I övrigt fick du en bra förklaring av spango angående namespace, LindaF

Medlem sedan aug. 200419 inlägg
#13

Hej och tack för alla tips. Har provat under kvällen och nu på morgonen men jag får det inte att fungera!

Jag försökte också med en helt ny "modell"

[
String* fornamn = getFornamn();

   OleDbCommand\* kommando = new OleDbCommand();
   kommando-\>CommandText = S"SELECT \* FROM   
               Adress WHERE Fornamn = '" \<\< fornamn \<\< "'";
   kommando-\>CommandType = CommandType::Text;
   kommando-\>Connection = rofadatabas;

]

men då får jag felmeddelande << illegal operand, has type System::String__gc*'

Någon som kan förklara varför?

Medlem sedan juni 20008 205 inlägg
#14

OK, jag antog att fornamn var en char*. Vad är det du använder för String-klass? Det här börjar lukta C++.net, eller?

Medlem sedan aug. 200419 inlägg
#15

Hej igen!

När jag kör spangos modell

[
String* fornamn = getFornamn();

   std::ostringstream oss;
   oss \<\< "SELECT \* FROM Adress WHERE Fornamn= '" \<\< fornamn \<\< "'";
    this-\>hamtavarden = new OleDbDataAdapter(oss.str(), rofadatabas);	   

]

får jag följande felmeddelande:

System::String __gc forcingvalue to bool true or false och
cannot convert from std::ostringstream till System::String __gc

Någon som har några förslag?

Medlem sedan aug. 200419 inlägg
#16

Hej Spango!

Är det skillnad...? Märks att jag är MYCKET ovan antar jag. Ja, jag kör i Visula Studio .NET.

Medlem sedan juni 20008 205 inlägg
#17

Hmm, OK, jag har inte riktigt koll på hur strängarna från dotnet-biblioteket agerar med C++s inbyggda klasser. Det verkar som om nån annan får träda in här...

Medlem sedan aug. 200419 inlägg
#18

Okej, tack för svaret! Menar du att .NET inbyggda klasser påverkar C++ i övrigt? Vill bara få detta klart för mig då jag trodde att .NET var utvecklat som en hjälp...

Medlem sedan mars 20034 471 inlägg
#19

LindaF skrev:

... kommando->CommandText = S"SELECT * FROM ....

Jag kan ingenting om .NET, men är du verkligen säker på att du vill ha ett extra S före strängen? Det ser helt sjukt ut.

Alltså du skriver: ... = S"SELECT....

Borde det inte vara: ... = "SELECT...

Medlem sedan aug. 200419 inlägg
#20

Hej assah!

Jag utgår från boken Microsoft Visual c++.net av Julan Templeman mfl, det är därifrån jag fått det. Det fungerar lika bra utan, det är bara en vana.

Kanske någon annan kan förklara det här med S?

269 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)