Feedback

VB - SQL INSERT-Stringbuilder Function

Veröffentlicht von am 9/11/2008
(3 Bewertungen)
Benutzung:

Dim fishe() As String = {"Goldfische", "Blas"}
Dim werte() As String = {"24 Goldies", "37 Blas"}
MsgBox(SQL_Build_INSERT("Tiere", fishe, werte))

Ergebis:

INSERT INTO Tiere (`Goldfische`, `Blas`) VALUES ('Goldfische', 'Blas')

Hoffe es hilft euch weiter...
GreeZ TTP
Private Function SQL_Build_INSERT(ByVal Tablename As String, ByVal Felder As Array, ByVal Werte As Array) As String
        Dim res As String = Nothing
        If Tablename = Nothing Or Felder.Length = 0 Or Felder.Length <> Werte.Length Then
            Throw New Exception("Tablename or Felder = NOTHING or Felder.Length <> Werte.Length")
        End If
        Dim ai As Integer = Felder.Length
        Dim i As Integer
        res = "INSERT INTO " & Tablename & " ("
        For i = 0 To Felder.Length - 1
            If i = 0 Then
                res &= "`" & Felder(i).ToString & "`"
            Else
                res &= ", `" & Felder(i).ToString & "`"
            End If
        Next
        res &= ") VALUES ("
        For i = 0 To Werte.Length - 1
            If i = 0 Then
                If Werte(i).ToString = Nothing Then
                    res &= "NULL"
                Else
                    res &= "'" & Felder(i).ToString & "'"
                End If
            Else
                If Werte(i).ToString = Nothing Then
                    res &= ", NULL"
                Else
                    res &= ", '" & Felder(i).ToString & "'"
                End If
            End If
        Next
        res &= ")"
        Return res
    End Function
Abgelegt unter SQL, MySQL, INSERT, STRINGbuilder, FUNCTION.

5 Kommentare zum Snippet

TTP schrieb am 9/12/2008:
Nette Idee :)
Jan Welker schrieb am 9/12/2008:
Ich halte diesen Snippet für sehr bedenklich und kann jedem ans Herz legen, SQL Statements nur mit Hilfe von Parametern aufzubauen. Werden die Strings einfach nur verkettet, besteht die Gefahr von SQL Injection!

Weiterführende Links:
http://de.wikipedia.org/wiki/SQL_Injection
http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlparameter.aspx
TTP schrieb am 9/14/2008:
Der Code ist auch nur Gedacht um die Programmierung von festen SQL-Abfragen zu vereinfachen. Ich hab ein Programm was mehrere verschiedene SQL Abfragen ändert. Der Betreiber des SQL-Servers ändert nur gern mal Feldnamen und so macht es mir das einfacher und schneller den Code zu ändern und nicht alle SQL-Strings per Hand umzuschreiben, denn ich brauch dann nur den nötigen Array ändern.

Der Meinung, dass man diesen Code vor SQL-Injection schützen muss, bin ich aber auch!
TTP schrieb am 9/14/2008:
http://dotnet-snippets.de/dns/c-schutz-vor-sql-injektion-SID201.aspx
C# Schutz vor SQL-Injektion

Das ganze noch für die Update-Routinge
Private Function SQL_Build_UPDATE(ByVal Tablename As String, ByVal Felder As Array, ByVal Werte As Array, ByVal WHERE As String, Optional ByVal LIMIT As String = "") As String
Dim res As String = Nothing
If Tablename = Nothing Or Felder.Length = 0 Or Felder.Length <> Werte.Length Then
Throw New Exception("Tablename or Felder = NOTHING or Felder.Length <> Werte.Length")
End If
Dim ai As Integer = Felder.Length
Dim i As Integer
res = "UPDATE " & Tablename & " SET "
For i = 0 To Felder.Length - 1
If Werte(i).ToString = Nothing Then
If i = 0 Then
res &= "`" & Felder(i).ToString & "` = NULL"
Else
res &= ", `" & Felder(i).ToString & "` = NULL"
End If
Else
If i = 0 Then
res &= "`" & Felder(i).ToString & "` = '" & Werte(i).ToString & "'"
Else
res &= ", `" & Felder(i).ToString & "` = '" & Werte(i).ToString & "'"
End If
End If
Next

res &= " WHERE " & WHERE
If Not LIMIT = "" Then
res &= " LIMIT " & LIMIT
End If

Return res
End Function


Funktionsweise:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim felder() As String = {"id", "name", "change"}
Dim werte() As String = {"6", "bla", ""}
MsgBox(SQL_Build_UPDATE("Table", felder, werte, "id='4'", "1"))
End Sub
Kottmann, David schrieb am 1/16/2010:
Im Zusammenspiel mit dem MSSQL Server 2008 musste ich ein paar kleine Änderungen vornehmen, folgender Abschnitt scheint mir aber einen kleinen Fehler zu enthalten:

 For i = 0 To Werte.Length - 1
If i = 0 Then
If Werte(i).ToString = Nothing Then
res &= "NULL"
Else
res &= "'" & Werte(i).ToString & "'"
End If
Else
If Werte(i).ToString = Nothing Then
res &= ", NULL"
Else
res &= ", '" & Werte(i).ToString & "'"
End If
End If
Next

MSSQL 2008
Public Function SQL_Build_INSERT(ByVal Tablename As String, ByVal Felder As Array, ByVal Werte As Array) As String
Dim res As String = Nothing
If Tablename = Nothing Or Felder.Length = 0 Or Felder.Length <> Werte.Length Then
Throw New Exception("Tablename or Felder = NOTHING or Felder.Length <> Werte.Length")
End If
Dim ai As Integer = Felder.Length
Dim i As Integer
res = "INSERT INTO " & Tablename & " ("
For i = 0 To Felder.Length - 1
If i = 0 Then
res &= """" & Felder(i).ToString & """"
Else
res &= ", """ & Felder(i).ToString & """"
End If
Next
res &= ") VALUES ("
For i = 0 To Werte.Length - 1
If i = 0 Then
If Werte(i).ToString = Nothing Then
res &= "NULL"
Else
res &= "'" & Werte(i).ToString & "'"
End If
Else
If Werte(i).ToString = Nothing Then
res &= ", NULL"
Else
res &= ", '" & Werte(i).ToString & "'"
End If
End If
Next
res &= ")"
Return res
End Function
 

Logge dich ein, um hier zu kommentieren!