Hoppas Ni inte tycker detta tär tjatigt. För hur mpnga har nte frågat om hur man gör när man skall lägga till poster i en databas typ Access. Hej, i detta fall så är svaret nej. Man säger att en parameter i den lagrade proceduren är av typen varchar och 50 tecken lång. Det som inte kontrolleras här eller kan ge fel är att om strängen är längre än 50 tecken så kommer datat adderas till tabellen men trunkeras så bara 50 tecken sparas och du kommer samtidigt att få ett felmeddelande från exempelvis sql att "field xx is truncated". Som sagt, datat sparas men du kommer få ett fel. För att lägga till lite mer... Man bör alltså programerings teknikst ha med dessa parametrar. eller är det bara överkurs? Både ja och nej är väl svaret på den frågan. Att skriva detaljerat vad som gäller är inte fel men rent tidsmässigt vid en ändring i en tabell som du förstår förknippad med merarbete. Först måste du ändra i tabellen, sen i den lagrade proceduren och sist i klassen som arbetar mot datat. Precis som Pelle säger är det säkerhet säkerhet säkerhet som gör att man skall ha dessa parametrar. Prestandapåverkan är relativt liten, då SQL (om det är den...) kan cacha frågorna på ett effektivare sätt med parametrar... Tack för era svar , Micke jag kör mot Access, tror jag skrev det i min fråga, var lite trött så min timing på tgb var nog inte vad den brukar. Det stog "typ Access" så jag antog väl lite... På vilket sätt skiljer sig då båda sätten rent säkerhetsmässigt? I den "rena" sql satsen syns givetvis mer om hur tabellen är uppbyggd etc. Är det säkerhetsförlusten i att skriva ut detta i klarttext som du menar? I mickes fall är det rent livsfarligt - den sk sql-injection. En korrekt lösning är i så fall om vi pratar säkerhet: Fast det allra bästa är fortfarande parametrar... Replace på ' behöver inte alltid lösa alla problem, jag skulle rekommendera att använda parametrar istället, ADO.Net ser till att formatera dem så att inget tecken kan bryta frågan.En fråga om INSERT INTO som jag inte förstår
Har ett exempel jag hittat på nätet och skulle vilja få lite förtydligande om:
Jag förstår hitintills varför man skiriver INSERT INTO och Values, men sen på raderna under vad gör dom för något?
string sqlCmd = "INSERT INTO Lists (Name, Description) VALUES (@ListName, @ListDescr)";
OleDbConnection myConn = new OleDbConnection(connString);
OleDbCommand myCmd = new OleDbCommand(sqlCmd, myConn);
myCmd.Parameters.Add(new OleDbParameter("@ListName", OleDbType.VarChar, 50));
myCmd.Parameters["@ListName"].Value = ListName.Trim();
myCmd.Parameters.Add(new OleDbParameter("@ListDescr", OleDbType.VarChar, 250));
myCmd.Parameters["@ListDescr"].Value = ListDescr.Trim();;
Betyder detta att man kan från en textbox kapa av text när man kör frågan så att bara i fallet ovan tar med 50 första tecken?Sv: En fråga om INSERT INTO som jag inte förstår
För att undvika felet får man även vid .Value sätta Left(txtfirstname.text,50) för att slippa ev felmeddelande. Hoppas detta gav svar på din fråga.Sv: En fråga om INSERT INTO som jag inte förstår
Parametrar är ett "nytt" sätt att få databaserna (de som kan) att förbereda frågan på ett smartare sätt. Det betyder att man har en färdig körning som man skickar in värden i. Detta går oftast snabbare än att göra på det gamla sättet med vanlig SQL.
/mickeSv: En fråga om INSERT INTO som jag inte förstår
Sv: En fråga om INSERT INTO som jag inte förstår
Sen tror jag men vågar inte svära på det - tar lite extra tid vid varje sådan deklaration för ADO som måste fyllas med mer data från de olika objekten jämför med en klassisk sql-sträng. Men även där finns det drawbacks med bl.a. sql-injection och du måste även ändra där, men dock inte fälttypsförändringar för det sköts då automatiskt då du bara anger fältnamnen.
Insert into tabell (1,2,3) values('a','b','c')Sv: En fråga om INSERT INTO som jag inte förstår
/mickeSv: En fråga om INSERT INTO som jag inte förstår
Men om jag förstår Er rätt så räcker det igentligen med att bara ha SqlCmd="INSERT INTO Kund (Id, Namn, osv) VALUES (@IDtextbox, @NamnTextbox, @osvTextbox)";
OleDbConnection myConn = new OleDbConnection(connString);
Så lägger den till ny post?Sv: En fråga om INSERT INTO som jag inte förstår
Nej, så kan du inte göra! Om du inte vill ha parametrarna så måste du fylla i värdena istället.
<code>
SqlCmd="INSERT INTO Kund (Id, Namn) VALUES (4 , 'Namnet' )";
</code>
Du måste alltså mata in värdena, så du skriver väl ungefär såhär:
<code>
SqlCmd="INSERT INTO Kund (Id, Namn) VALUES (" + txtID.Text + " , '" + txtNamn.Text + "' )";
</code>
/mickeSv: En fråga om INSERT INTO som jag inte förstår
Sv: En fråga om INSERT INTO som jag inte förstår
<code>
SqlCmd="INSERT INTO Kund (Id, Namn) VALUES (" + Replace(txtID.Text,"'","''") + " , '" + Replace(txtNamn.Text,"'","''") + "' )";
</code>
Med replace-kommandot ersätter man ' med '' vilket är väldigt enkelt men gör att sql-satser inte kan köras med det som står i textfälten man anger.Sv: En fråga om INSERT INTO som jag inte förstår
/mickeSv: En fråga om INSERT INTO som jag inte förstår
Frågan nedan kommer att se till så SQL servern gör en shutdown. För age är integer och innhåller ingen '. Du kan även sätta age till 35 shutdown utan ; och servern skulle startas om.
string name = "fredik ' or 1=1--";
string age = "35; shutdown --";
name = name.Replace("'","''");
age = age.Replace("'","''");
string sql = "SELECT * FROM Employees WHERE firstname = '" + name + "' or employeeid = " + age;
I boken Writing Secure Code second edition sidorna 401-411 kan du läsa om varför det inte räcker enbart med replace på en enkelfnutt. På sidan 402 står det:
Caution: Escaping characters might not make you immune to SQL injection attacks.
På sidan 404, under rubriken: Remedy #2: Building SQL Statements Securely står det att parametrar ska användas för att göra frågan säker.
Use parameterized queries- not string concatenation-to build queries.
Boken är utgiven av Microsoft Press och har ISBN: 0735617228
/Fredrik Normén NSQUARED2
http://normen.mine.nu