ADO.NETでデータベースにUDLファイルを利用して接続する方法について教えてください
UDLファイルには、接続先のサーバー名とデータベース名しか
持たせていません。
VB6.0 + ADOのとき vb.netの時も同じ
Const connstr = "File Name=C:\xxx\xxxx.udl"
Dim conn As New ADODB.Connection
conn.Open connstr, "myuserid", "mypassword"
これを ADO.NETでやりたいのですが
ADO.NETでは、ユーザーIDとパスワードを別に指定できないのですが何か方法は有りますでしょうか。
よろしくお願いします
UDLファイルにユーザーIDとパスワードを持たせると誰でも簡単に
アクセス出来てしまう、(最悪DELETE UPDATE)ので仕様変更できませんでした。
無理そうなので、UDLファイルから切り出すことにしました。
UDLファイルはメモ帳でも簡単に開けるのにバイナリファイルなのは
何なんでしょうか?
サンプルをVB6で作成したら結構苦労しました。
以下は、VB.netで作成したものです。
'Data Source=Server1;Initial Catalog=TESTSQL;User Id=myusrid;Password=mypassword; を作る
Function GetConectionString(ByVal vFileName As String, ByVal vUsrId As String, ByVal vPassword As String)
Dim buf As String
Dim connstr As String
Dim sPos As Short
Dim ePos As Short
Dim fNum As Short
fNum = FreeFile()
FileOpen(fNum, vFileName, OpenMode.Binary)
buf = InputString(fNum, LOF(1))
FileClose(fNum)
'最後の改行コードを取り除く
If Strings.Right(buf, 2) = vbCrLf Then
buf = Mid(buf, 1, Len(buf) - 2)
End If
'Data Source を切り出す
sPos = InStr(1, UCase(buf), UCase("Data Source"))
ePos = InStr(sPos, buf, ";")
If ePos = 0 Then
connstr = Mid(buf, sPos) & ";"
Else
connstr = Mid(buf, sPos, ePos - sPos) & ";"
End If
'Initial Catalog を切り出す
sPos = InStr(1, UCase(buf), UCase("Initial Catalog"))
ePos = InStr(sPos, buf, ";")
If ePos = 0 Then
connstr &= Mid(buf, sPos) & ";"
Else
connstr &= Mid(buf, sPos, ePos - sPos) & ";"
End If
'後処理
connstr &= "User Id=" & vUsrId & ";Password=" & vPassword & "; "
Return connstr
End Function
> Const connstr = "File Name=C:\xxx\xxxx.udl"
> Dim conn As New ADODB.Connection
> conn.Open connstr, "myuserid", "mypassword"
ADOなら、
conn.Open "File Name=C:\test.udl;User ID=aaa;Password=bbb;"
の構文も使えますよ。
# ADO.NET(OleDbConnection)では駄目かも知れませんけど。
> UDLファイルはメモ帳でも簡単に開けるのにバイナリファイルなのは
> 何なんでしょうか?
テキストファイルです。ただし、Shift_JISではなく、Unicodeですけど。
.NETから読み取るなら、こんな感じでしょうか。
Dim T As New System.IO.StreamReader(S, System.Text.Encoding.Unicode)
T.ReadLine()
T.ReadLine() '先頭2行は読み飛ばし
Dim S As String = T.ReadLine() '実際の接続文字列
> サンプルをVB6で作成したら結構苦労しました。
VB6から読み書きするなら、
案1) ADODB.Streamオブジェクトを使って、テキストストリームとして処理
案2) バイナリファイルとして読み取って、そのままCStrで文字列化
などとすれば OK でしょう。先頭2バイトのBOM(FF FE)に注意。
編集画面が必要な場合は、CreateObject("DataLinks")を使えばOK。
> UDLファイルにユーザーIDとパスワードを持たせると誰でも簡単に
> アクセス出来てしまう
セキュリティを気にするのであれば、プログラム中への埋め込みも危険です。
.NET Reflector等を使えば、exeからソースコードを得る事ができますので。
……もっとも、それでもUDLに埋め込むよりは遥かにマシですけれどね。
> 以下は、VB.netで作成したものです。
この手法の場合、『;』や『Data Source』といった文字列が、
含まれていた場合の対処も、考慮する必要があるかも知れません。
たとえば、「〜; Extended Properies="Text;Database=C:\Data Source\"; 〜」といった接続文字列の場合とか。
魔界の仮面弁士様 有難うございます。
>ADOなら、
>conn.Open "File Name=C:\test.udl;User ID=aaa;Password=bbb;"
>の構文も使えますよ。
># ADO.NET(OleDbConnection)では駄目かも知れませんけど。
VB6.0で開発してた時は、
conn.Open "File Name=C:\test.udl", "usrid", "password"
と言う具合にやっていたのですが、VB.NET + ADO.NET で使えなくなり
ました。
>ただし、Shift_JISではなく、Unicodeですけど。
なるほど! 謎が解けました。
>VB6から読み書きするなら、
いえ、まだVB.NETは初心者なもので、最初にVB6.0(VBとよりEXCEL VBA)で
簡単に作って、VB6アップグレードツールで変換かけて使ってます。
その為、かえって苦労しました。
>この手法の場合、『;』や『Data Source』といった文字列が、
>含まれていた場合の対処も、考慮する必要があるかも知れません。
>たとえば、「〜; Extended Properies="Text;Database=C:\Data Source\"; >〜」といった接続文字列の場合とか。
そうですねぇ
気が付きませんでした。
ここら辺りは、運用でカバーします。
Function GetConectionString -->
Function GetConnectionString
有難うございました。
今後ともよろしくお願いいたします。
ツイート | ![]() |