webForumDet fria alternativet

UpdateCmd

.NET

8 svar · 377 visningar · startad av Arne

Medlem sedan maj 2000267 inlägg
Frågan#1

Vad har jag för fel i denna kod?
Försöker uppdatera tabellen msgadress
kolumnen "msgto":s alla fält som har värdet av labeln "lblMedlem_User" till "" (alltså ingenting)

	Dim UpdateCmd As String = "UPDATE msgadress SET msgto = '' where msgto = " & lblMedlem_User.text
	MyCommand = New SqlCommand(UpdateCmd, MyConnection)
	MyCommand.ExecuteNonQuery()

Gör jag det i sql Query Analyzer där jag vet namnet går det bra
alla namn "nisse" i kolumnen msgto får värdet "" (ingenting)

UPDATE    dbo.msgadress
SET              msgto = ''
WHERE     (msgto = 'nisse')
Medlem sedan jan. 20023 327 inlägg
#2
	Dim UpdateCmd As String = "UPDATE msgadress SET msgto = '' where msgto = " & lblMedlem_User.text & ""
	MyCommand = New SqlCommand(UpdateCmd, MyConnection)
	MyCommand.ExecuteNonQuery()

Ser ut som fnuttar saknas, har lagt till det så som jag tycker det borde se ut.

Medlem sedan maj 2000267 inlägg
#3

Hjälpte inte

Nix, fnuttar hjälpte inte, får felmeddelandet:
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'nisse'.

Medlem sedan juli 20011 084 inlägg
#4

Du har glömt enkelfnuttarna

Dim UpdateCmd As String = "UPDATE msgadress SET msgto = '' where msgto = '" & lblMedlem_User.text & "'"
MyCommand = New SqlCommand(UpdateCmd, MyConnection)
MyCommand.ExecuteNonQuery()
Medlem sedan maj 2000267 inlägg
#5

Hmmmm

Enkelfnuttarna hjälpte först endast med att jag ite fick något felmeddelande längre.
Men när jag körde den, hände ingenting. Värdet kvar kvar i alla.....

När jag till slut testade med att skriva dbo.msgadress (lägga till dbo.) så fungerade allt som det skulle.

Värdet från labeln ersattes med en tom sträng.

Någon som gärna kan förklara varför så man förstår vad som händer?

Medlem sedan dec. 19996 721 inlägg
#6

Har du två tabeller som heter msgaddress?

Använd alltid, alltid, alltid parametriserade frågor.

Dim UpdateCmd As String = "UPDATE msgadress SET msgto = '' where msgto = @msgto"
MyCommand = New SqlCommand(UpdateCmd, MyConnection)
MyCommand.Parameters.Add("@msgto",SqlDbType.VarChar,50).Value=lblMedlem_User.text
MyCommand.ExecuteNonQuery()

Snabbare, enklare, säkrare, roligare.

Medlem sedan maj 2000267 inlägg
#7

Varför, varför......

Har bara en tabell som heter msgaddress.
Motfråga till ditt "Använd alltid, alltid, alltid parametriserade frågor"

Varför, och vad är skillnaden?

Medlem sedan juli 20011 084 inlägg
#8

Snabbare, enklare, säkrare, roligare.

(y)

Medlem sedan dec. 19996 721 inlägg
#9

Arne skrev:

Har bara en tabell som heter msgaddress.
Motfråga till ditt "Använd alltid, alltid, alltid parametriserade frågor"

Varför, och vad är skillnaden?

Skillnaden är att man skickar in alla variabla värden i SQL-frågan som separata parametrar i kommandot i stället för att kludda in värdena i själva frågan.

Snabbare
Bland annat pga att SQL-servern cachar exekveringsplanen för själva SQL-frågan. Eftersom frågan ser likadan ut, oavsett parametrarnas värden, blir cachningen effektivare.

Enklare
Enklare, eftersom man inte behöver oroa sig över enkelfnuttar hit och kommatecken dit. Det blir enklare att skriva själva frågan, helt enkelt.

Säkrare
Den helt klart viktigaste aspekten. Risken för SQL Injection är eliminerad, och man behöver inte ersätta enkelfnutt med dubbel enkelfnutt. För det gör du väl?

Roligare
Det är väl roligt att göra något snabbare, enklare och säkrare?! :)

265 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
132 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)