ADO.NETでUDLファイルを利用して接続

解決


若菜  2005-08-12 22:18:35  No: 91463

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とパスワードを別に指定できないのですが何か方法は有りますでしょうか。

よろしくお願いします


若菜  2005-08-18 21:02:47  No: 91464

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


魔界の仮面弁士  2005-08-18 22:18:26  No: 91465

> 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\"; 〜」といった接続文字列の場合とか。


若菜  2005-08-18 23:09:45  No: 91466

魔界の仮面弁士様  有難うございます。

>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\"; >〜」といった接続文字列の場合とか。

そうですねぇ
気が付きませんでした。
ここら辺りは、運用でカバーします。


若菜  2005-08-22 18:40:31  No: 91467

Function GetConectionString  -->
      Function GetConnectionString

有難うございました。
今後ともよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加