none
64位元主機上ADODB 透過 ODBC 無法連上 SQLServer RRS feed

  • 問題

  • 在64位元主機上ADODB 透過 ODBC 無法連上 SQLServer 

    程式用 vb6 開發

    透過 odbc 連線到 sql server 2005 express

    在 32位元 電腦工作站上 都正常,但 工作站是 windows 7 64位元 就出現找不到sqlserve 或沒有權限

    在64位元 win7 電腦上, 用 控制台 的 odbc 驅動程式 測試 是正常的

    用VB 2005 寫的 執行檔的 測試 SQL 連線 也正常

    但用 VB6 程式 開發的就無法連上

    同樣的程式 在32位元電腦無論是 XP 或 WIN7 都正常可以連線

     

    VB6 連線程式如下

     SqlStr = "PROVIDER=MSDASQL;DSN=" & cboDSN & ";UID=" & txtUID & ";PWD=" & txtPWD & ";"

     Set objConn = New ADODB.Connection

     objConn.CursorLocation = adUseClient

     objConn.Open SqlStr & "Database=" & "DatabaseName" & ";"

     

    試過 WIN7 防火牆 開放 PRT 1433,1434

    也是過 使用 WINDOWS 驗證

    也開啟了 WIN7 不加密

    但都不行

     

    爬文 發現說 目前 沒有 WIN7 64位元 的 JET 引擎

    是否是這原因呢

    不知是否有解決方法

    比較奇怪的是 在VB6 內也是透過 ODBC 去連線,但是 在 控制台 的 ODBC 驅動程式 測試 都是可以連線,帳號密碼也都正確,用VB6 就是不行

     

    2010年9月14日 下午 01:10

解答

  • 小弟有遇過一個很相似的情況提供大大參考一下

    在WINXP & WIN7 建ODBC 連SQL

    WINXP 用  使用者資料來源名稱 或是 系統資料來源名稱 建立都可以正常使用

    但改為WIN7時 剩下 使用者資料來源名稱 底下所建立的ODBC可以正常使用

    從砍建立好幾次測試,還是都一樣...

    所以後來放棄從 系統資料來源名稱 去建立

    • 已標示為解答 chih.ching 2010年9月27日 上午 11:35
    2010年9月16日 下午 01:34
  • 你的 odbc 都寫了,Driver=SQL Server ,你為啥又要另外自作主張改成 driver=本機測試1?

    另外 SQL Server 2005 應該用

    Driver={SQL Native Client};

    前面給你的連結裡面有。

    Driver=SQL Server 是拿來連 SQL Server 7.0 / 2000 ,我不確定是否能連 SQL Server 2005 ,用 SQL Server 2005 的 Driver 是同時可以連 32/64 位元版。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 chih.ching 2010年9月27日 上午 11:36
    2010年9月20日 下午 03:29
  • 參考前述網址提供的範例,就是把整個 DSN 全部放在程式碼內的 ODBC 連線字串。

    DSN 的選用是看程式架構,跨程式共用的連線字串,放在 DSN 有管理維護方便之效,只放在自己程式內的,會綁定 driver 版本、帳號、密碼等,一般也多用加密檔來管理,甚少直接編譯進入執行檔。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 chih.ching 2010年9月27日 上午 11:36
    2010年9月21日 下午 05:33

