FIX: 您在同一应用程序中加载 JDBC 为 SQL Server 2000 驱动程序和 $ 为 JDBC SQL Server 2005 驱动程序、 您试图连接到一个 SQL Server 2005 数据库和然后运行查询时可能会收到一条错误消息

文章翻译 文章翻译
文章编号: 915834 - 查看本文应用于的产品
bug #: 2059 (PSSWebData)
展开全部 | 关闭全部

本文内容

症状

请考虑以下情形。在应用程序中,可以为 JDBC 加载 Microsoft SQL Server 2000 驱动程序。然后,您加载了 Microsoft SQL Server 2005 JDBC 驱动程序在同一个应用程序。在这种情况下当您试图连接到 SQL Server 2005 数据库,通过使用 SQL Server 2005 JDBC 驱动程序 URL,使用 JDBC Microsoft SQL Server 2000 驱动程序建立连接。如果随后运行查询您会收到以下错误消息:
[] Microsoft[SQLServer 2000 的驱动程序 JDBC][] SQLServer在传入表格格式数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 1 (""): 数据类型 0x38 是未知的。
如果建立了 SQL Server 2000 数据库的连接您可能不会收到任何的错误消息和错误的驱动程序正在使用这个事实可能 unnoticed。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
对于 JDBC SQL Server 2000 驱动程序应只接受开头以下字符串的连接字符串 url:
jdbc:microsoft:sqlserver: / / ConnectionString
但是,SQL Server 2000 驱动程序对于 JDBC 还接受具有以下格式的连接:
jdbc:sqlserver: / / ConnectionString
由于为 JDBC SQL Server 2000 驱动程序不为了连接到 SQL Server 2005 数据库,将发生异常。

解决方案

现在提供 Microsoft,受支持的修复程序,但它只用于解决本文所述的问题。仅将它应用于出现这一特定问题的系统。此修补程序可能还会接受进一步的测试。因此,如果此问题没有对您造成严重的影响,我们建议您等待包含此修补程序 JDBC 服务包的下一 SQL Server 2000 驱动程序。

要立即解决此问题,请与 Microsoft 产品支持服务以获取此修复程序。有关 Microsoft 产品支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的 Microsoft 网站:
http://support.microsoft.com/contactus/?ws=support
注意 在特殊的情况中如果 Microsoft 支持专业人员确定某个特定更新才能解决您的问题,可能会被取消通常会导致支持电话的费用。将正常收取支持费用将应用于其他支持问题和不需要进行专门更新的问题。

文件信息

此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (UTC)。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的日期和时间项中的 时区 选项卡。
收起该表格展开该表格
文件的名称文件大小日期时间
Msbase.jar289,7132006 年二月 3 日23: 02
Mssqlserver.jar67,4832006 年二月 3 日23: 02
Msutil.jar56,5372006 年二月 3 日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 开发人员网络 (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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 915834
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 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