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
24 svar · 686 visningar · startad av LindaF
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.
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
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
@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).
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?
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?
Troligen:
#include <sstream>
Tack för svaret aasah men nej, det har jag inte glömt. Några andra förslag?
namespace?
PeW>> Vilka namespace behöver jag? Ny på området...
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 :)
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
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?
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?
Hej Spango!
Är det skillnad...? Märks att jag är MYCKET ovan antar jag. Ja, jag kör i Visula Studio .NET.
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...
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...
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...