あなたは何かにぶつかったようです:SQL DDLを使用してそれらの文字のいずれかを含む(使用可能な)パスワードを作成することはできません(ウィキペディアはこれをSQL DCLと見なしていることに注意してください)。
以下は、テストシナリオを再現するためのコードです。
- 新しいワークグループを作成します(一時フォルダー内)
- ワークグループを使用して新しいデータベースを作成します
- データを含む新しいテーブルを作成します
- 全体に英数字を使用して、名前、パスワード、およびPIDを持つ新しいユーザーを作成します
- テーブルに対する特権をユーザーに付与します
- 新しいユーザーの資格情報を使用してテスト接続を開きます
- ユーザーがテーブルをクエリできることをテストします
投稿されたコードは正常に機能します。ただし、両方の場所(ユーザーが作成されたときとテスト接続が開かれたとき)でパスワードを編集して非英字(引用符など)を追加すると、これらの場所の1つでエラーが発生します。
On Error Resume Next
Kill Environ$("temp") & "\MyDatabase.mdb"
Kill Environ$("temp") & "\MyWorkgroup.mdw"
On Error GoTo 0
' Create workgroup and db
Dim cat
Set cat = CreateObject("ADOX.Catalog")
With cat
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Jet OLEDB:Engine Type=4;" & _
"Data Source=" & _
Environ$("temp") & "\MyWorkgroup.mdw;" & _
"Jet OLEDB:Create System Database=-1"
.Create _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Jet OLEDB:Engine Type=4;" & _
"Data Source=" & _
Environ$("temp") & "\MyDatabase.mdb;" & _
"Jet OLEDB:System Database=" & _
Environ$("temp") & "\MyWorkgroup.mdw;"
' Add table with data and user with privileges
With .ActiveConnection
.Execute "CREATE TABLE Test (data_col INTEGER);"
.Execute "INSERT INTO Test VALUES (55);"
.Execute "CREATE USER onedaywhen pwd H3sJaZ9k2m;" ' <-- edit pwd
.Execute "GRANT ALL PRIVILEGES ON Test TO onedaywhen;"
End With
End With
' Test user can connect and SELECT
Dim con
Set con = CreateObject("ADODB.Connection")
With con
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Jet OLEDB:Engine Type=4;" & _
"Data Source=" & _
Environ$("temp") & "\MyDatabase.mdb;" & _
"Jet OLEDB:System Database=" & _
Environ$("temp") & "\MyWorkgroup.mdw;" & _
"User ID=onedaywhen;Password=pwd;" ' <-- edit pwd
.Open
MsgBox .Execute("SELECT * FROM Test;")(0)
End With
「特殊」文字をエスケープする手段がない場合、SQL DDL / DCMを使用してこれを実行することはできないようです。つまり、ADOを使用してエスケープすることはまったくできないと思います。
だから、誰かがDAOなどの代替手段を手に入れましたか?