- PR -

VB.NETでODBC設定できない

投稿者投稿内容
あるあるふぁ
会議室デビュー日: 2004/04/20
投稿数: 9
投稿日時: 2006-01-05 13:57
VB.NETでWindowsアプリを作成しています。
ODBC接続でSQLサーバを使用するものなのですが
アプリケーション配布の時に
個々のクライアントにODBC設定するのが面倒ですので
プログラム上で行おうと思い「SQLConfigDataSource」を
利用しようと作成し始めました。

記述は以下のようにしています。


' API 宣言
Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" _
(ByVal hwndParent As Integer, ByVal fRequest As Integer,_
ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long

と宣言して実行部を

' データソースの追加
Dim intRet As Integer
Dim strDriver As String
Dim strDSN As String

' ODBCドライバを指定する
strDriver = "SQL Server"

' データソースとして登録する属性を NullChar で区切り指定する
strDSN = "DSN=Mydb" & vbNullChar
strDSN = strDSN & "Description=Mydb" & vbNullChar
strDSN = strDSN & "Server=LocalServer" & vbNullChar
strDSN = strDSN & "Database=Mydb" & vbNullChar
strDSN = strDSN & "Trusted_Connection=No" & vbNullChar
strDSN = strDSN & "LastUser=admin" & vbNullChar
strDSN = strDSN & "Password=admin" & vbNullChar

' データソースの登録
intRet = SQLConfigDataSource(0, ODBC_ADD_DSN, strDriver, strDSN)

' 登録の成功・失敗の判断
If intRet Then
MsgBox("データソースが登録されました。")
Else
MsgBox("登録されませんでした。")
End If

と記述しているのですが、実行すると
「strDSN」には 「"DSN=Mydb」だけしか入らず
「Description=Mydb」以降が結合されてきません。
Microsoftのページその他を色々調べたのですが
解決方法が見つけられなかったので
ここに質問させていただきました。
どなたかご教授お願いいたします。
なおこ(・∀・)
大ベテラン
会議室デビュー日: 2004/04/08
投稿数: 174
お住まい・勤務地: 東京都
投稿日時: 2006-01-05 14:34
お世話になります。

PINVOKEを参考にしてやってみたのですが、
以下のコードで問題なく登録できました。
コード:
Imports System.Runtime.InteropServices

  Private Const ODBC_ADD_DSN As Integer = 1  ' データ ソースの追加

  <DllImport("ODBCCP32.DLL", CharSet:=CharSet.Auto, SetLastError:=True)> _
  Private Shared Function SQLConfigDataSource(ByVal hwndParent As Integer, _
                        ByVal fRequest As Integer, _
                        ByVal lpszDriver As String, _
                        ByVal lpszAttributes As String) As Integer
  End Function

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim Driver As String
    Dim attribs As String

    Driver = "SQL Server"
    attribs = "SERVER=" + "(local)" + Convert.ToChar(0)
    attribs += "DESCRIPTION=Test DSN" + Convert.ToChar(0)
    attribs += "DSN=" + "test" + Convert.ToChar(0)
    attribs +="DATABASE=" + "northWind" + Convert.ToChar(0)
    attribs += "Trusted_Connection=yes" + Convert.ToChar(0)
    
    Dim intRet As Integer = SQLConfigDataSource(0, ODBC_ADD_DSN, Driver, attribs)
    If intRet = 1 Then
      MessageBox.Show("登録しました")
    End If
  End Sub

あるあるふぁ
会議室デビュー日: 2004/04/20
投稿数: 9
投稿日時: 2006-01-05 16:52
なおこ(・∀・)さんありがとうございました。
教えていただいたものを参考にやってみましたら
追加出来ました。感謝感謝です!

しかし、
strDSN = strDSN & "LastUser=admin" & vbNullChar
strDSN = strDSN & "Password=admin" & vbNullChar
の部分の記述があると出来ません。
この部分は実際のプログラム使用時に接続文字列を与えてやれば
大丈夫だとは思うのですが、予め設定しておくのは
やはりVB.NETでは無理なんでしょうか。
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-01-05 17:16
こんにちは。
Yamと申します。

これはODBC云々の問題ではなく、文字列連結式の問題です。

HOGE = HOGE & "ABC" では文字列の連結はできません。
なおこ(・∀・)さんのように
HOGE += "ABC" またはHOGE &= "ABC"で連結できます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-05 17:37
引用:

Yamさんの書き込み (2006-01-05 17:16) より:

HOGE = HOGE & "ABC" では文字列の連結はできません。


できますよ。

引用:

HOGE += "ABC" またはHOGE &= "ABC"で連結できます。


CLR 的にはいずれも String.Concat ですので、速度も何もかもが同じです。

本題の方ですが、以下を見るに Valid なキーワードじゃないようですね。

  SQLConfigDataSource

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-05 17:40
引用:

じゃんぬねっとの書き込み (2006-01-05 17:37) より:

本題の方ですが、以下を見るに Valid なキーワードじゃないようですね。


でも、LastUser というキーワードはあったような記憶があるんです。(^^;)
バージョンによって違うだけなのかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Yam
大ベテラン
会議室デビュー日: 2003/09/13
投稿数: 179
お住まい・勤務地: だんじり祭りの地
投稿日時: 2006-01-05 17:51
Yamです。

引用:

じゃんぬねっとさんの書き込み (2006-01-05 17:37) より:
できますよ。



できますね。
昔、似たような式で連結できずにハマッた記憶があったのでうろ覚えで書いてしまいました。
(はて、あれは何の言語だったのだろう?)

失礼しました。
あるあるふぁ
会議室デビュー日: 2004/04/20
投稿数: 9
投稿日時: 2006-01-05 17:52
じゃんぬねっとさんありがとうございます。
Yamさんもありがとうございます。

LastUser とPasswordのキーワードは
私もあるページで発見したので
strDSN = strDSN & "LastUser=admin" & vbNullChar
strDSN = strDSN & "Password=admin" & vbNullChar
と記述してみたのですが、
この部分の設定は無理だと書いてあったページもあったので
ホントに出来ないものなのかと調べていたところなのですが
今のところやはり無理っぽいです(>_<)

スキルアップ/キャリアアップ(JOB@IT)