FIX: 您可能會收到錯誤訊息,當您載入 SQL Server 2000 驅動程式 JDBC 和 SQL Server 2005 驅動程式的 JDBC 同一個應用程式中,您嘗試連線到 SQL Server 2005 資料庫再執行查詢

文章翻譯 文章翻譯
文章編號: 915834 - 檢視此文章適用的產品。
Bug #: 2059 (PSSWebData)
全部展開 | 全部摺疊

在此頁中

徵狀

考慮下列案例。您載入 Microsoft SQL Server 2000 驅動程式的 JDBC 應用程式中。然後,載入驅動 Microsoft SQL Server 2005 JDBC 程式相同的應用程式中。在這種情況下當您嘗試藉由使用 SQL Server 2005 JDBC 驅動程式 URL,連線到 SQL Server 2005 資料庫已建立連線藉由使用 Microsoft SQL Server 2000 驅動程式的 JDBC。如果您隨後執行查詢,您會收到下列錯誤訊息:
[Microsoft][SQLServer 2000 對於 JDBC 的驅動程式][SQLServer]內送的表格式資料流 (TDS) 遠端程序呼叫 (RPC) 通訊協定資料流不正確。參數 1 (""): 是未知的資料型別 0x38。
如果您在建立連接到 SQL Server 2000 資料庫您可能不會收到任何的錯誤訊息,而且可能人錯誤的驅動程式正在使用的事實。在 Microsoft SQL Server 2005 JDBC 驅動程式載入應用程式中之前載入 JDBC [SQL Server 2000 驅動程式時,就會發生這個問題。

發生的原因

在 SQL Server 2000 JDBC 驅動程式中發生故障的名稱解析,就會發生這個問題。SQL Server 2000 JDBC 驅動程式接受從 SQL Server 2005 JDBC 驅動程式的連線 URL。驅動 [SQL Server 2005 JDBC 程式連接字串 URL 開頭為下列字串:
jdbc:sqlserver: / / ConnectionString
SQL Server 2000 驅動程式,如 JDBC 應該只接受以下列字串開頭的連接字串 URL:
jdbc:microsoft:sqlserver: / / ConnectionString
不過,JDBC [SQL Server 2000 驅動程式也接受連線具有下列格式:
jdbc:sqlserver: / / ConnectionString
JDBC [SQL Server 2000 驅動程式不設計來連接到 SQL Server 2005 資料庫,就會發生例外狀況。

解決方案

支援的 Hotfix 現在可以從 Microsoft,但它只用來修正本文所述的問題。僅適用於發生此特定問題的系統。此 Hotfix 可能會接受其他測試。因此,如果您不會嚴重影響這個問題,我們建議您等候 JDBC Service Pack 包含此 Hotfix 的下一個 SQL Server 2000 驅動程式。

如果要立即解決這個問題,洽詢 Microsoft 技術支援部以取得該 Hotfix。如需 Microsoft 產品支援服務電話號碼及支援成本的相關資訊的完整清單,請造訪下列 Microsoft 網站]:
http://support.microsoft.com/contactus/?ws=support
附註 在特殊情況下通常會因支援電話所產生的費用可能就不收取如果 Microsoft 支援人員認為某特定更新程式可以解決您的問題。平常的支援成本將會套用到其他支援問題是所做不限定特定有問題的更新程式。

檔案資訊

此 Hotfix 的英文版在檔案屬性 (或更新版本的檔案屬性) 如下列表格中所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用在 [日期及時間中項目控制台中的 [時區] 索引標籤]。
摺疊此表格展開此表格
檔案名稱檔案大小日期時間
Msbase.jar289,71303-Feb-2006 年23: 02
Mssqlserver.jar67,48303-Feb-2006 年23: 02
Msutil.jar56,53703-Feb-2006 年23: 02

其他可行方案

如果要解決這個問題,請依照下列步驟執行:
  1. 對於 JDBC 載入 SQL Server 2000 驅動程式之前,請為 JDBC 載入 SQL Server 2005 驅動程式。如果要執行這項操作,使用 DriverManager 類別像
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); // 2005 version
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); // 2000 version
    
    在下列程式碼範例。
  2. 您可以使用 JDBC 連接 URL 一個 SQL Server 2005 驅動程式來建立連線。如果要執行這項操作,使用類似下列的程式碼範例的程式碼
    Connection con = DriverManager.getConnection("jdbc:sqlserver://<ServerName>;user=<UserName>;password=<Password>");
如需有關如何連接資料來源,以及如何使用連線 URL 的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站:
建置連線 URL
http://msdn2.microsoft.com/en-us/library/ms378428.aspx

設定連線內容
http://msdn2.microsoft.com/en-us/library/ms378988.aspx

狀況說明

Microsoft 已確認這是在 < 適用於 > 一節中所列出的 Microsoft 產品中有錯誤。

其他相關資訊

如果要重現問題的步驟

編譯並再執行下列 Java 程式碼範例。
import java.sql.*;
public class TestDriver {
  public static void main(String[] args) throws Exception
       	{

       	Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
       	Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

	Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://<Server>;DatabaseName=<DatabaseName>", 
"<UserId>","<Passwd>");
	DatabaseMetaData dbmd = conn.getMetaData();
	System.out.println("Driver = " + dbmd.getDriverName() + "_" + dbmd.getDriverVersion());

	conn = DriverManager.getConnection("jdbc:sqlserver://<Server>;DatabaseName=<DatabaseName>", 
"<UserId>","<Passwd>");
	dbmd = conn.getMetaData();
	System.out.println("Driver = " + dbmd.getDriverName() + "_" + dbmd.getDriverVersion());
	displayVersions(conn);
	}

	public static void displayVersions(Connection conn)
       	{
               Statement s3 = null;
               ResultSet rr = null;

               try
               {
                       s3 = conn.createStatement();
                       System.out.println("\nStart trying to retreive data\n");
                       rr = s3.executeQuery("select @@version");

                       boolean OK = rr.next();
                       if (OK)
                               System.out.println("The current version of Microsoft SQL Server is: " + rr.getString(1));
                       else
                               System.out.println("result set NO ROWS!");
               }
               catch (Exception ex)
               {
                       System.out.println("Caught error in displayAnyData:\n\t" + ex.getMessage());
               }

               try
               {
                       if (rr != null) rr.close();
                       if (s3 != null) s3.close();
                       System.out.println("End trying to retreive data\n");
               }
               catch (Exception ee)
               {
                       System.out.println("Error closing rr or s3 in displayData: " + ee.getMessage());
               }

	}

	}
附註 若要使用這個的程式碼範例會取代下列的位置:
  • 取代 <Server> 名稱的執行個體的 SQL Server。
  • 取代 <DatabaseName> 資料庫的名稱。
  • 取代 <UserId> 與您的使用者 ID。
  • 取代 <PassWd> 與您的密碼。

?考

如需有關 JDBC,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
313100如何開始與 Microsoft JDBC
在本文所討論的協力廠商產品是由 Microsoft 以外的公司所製造的。Microsoft 可讓不以暗示或其他方式,效能或可靠性這些產品的保證。

屬性

文章編號: 915834 - 上次校閱: 2006年7月19日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft SQL Server 2000 Driver for JDBC
關鍵字:?
kbmt kbhotfixserver kbqfe kbfix KB915834 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:915834
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com