Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Beliebigen Wert per VBA in ein Tabellenfeld schreiben

1,314 views
Skip to first unread message

Patrick Pohlmann

unread,
Feb 24, 2011, 6:40:49 AM2/24/11
to
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

Karl Donaubauer

unread,
Feb 24, 2011, 7:28:47 AM2/24/11
to
Patrick Pohlmann wrote:
> 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. ...

Du musst bei Wert das gleiche machen wie bei Wertname, also
Hochkomma drumherum, damit er immer als Text in das (eh Text-) Feld
geschickt wird. Wenn auch Hochkommas im Wert vorkommen können,
dann musst du sie verdoppeln.

--
Servus
Karl
*********
Access-FAQ: http://www.donkarl.com


Patrick Pohlmann

unread,
Feb 24, 2011, 11:39:34 AM2/24/11
to
Hallo Karl,

vielen Dank für die schnelle Antwort.

Leider kann ich vorher nicht sagen ob im Text Hochkommas sein werden oder
nicht. Okay, ich kann danach natürlich vorher suchen. Aber dann muss ich ja
im Text jedes Hochkomma "ummanteln", oder? Also am besten vorher ' durch '''
ersetzen?

Gibt´s da keine andere Möglichkeit? Ggf. nicht mit VBA sondern mit einer
Gespeicherten Prozedur arbeiten? (Ich weiss, damit bin ich hier in der
falschen Gruppe..)

Viele Grüße

Patrick

"Karl Donaubauer" schrieb im Newsbeitrag
news:8sn17m...@mid.individual.net...

Karl Donaubauer

unread,
Feb 24, 2011, 11:50:49 AM2/24/11
to
Patrick Pohlmann wrote:
> "Karl Donaubauer" schrieb:
> ... Du musst bei Wert das gleiche machen wie bei Wertname, also

> Hochkomma drumherum, damit er immer als Text in das (eh Text-) Feld
> geschickt wird. Wenn auch Hochkommas im Wert vorkommen können,
> dann musst du sie verdoppeln.
> ...

> Leider kann ich vorher nicht sagen ob im Text Hochkommas sein werden
> oder nicht. Okay, ich kann danach natürlich vorher suchen. Aber dann
> muss ich ja im Text jedes Hochkomma "ummanteln", oder? Also am besten
> vorher ' durch ''' ersetzen?
>
> Gibt´s da keine andere Möglichkeit? Ggf. nicht mit VBA sondern mit
> einer Gespeicherten Prozedur arbeiten? (Ich weiss, damit bin ich hier
> in der falschen Gruppe..)

Anders als du :-), habe ich inzwischen gesehen, dass du die gleiche
Frage auch im MS-Forum gepostet hast und dir Stefan Hoffmann dort
vor Stunden schon eine ähnliche Antwort inkl. dem nicht eben
mörderaufwändigen Ersetzen-Code für Hochkommas schrieb. Also:

Replace(Wert, "'", "''")

Patrick Pohlmann

unread,
Feb 24, 2011, 11:55:21 AM2/24/11
to
Ups.. :-) Nein, stimmt hab da noch nicht wieder geschaut. Komme damit
irgendwie noch nicht klar. Aber danke für den Hinweis.

Viele Grüße

Patrick

"Karl Donaubauer" schrieb im Newsbeitrag

news:8sngj5...@mid.individual.net...

Winfried Sonntag

unread,
Feb 24, 2011, 12:18:01 PM2/24/11
to
Am 24.02.2011 schrieb Patrick Pohlmann:

> Ups.. :-) Nein, stimmt hab da noch nicht wieder geschaut. Komme damit
> irgendwie noch nicht klar. Aber danke für den Hinweis.

Besser entweder in den Newsgroups oder in den Foren bleiben. Falls Du
dich für die NG entscheidest, dann nimm die in Zukunft:
de.comp.datenbanken.ms-access Die gibts natürlich auch auf dem von dir
ben. Newsserver der Uni in Berlin. ;)

Servus
Winfried
--
Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
Community Forums NNTP Bridge: http://communitybridge.codeplex.com/
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de

Josef Poetzl

unread,
Feb 24, 2011, 12:29:04 PM2/24/11
to
Hallo!

[Ich antwortete doppelt ... einmal hier und einmal im MS-Forum]

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

0 new messages