所有回覆

  • ADO 同時支援 Oledb / odbc 。

    PROVIDER 是 Oledb ,ODBC 請用 Driver ,並配合安裝在系統管理工具、資料來源內 SQL Server 的 Driver 名稱來建立。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月14日 下午 01:21
  • 感謝,試試看再回報

     

     

    2010年9月14日 下午 01:24
  • 小弟有遇過一個很相似的情況提供大大參考一下

    在WINXP & WIN7 建ODBC 連SQL

    WINXP 用  使用者資料來源名稱 或是 系統資料來源名稱 建立都可以正常使用

    但改為WIN7時 剩下 使用者資料來源名稱 底下所建立的ODBC可以正常使用

    從砍建立好幾次測試,還是都一樣...

    所以後來放棄從 系統資料來源名稱 去建立

    • 已標示為解答 chih.ching 2010年9月27日 上午 11:35
    2010年9月16日 下午 01:34
  • 我用 DSN 在 Win7 x86 下可以跑啊~

    我試過 SQL Server 2005 / 2008 / 2008 R2 / Compact 3.5 都可以連。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月16日 下午 01:39
  • 恩恩,小弟的執行程式是用Access編輯的

    後台資料庫是SQL Server 2005

    可能我的問題出在Access,我在去嘗試一下。

    2010年9月16日 下午 02:17
  • 控制台的 odbc 可以連

    但是在vb6 裡面 就不行

    同樣的程式 連32位元的win7 是 ok的

    我是懷疑 是否64位元作業系統 密碼加密方式不同

    我也試過在win7 這邊取消128位元編碼,但仍然不行

    目前已經有兩家客戶使用64位元作業系統遭遇此問題。

     

    PROVIDER 改成 driver 仍然一樣

      If SqlVerFlag = True Then

            If 測試連線("driver =" & DSNname & ";DSN=" & DSNname & ";UID=" & txtUID & ";PWD=" & txtPWD.Text & ";") = False Then Exit Sub

            sADOConnect = "driver=" & DSNname & ";" & sDSN & sConnect

        Else

            If 測試連線("PROVIDER=MSDASQL;DSN=" & DSNname & ";UID=" & txtUID & ";PWD=" & txtPWD.Text & ";") = False Then Exit Sub

            sADOConnect = "PROVIDER=MSDASQL;" & sDSN & sConnect

        End If

        sDAOConnect = "ODBC;" & sDSN & sConnect

    測試連線的模組

     

    Function 測試連線(ConnectStr As String) As Boolean

     

    On Error GoTo ConnErr:

    Dim Conn As ADODB.Connection

    Label1.Caption = "連線測試中,請稍候..."

    DoEvents

    Set Conn = New ADODB.Connection

    Conn.CursorLocation = adUseClient

    Conn.Open ConnectStr & " Database=" & "database" & ";"

    Label1.Caption = "連線成功!"

    測試連線 = True

    Exit Function

     

    ConnErr:

    測試連線 = False

    Label1.Caption = "連線失敗!"

    MsgBox "無法連線。" & Enterkey & "請確認伺服器有給予本機帳戶權限,以及SQL 有加入本機帳戶。" & Err.Description

    End Function


    2010年9月20日 上午 07:54
  • 你的程式碼我不是很看得懂,dsn 本來就是 odbc 的格式,為啥 dsn 會跟 oledb 混在一起?因為 odbc 跟 oledb 的連線字串所用的關鍵字幾乎都不一樣。

    driver 也不等於 DSNname ,請把組合後完整連線字串貼出來,或跟此網頁比對:

    http://www.connectionstrings.com/sql-server-2005


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月20日 上午 09:18
  •  SqlVerFlag = True 時 接 sql server 

     SqlVerFlag =false 時 直接 連 mdb 資料庫

     

    這是vb6 程式碼

     

     Set objConn = New ADODB.Connection

    objConn.CursorLocation = adUseClient

    objConn.Open SqlStr & "Database=" & "databasename" & ";"

    '連線字串如下

    driver = 本機測試;DSN=本機測試;UID=user ;PWD=12346;Database=databasename;

    上面,[本機測試]是 系統管理工具內 資料來源 odbc 設定的名稱

    在 odbc 資料來源 這邊是使用 sql認證 ,輸入帳號密碼,測試連線正常,連線到 64位元主機上的 sql server express 也是正常

    但從vb6 內去連線,就不行,但連32位元主機是正常的。

     

     

     

     

    2010年9月20日 上午 10:38
  • driver 也不等於 DSNname ,請把組合後完整連線字串貼出來,或跟此網頁比對:
    前面說過了,driver 不會等於 dsn 的內容。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月20日 下午 02:30
  • 抱歉 ,大大,小弟這方面不大熟,我不是很清楚您的意思

    您是指 ODBC 的連線設定嗎

    [ODBC]
    DRIVER=SQL Server
    UID=pwsuser
    Address=CHING\SHINLY,1433
    Network=DBMSSOCN
    WSID=CHING
    APP=Microsoft Data Access Components
    SERVER=CHING\SHINLY
    Description=asdfsfsff

    因為我在 系統管理工具內設定一個連線,例如 叫作本機測試

    在VB6 內 直接 下這樣的程式碼

    Set objConn = New ADODB.Connection
    objConn.CursorLocation = adUseClient
    objConn.Open "driver = 本機測試1;DSN=本機測試1;UID=pwsuser;PWD=12345;Database=danabasename;"

    我想確認一下,SQL SERVER 安裝在32位元 跟64位元的主機上,帳號密碼在連線上有什麼不同的地方嗎?

    64位元的電腦 在傳送帳號密碼上 是否 有不同的編碼或是驗證方式?

     

     

    2010年9月20日 下午 02:56
  • 你的 odbc 都寫了,Driver=SQL Server ,你為啥又要另外自作主張改成 driver=本機測試1?

    另外 SQL Server 2005 應該用

    Driver={SQL Native Client};

    前面給你的連結裡面有。

    Driver=SQL Server 是拿來連 SQL Server 7.0 / 2000 ,我不確定是否能連 SQL Server 2005 ,用 SQL Server 2005 的 Driver 是同時可以連 32/64 位元版。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 chih.ching 2010年9月27日 上午 11:36
    2010年9月20日 下午 03:29
  • 你如果不熟 DSN (資料來源名稱,Data Source Name) ,就乾脆不要用 DSN ,等到你標準 ODBC 能正常連線時,再依需求將部分資訊摘到 DSN 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月20日 下午 03:31
  • 感謝,我試試再回報

     

    2010年9月20日 下午 03:32
  • 我改用 filedsn 測試

    如下

     objConn.Open "FILEDSN=" & Replace(App.Path & "\", "\\", "\") & "789a.dsn"

    dsn檔案內容如下

    [ODBC]
    DRIVER=SQL Native Client
    UID=pwsuser
    Address=CHING\SHINLY,1433
    Network=DBMSSOCN
    WSID=CHING
    APP=Microsoft Data Access Components
    SERVER=CHING\SHINLY
    PWD=12345
    Database=QuickFind

     

    連我本機 是ok的

    明天再設法測試 64位元主機,再回報

    但這有一個問題,我似乎必須在dsn檔內,下密碼指定,這樣等於公開密碼

    將密碼拿掉,直接得到一個錯誤,無法連線,

    是否可以在程式碼內 下密碼指定

     如果同一個 sql server 內要使用的資料庫不只一個,是否要使用不同的dsn檔案

    或者可以在程式內指定database 的名稱

     

     

     

    2010年9月20日 下午 04:34
  • 可以,例如:

    objConn.Open "FILEDSN=" & Replace(App.Path & "\", "\\", "\") & "789a.dsn;UID=pwsuser;PWD=12345;"

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年9月21日 下午 05:31
  • 感謝

    關於 64位元主機問題,已經購買一台主機回來要安裝測試,測試後再回報結果。

     

     

    2010年9月21日 下午 05:33
  • 參考前述網址提供的範例,就是把整個 DSN 全部放在程式碼內的 ODBC 連線字串。

    DSN 的選用是看程式架構,跨程式共用的連線字串,放在 DSN 有管理維護方便之效,只放在自己程式內的,會綁定 driver 版本、帳號、密碼等,一般也多用加密檔來管理,甚少直接編譯進入執行檔。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 chih.ching 2010年9月27日 上午 11:36
    2010年9月21日 下午 05:33
  • 謝謝

    我適用一個對話方塊 由使用者 選擇既有的DSN 設定或新建新設定,然後由使用者 輸入 伺服器主機 帳號密碼等,並且 將其存在自訂的記錄檔內

    但似乎 您說的方式 更方便,所有工作站只要取到 這個DSN檔,不用一台一台設定

    日後再將程式改掉。

    再次感謝

     

    2010年9月21日 下午 05:42
  • 再次感謝

    新電腦已到,測試64位元 ok了

    謝謝

    2010年9月27日 上午 11:37