it_man的专栏

释放你的能量

buffon maikoID:it_man
71980次访问,排名1269好友4人,关注者4
..........
it_man的文章
原创 55 篇
翻译 2 篇
转载 94 篇
评论 27 篇
it_man的公告
I love it_man 欢迎大家和我互相交流. email与我联系.
最近评论
vvukqr:wow power leveling
vvukqr:wow power leveling
vvukqr:wow power leveling
student123why:HAO
student123why:
文章分类
收藏
    相册
    花心的相册
    便民服务
    IP地址、手机号码、身份证查询
    万年历查询
    中日英在线翻译 (RSS)
    在线翻译(中日英)
    天气预报
    火车时刻表查询
    航班时刻查询系统
    酒店信息查询
    管理知识网站
    世界经理人网站
    免费资源
    1G网络硬盘(还有大量免费视频)
    其他
    最好的股票BBS
    我的圈子(群)
    IT圈里圈外(圈子)
    IT圈里圈外(群组)(RSS)
    娱乐频道
    天涯社区BBS
    拂晓雅阁(超人气BBS)
    资源中心
    AJax技术论坛
    IBM中国
    中国it实验室
    中国教育学习网
    教育人生网
    沪江网( 最牛的语言学习网)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Java连接SQL Server 2000的问题二收藏

    新一篇: Oralce数据库导入导出(利用外部命令:imp/exp命令 )

    java自身提供了对各类主流数据库系统的支持,通过java.sql 库,提供了统一的接口,使得可以在java环境下不必对程序作大规模的修改,只要更改相应的驱动程序,即可实现对各类数据库的操作,从而提高软件的生存周期和降低软件的开发成本和维护费用,在这种情况下SQL Server 2000 和java 的融合问题就显得比较重要了,本文简要地阐述一下SQL Server 2000 和jdk的融合问题。

      系统需求:

       数据库:SQL Server 2000 sp3
       驱动程序:SQL Server driver for jdbc
       java版本:jdk1.2以上

      1:我们首先使用jdbc-odbc桥来实现数据库的连接,这个相对简单。
      
      首先使用SQL Server 企业管理其建立一个数据库test,并建立一个简单的表 first_table

      建立odbc数据源 ,各步骤采用默认操作即可

      编写一个简单的测试程序,该程序主要实现数据库的连接,以及一个简单的sql操作 ,代码如下:

    /***********************************************
    /*
    /*DbTest.java
    /*
    /******************************************* */

    import java.sql.*;

    public class DbTest {

     Connection con;
     Statement sta;
     ResultSet rs;

     String driver;
     String url;
     String user;
     String pwd;
     public DbTest()
     {
      driver = "sun.jdbc.odbc.JdbcOdbcDriver";
      url = "jdbc:odbc:store_manager";
      user = "share";
      pwd = "share";
      init();
     }
     public void init()
     {
      try{
       Class.forName(driver);
       System.out.println("driver is ok");
       con = DriverManager.getConnection(url,user,pwd);
       System.out.println("conection is ok");
       sta = con.createStatement();
       rs = sta.executeQuery("select * from room");
       while(rs.next())
        System.out.println(rs.getInt("roomNum"));
      }catch(Exception e)
      {
       e.printStackTrace();
      }
     }

     public static void main(String args [])//自己替换[]
     {
      new DbTest();
     }

      运行结果如下:

    driver is ok
    conection is ok
    1001
    1002
    1003
    1004
    1005
    1006
    Press any key to continue...

      顺利通过测试

      2、我们这次不通过odbc桥来操作数据库,我们采用SQL Server driver 来实现对SQL Server数据库的操作, 这将是我们这篇文章的重点,因为jdbc-odbc桥是一种常见的操作windows系统数据库的常用方法,但它存在的缺点很多,所以现在很多开发者都侧重于使用sqlserver driver来操作,在这里我们通过一步步的调试,来加深读者对这种连接的理解

      在通常的理解下,只要我们装了sqlserver driver for jdbc 我们便可进行数据库编程,事实则不然,首先我们看下边的代码:

    /***********************************************
    /*
    /*DbTest.java
    /*http://www.knowsky.com
    /******************************************* */

    import java.sql.*;

    public class DbTest {

     Connection con;
     Statement sta;
     ResultSet rs;

     String driver;
     String url;
     String user;
     String pwd;
     public DbTest()
     {
      driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";;
      url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName =StoreManager";
      user = "sa";
      pwd = "potsmart10";
      init();
     }
     public void init()
     {
      try{
       Class.forName(driver);
       System.out.println("driver is ok");
       con = DriverManager.getConnection(url,user,pwd);
       System.out.println("conection is ok");
       sta = con.createStatement();
       rs = sta.executeQuery("select * from room");
       while(rs.next())
       System.out.println(rs.getInt("roomNum"));
      }catch(Exception e)
      {
       e.printStackTrace();
      }
     }

     public static void main(String args [])//自己替换[]
     {
      new DbTest();
     }

      这段代码跟上变得代码是一样的,差别在于驱动,还有url,这是在使用sqlserver driver for jdbc 中遇到的困惑。按道理讲,上边这段代码应该没错,可首先我们来看一下,如果SQL Server服务器没有升级到sp3(在使用jdbc时,如果系统是xp或者2003务必要把sqlserver 升级到sp3,往上到处都有下的),我们看看运行结果

    driver is ok
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establis
    hing socket.
    at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source
    )
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)

    at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Sou
    rce)
    at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown S
    ource)
    at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
    at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
    at java.sql.DriverManager.getConnection(DriverManager.java:523)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at DbTest.init(DbTest.java:32)
    at DbTest.<init>(DbTest.java:25)
    at DbTest.main(DbTest.java:46)
    Press any key to continue...

      出现上边错误的主要原因是默认的数据库服务器端口 1433没有打开,无法直接连接 。

      如果升级到sp3则这个问题可以结决,我们再来看看升级之后,程序运行的结果

    driver is ok
    conection is ok
    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对
    象名 'room' 无效。
    at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source
    )
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown
    Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown
    Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSExecuteRequest.processReplyToken(
    Unknown Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Sour
    ce)
    at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType
    (Unknown Source)
    at com.microsoft.jdbc.base.BaseStatement.commonTransitionToState(Unknown
    Source)
    at com.microsoft.jdbc.base.BaseStatement.postImplExecu
    te(Unknown Source)

    at com.microsoft.jdbc.base.BaseStatement.commonExecute(Unknown Source)
    at com.microsoft.jdbc.base.BaseStatement.executeQueryInternal(Unknown So
    urce)
    at com.microsoft.jdbc.base.BaseStatement.executeQuery(Unknown Source)
    at DbTest.init(DbTest.java:35)
    at DbTest.<init>(DbTest.java:25)
    at DbTest.main(DbTest.java:46)
    Press any key to continue...

      在这儿,用户已经登陆上去,但是却不能访问里边的数据表,出现这个问题的原因在于sa用户为系统用户,它虽然能够登陆数据库,但是storeManager数据库里边却没有这个用户的访问权限,所以,我们现在为这个数据库重新建立一个用户share ,建立过程如下:在storeManager数据库中选重用户 ---〉新建用户 -- 〉名称选择(这一步中有两个关键点 1:身份验证选sql身份验证,默认数据库选StoreManager)-〉建立新教色share ,此时更改程序,将用户登陆名和密码修改一下,重新运行程序

    driver is ok
    conection is ok
    1001
    1002
    1003
    1004
    1005
    1006
    Press any key to continue...

      这次顺利通过测试

      总结:

      SQL Server和jdbc 的融合问题,关键涉及到sp3补丁(端口开放)还有用户问题,解决这两个问题之后,剩余的便是sqlserver 操作问题了,还有一点在远程操作的时候,要把sqlserver 组设置一下,在安全性里边亦将身份验证更改为SQL Server 验证即可。

     
    sql server 2000无法打开1433端口
    袁晓力个人网站 http://www.yxl.cn/
    windows203+sql server 2000无法打开1433端口
    1.如果你是win2003,那么一定要安装sql的补丁sp3a

    检查你的SQL有没有打补丁,没有的话要打上补丁,检查的方法是在查询分析器中运行:
    select @@version
    如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上.

    SQL补丁下载:
    全部补丁的位置
    http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=9032f608-160a-4537-a2b6-4cb265b80766

    注意下载后,执行的时候是解压,要在解压后的目录中执行setup.bat才是真正的安装

    2.SQL Server连接中的四个最常见错误:


    一."SQL Server 不存在或访问被拒绝"

    这个是最复杂的,错误发生的原因比较多,需要检查的方面也比较多.

    一般说来,有以下几种可能性:

    1,SQL Server名称或IP地址拼写有误
    2,服务器端网络配置有误
    3,客户端网络配置有误

    要解决这个问题,我们一般要遵循以下的步骤来一步步找出导致错误的原因.


    ============= 首先,检查网络物理连接 =============
    ping <服务器IP地址/服务器名称>

    如果 ping <服务器IP地址> 不成功,说明物理连接有问题,这时候要检查硬件设备,如网卡,HUB,路由器等.
    还有一种可能是由于客户端和服务器之间安装有防火墙软件造成的,比如 ISA Server.防火墙软件可能会屏蔽对 ping,telnet 等的响应
    因此在检查连接问题的时候,我们要先把防火墙软件暂时关闭,或者打开所有被封闭的端口.

    如果ping <服务器IP地址> 成功而,ping <服务器名称> 失败
    则说明名字解析有问题,这时候要检查 DNS 服务是否正常.
    有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,
    具体的方法是:

    1.使用记事本打开HOSTS文件(一般情况下位于C:\WINNT\system32\drivers\etc).
    添加一条IP地址与服务器名称的对应记录,如:
    172.168.10.24 myserver

    2.或在 SQL Server 的客户端网络实用工具里面进行配置,后面会有详细说明.


    ============= 其次,使用 telnet 命令检查SQL Server服务器工作状态 =============
    telnet <服务器IP地址> 1433

    如果命令执行成功,可以看到屏幕一闪之后光标在左上角不停闪动,这说明 SQL Server 服务器工作正常,并且正在监听1433端口的 TCP/IP 连接
    如果命令返回"无法打开连接"的错误信息,则说明服务器端没有启动 SQL Server 服务,
    也可能服务器端没启用 TCP/IP 协议,或者服务器端没有在 SQL Server 默认的端口1433上监听.


    =============接着,我们要到服务器上检查服务器端的网络配置,检查是否启用了命名管道.是否启用了 TCP/IP 协议等等 =============
    可以利用 SQL Server 自带的服务器网络使用工具来进行检查.

    点击:程序 -- Microsoft SQL Server -- 服务器网络使用工具

    打开该工具后,在"常规"中可以看到服务器启用了哪些协议.
    一般而言,我们启用命名管道以及 TCP/IP 协议.
    点中 TCP/IP 协议,选择"属性",我们可以来检查 SQK Server 服务默认端口的设置
    一般而言,我们使用 SQL Server 默认的1433端口.如果选中"隐藏服务器",则意味着客户端无法通过枚举服务器来看到这台服务器,起到了保护的作用,但不影响连接.


    ============= 接下来我们要到客户端检查客户端的网络配置 =============
    我们同样可以利用 SQL Server 自带的客户端网络使用工具来进行检查,
    所不同的是这次是在客户端来运行这个工具.

    点击:程序 -- Microsoft SQL Server -- 客户端网络使用工具

    打开该工具后,在"常规"项中,可以看到客户端启用了哪些协议.
    一般而言,我们同样需要启用命名管道以及 TCP/IP 协议.
    点击 TCP/IP 协议,选择"属性",可以检查客户端默认连接端口的设置,该端口必须与服务器一致.

    单击"别名"选项卡,还可以为服务器配置别名.服务器的别名是用来连接的名称,
    连接参数中的服务器是真正的服务器名称,两者可以相同或不同.别名的设置与使用HOSTS文件有相似之处.


    通过以上几个方面的检查,基本上可以排除第一种错误.


    -----------------------------------------------------------------------------

    二."无法连接到服务器,用户xxx登陆失败"

    该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式,
    因此用户无法使用SQL Server的登录帐户(如 sa )进行连接.解决方法如下所示:

    1.在服务器端使用企业管理器,并且选择"使用 Windows 身份验证"连接上 SQL Server
    在企业管理器中
    --右键你的服务器实例(就是那个有绿色图标的)
    --编辑SQL Server注册属性
    --选择"使用windows身份验证"

    2.展开"SQL Server组",鼠标右键点击SQL Server服务器的名称,选择"属性",再选择"安全性"选项卡
    3.在"身份验证"下,选择"SQL Server和 Windows ".
    4.重新启动SQL Server服务.

    在以上解决方法中,如果在第 1 步中使用"使用 Windows 身份验证"连接 SQL Server 失败,
    那就通过修改注册表来解决此问题:

    1.点击"开始"-"运行",输入regedit,回车进入注册表编辑器
    2.依次展开注册表项,浏览到以下注册表键:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer]
    3.在屏幕右方找到名称"LoginMode",双击编辑双字节值
    4.将原值从1改为2,点击"确定"
    5.关闭注册表编辑器
    6.重新启动SQL Server服务.

    此时,用户可以成功地使用sa在企业管理器中新建SQL Server注册,
    但是仍然无法使用Windows身份验证模式来连接SQL Server.
    这是因为在 SQL Server 中有两个缺省的登录帐户:
    BUILTIN\Administrators
    <机器名>\Administrator 被删除.
    要恢复这两个帐户,可以使用以下的方法:

    1.打开企业管理器,展开服务器组,然后展开服务器
    2.展开"安全性",右击"登录",然后单击"新建登录"
    3.在"名称"框中,输入 BUILTIN\Administrators
    4.在"服务器角色"选项卡中,选择"System Administrators"
    5.点击"确定"退出
    6.使用同样方法添加 <机器名>\Administrator 登录.

    说明:

    以下注册表键:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\LoginMode
    的值决定了SQL Server将采取何种身份验证模式.
    1.表示使用"Windows 身份验证"模式
    2.表示使用混合模式(Windows 身份验证和 SQL Server 身份验证).


    -----------------------------------------------------------------------------

    三.提示连接超时

    如果遇到第三个错误,一般而言表示客户端已经找到了这台服务器,并且可以进行连接,
    不过是由于连接的时间大于允许的时间而导致出错.
    这种情况一般会发生在当用户在Internet上运行企业管理器来注册另外一台同样在Internet上的服务器,
    并且是慢速连接时,有可能会导致以上的超时错误.有些情况下,由于局域网的网络问题,也会导致这样的错误.

    要解决这样的错误,可以修改客户端的连接超时设置.
    默认情况下,通过企业管理器注册另外一台SQL Server的超时设置是 4 秒,
    而查询分析器是 15 秒(这也是为什么在企业管理器里发生错误的可能性比较大的原因).

    具体步骤为:
    企业管理器中的设置:
    1.在企业管理器中,选择菜单上的"工具",再选择"选项"
    2.在弹出的"SQL Server企业管理器属性"窗口中,点击"高级"选项卡
    3.在"连接设置"下的"登录超时(秒)"右边的框中输入一个比较大的数字,如 20.

    查询分析器中的设置:
    工具 -- 选项 -- 连接 -- 将登录超时设置为一个较大的数字


    ---------------------------------------------------------------------------------

    四.大部分机都用Tcp/ip才能成功,有次我发现用Named Pipes才可以?

    回复人: leimin(黄山光明顶)

    这是因为在WINDOWS 2000以后的操作系统中,MS为解决SQL SERVER的安全问题将TCP/IP配置
    为SQLSERVER的默认连接协议,你可以在CLIENT NETWORK UTILITY中看到TCP/IP和NAME PIPE
    的顺序。

    你也可以在:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]
    "ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00
    看到默认的协议。

    2.怎么在程序中更改Named Pipes , Tcp/ip ,其sql语句怎么写?
    你可以在上面提到的注册表的位置修改:
    CLIENT端:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SuperSocketNetLib]
    "ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00

    SERVER端:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib]
    "ProtocolOrder"=hex(7):74,00,63,00,70,00,00,00,00,00

    SQL中,连接的配置就这两个方面

    SQL Server服务器--开始--程序--Microsoft SQL Server
    --服务器网络实用工具
    --启用 WinSock代理
    --代理地址:(sqlserver服务器IP)
    --代理端口--1433
    ---确定

    客户端
    开始--程序--Microsoft SQL Server--客户端网络实用工具
    --别名--添加
    --网络库选择"tcp/ip"--服务器别名输入SQL服务器名
    --连接参数--服务器名称中输入SQL服务器ip地址
    --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号

    发表于 @ 2006年10月24日 09:46:00|评论(loading...)|编辑

    旧一篇: Java连接SQL Server 2000的问题一

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © it_man