Jag har klarat detta tidigare, men sen fick jag en krach, och allt är försvunnit... Vilken databashanterare försöker du göra det mot? Hej Jon. Access klarar inte av flera frågor i samma anrop, det du gjort tidigare är troligtvis sub-select och det är en annan sak. Du får köra din INSERT först och sedan en ny SELECT. Jon Wiberg tyvärr så blev det samma error. Jag får tydligen överge min tanke men jag behöver likväl lite hjälp här. Vad skrivs till databasen när det "blir fel"? Den skrev ingenting, sen blev jag förb-ad tog bort allt och började om igen och då fungerade det. Japp, om du har '' runt alla fält så kommer den inte klaga på det utan lagra numeriska värden rätt trots du anger '' runt. Tack Pelle sql-injection har jag redan tagit hand om.Problem med SQL och SELECT @@identity
<code>
sql = @"INSERT INTO t_kontakt (Foretag,Namn,Adress,Ort,Epost)" +
"VALUES('" + sForetag + "','" + sNamn + "','" + sAddres + "','" +
sOrt + "','" + sEpost + "'); SELECT @@identity ;";
</code>
Den såg alltså ungefär ut så här och fungerade kanon.
Error:
"Tecken efter slutet av SQL-uttryck."
flyttar jag semikolon till venster om parentesen
"Syntaxfel i frågeuttrycket ''benni@saw.se';'."
tar jag bort semikolon
"Semikolon saknas i slutet av SQL-uttryck."
Jag har jagat runt här och på andra forum samt internet men jag har inte
hittat någon lösning.
Tacksam för hjälp.Sv: Problem med SQL och SELECT @@identity; Vilken db-hanterare?
- en möjlig orsak; då access inte klarar multipla frågor särskilt bra. (multiple resultset)
Testa att få din SQL sträng så som din applikation ser den.
Dvs skriv ut den, eller Visual studio debug-läge och visualiser.
Jag ser en ev. möjlighet i att du inte har ngt mellanslag mellan kolumnnamnen och VALUES
-->
(Foretag,Namn,Adress,Ort,Epost)VALUES
Ett tips för att slippa konkatenera ihop SQL allmänt för .net är att använda tex string.format
Ex nedan:
<code>
sql = String.Format("INSERT INTO t_kontakt (Foretag,Namn,Adress,Ort,Epost) VALUES ('{0}','{1}','{2}','{3}','{4}'); SELECT @@identity ;", sForetag, sNamn, sAddres, sOrt, sEpost);
</code>
Ett annat tips är att du använder parametrar för att minimera risken för SQL-injections.
// Lycka till :)Sv:Problem med SQL och SELECT @@identity; Vilken db-hanterare?
Ursäkta jag glömde säga att det rör sig om Access. SQL-injections har jag redan tagit hand om.
Jag har/brukar alltid skriva ut sqlen med Response.Write och det ser helt ok ut.
Jag skall undersöka det med mellanslaget.
Din string.Format ser ju onekligen väldigt intressant ut, jag skall försöka med den.
När det gäller Access och multipla frågor så har jag i en annan applikation lyckats med en väldigt
inveklad fråga (där en silect innehåller tre andra select).Sv: Problem med SQL och SELECT @@identity; Vilken db-hanterare?
/JohanSv:Problem med SQL och SELECT @@identity; Har fungerat tidigare
Det som är så frusterande är att det har lyckats tidigare.Sv: Problem med SQL och SELECT @@identity; Har fungerat tidigare
Databasen har två tabeller t_kontakt(för namn epost osv) och en t_kontaktExst(för varje anrop ifrån
kunden, som medelande osv)
Min tanke är då, när en kund har fyllt i formuläret och skickat, så skall det kollas om det är en ny kund
eller en gammal kund.
Vid ny kund så fylls bägge tabbelerna i, vid gammal kund så tar man fran kundens id genom namn
och epost. Kunden kan alltså fylla i hur många gånger som helst, och allt hamnar i t_kontaktExst.
Men jag tänker galet någonstans för även vid en "ny" kund så påstår scriptet att den har hittat kunden(id=1).
(just nu så finns ingenting registrerat i dessa bägge tabeler.
<code>
int iId = 0;
sql="SELECT Id FROM t_kontakt WHERE Namn ='" +sNamn+ "' AND Epost ='" +sEpost+ "'";
DataTable dt = Webbutill.fillDataTable(DBConn, sql);
if (dt.Rows.Count > 0)
{
DataRow row = dt.Rows[0];
iId = Convert.ToInt32(row["Id"]);
}
if(iId >0)
{
sql = String.Format("INSERT INTO t_kontaktExst (KonID,Datum,Kontakttyp,Lang,Medelande)
VALUES ('{0}','{1}','{2}','{3}','{4}');", iId, dDate, sKontakttyp, sLang, sMeddelande);
Webbutill.executeSQL(sql, DBConn);
DBConn.Close();
LStatus.Text = sql;
}
else
{
sql = String.Format("INSERT INTO t_kontakt (Foretag,Namn,Adress,Ort,Epost) VALUES
('{0}','{1}','{2}','{3}','{4}');", sForetag, sNamn, sAddres, sOrt, sEpost);
LStatus.Text = sql;
Webbutill.executeSQL(sql, DBConn);
sql = "SELECT Id FROM t_kontakt WHERE Namn ='" + sNamn + "' AND Epost ='" + sEpost + "'";
dt = Webbutill.fillDataTable(DBConn, sql);
if (dt.Rows.Count > 0)
{
DataRow row = dt.Rows[0];
int iId = Convert.ToInt32(row["Id"]);
sql = String.Format("INSERT INTO t_kontaktExst (KonID,Datum,Kontakttyp,Lang,Medelande)
VALUES ('{0}','{1}','{2}','{3}','{4}');", iId, dDate, sKontakttyp, sLang, sMeddelande);
Webbutill.executeSQL(sql, DBConn);
}
}
</code>
Tacksam för förbättrande/förenklande förslag.Sv:Problem med SQL och SELECT @@identity; Har fungerat tidigare
/JohanSv: Problem med SQL och SELECT @@identity; Har fungerat tidigare
En fråga till:
När man skriver:
<code>
"INSERT INTO t_kontaktExst (KonID,Datum,Kontakttyp,Lang,Medelande)
VALUES ('{0}','{1}','{2}','{3}','{4}');", iId, dDate, sKontakttyp, sLang, sMeddelande
</code>
styrs det automatiskt vad det är för datatyp i databasen?
Är det bra att ha den här typen även vid select?Sv:Problem med SQL och SELECT @@identity; Har fungerat tidigare
Tänk alltid på sql-injection så du inte blir hackad bara så är det ganska lugnt. Sv: Problem med SQL och SELECT @@identity; Har fungerat tidigare
Då skall jag göra mina sql så i fortsättningen.