none
Beliebigen Wert per VBA in ein Tabellenfeld schreiben

    Frage

  • Hallo Zusammen,

    Ich habe eine Tabelle mit folgenden Feldern:
    WertName (PS,varchar(50), Nicht NULL)
    Wert (varchar(8000), Nicht NULL)
    UserID (varchar(50), Nicht NULL)

    In diese Tabelle möchte ich per SQL String Datensätze schreiben. Dazu habe
    ich folgende VBA Funktion:

    Function GlobaleVariableSetzen(Wertname As String, Wert As String, Optional
    strUserID As String)

    If strUserID = "" Then
    strUserID = AktuellerBenutzer
    End If

    strSQL = "Insert Into GlobaleVariable (Wertname, Wert, UserID) Values('" &
    Wertname & "', " & Wert & ", '" & strUserID & "')"

    Set cnn = CurrentProject.Connection
    cnn.Execute strSQL
    cnn.Close
    End Function

    Leider macht "Wert" immer wieder Probleme wenn darin ein Punkt (.) oder ein
    Komma (,) vorkommen. Manchmal hilft es, wenn ich dann im String noch ein
    Hochkomme vor und hinter dem Wert einsetze, manchmal auch wieder nicht.

    Kann mir jemand einen Trick verraten wie ich sicherstellen kann, dass ich
    mit einer Funktion wirklich jede Zeichenfolge in die Tabelle schreiben kann.

    Vielen Dank für Eure Hilfe

    Viele Grüße

    Patrick

     

    P.s. Ich bitte das Doppelposting zu entschuldigen. Ich habe diese Frage auch schon in der Newsgroup gestellt, stelle aber gerade fest, dass diese wohl relativ tot ist.

    Donnerstag, 24. Februar 2011 12:01

Antworten

  • hi Patrik,

    Leider macht "Wert" immer wieder Probleme wenn darin ein Punkt (.) oder ein Komma (,) vorkommen.

    Oder ein '. Das Problem ist eigentlich keines da du deinen Wert als String schon übergibst. Daher musst du immer deinen Wert in Hochkommata einschliesen:

    Wertname = "'" & Replace(Wertname , "'", "''") & "'"
    Wert = "'" & Replace(Wert , "'", "''") & "'"
    strUserID = "'" & Replace(strUserID, "'", "''") & "'"
    strSQL = _
      "INSERT INTO GlobaleVariable (Wertname, Wert, UserID) " & _
      "VALUES (" & Wertname &  ", " & Wert & ", " & strUserID & ") ;"

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 24. Februar 2011 12:11
    Moderator

Alle Antworten

  • hi Patrik,

    Leider macht "Wert" immer wieder Probleme wenn darin ein Punkt (.) oder ein Komma (,) vorkommen.

    Oder ein '. Das Problem ist eigentlich keines da du deinen Wert als String schon übergibst. Daher musst du immer deinen Wert in Hochkommata einschliesen:

    Wertname = "'" & Replace(Wertname , "'", "''") & "'"
    Wert = "'" & Replace(Wert , "'", "''") & "'"
    strUserID = "'" & Replace(strUserID, "'", "''") & "'"
    strSQL = _
      "INSERT INTO GlobaleVariable (Wertname, Wert, UserID) " & _
      "VALUES (" & Wertname &  ", " & Wert & ", " & strUserID & ") ;"

    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Donnerstag, 24. Februar 2011 12:11
    Moderator
  • Hallo Stefan,

    vielen Dank. Das ist tatsächlich die Lösung. Hast mir sehr geholfen.

    Viele Grüße

    Patrick

    Donnerstag, 24. Februar 2011 17:03
  • Hallo!

    Patrick Pohlmann schrieb:

    strSQL = "Insert Into GlobaleVariable (Wertname, Wert, UserID) Values('" & Wertname & "', " & Wert & ", '" & strUserID & "')"

    Set cnn = CurrentProject.Connection
    cnn.Execute strSQL
    cnn.Close

    [...]

    Kann mir jemand einen Trick verraten wie ich sicherstellen kann, dass ich mit einer Funktion wirklich jede Zeichenfolge in die Tabelle schreiben kann.

    Ergänzend zu den Varianten mit dem dynamischen Zusammensetzen von
    SQL-Anweisungen möchte ich auf die Möglichkeit von Parameterabfragen
    hinweisen.

    Beispiel:
    Const ParamSQL = _
      "Insert Into GlobaleVariable (Wertname, Wert, UserID) Values(?, ?, ?)"

    Dim cnn As ADODB.Connection
    Dim cmd As ADODB.Command

    Set cnn = ...

    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = ParamSQL

    cmd.Parameters(0).value = Wertname
    cmd.Parameters(1).value = Wert
    cmd.Parameters(2).value = strUserID
    cmd.Execute

    Das sieht zwar auf den ersten Blick etwas umständlicher aus, aber wenn
    du das in eine kleine Hilfsprozedur steckst, ist das mindestens so
    praktisch zum Anwenden wie das Zusammensetzen einer SQL-Anweisung, die
    per Connection.Execute ausgeführt wird.
    Dafür kann es dir später egal sein, welche Sonderzeichen oder was auch
    immer in den String-Variablen enthalten sind.
    Nebenbei bist du auch eine mögliche Prüfung auf SQL-Injection los.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Donnerstag, 24. Februar 2011 17:26