log2

Q1、今天在做登录验证的测试时,居然总是发生如下异常:

javax.servlet.ServletException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]对象名 'userInfo' 无效。

(userInfo是表名)

遇到这个问题,我首先去检查数据库中是否有这个表,userInfo这个表确实存在且没有拼写错误,但是java为什么找不到呢?我又重新写了一个类:

package MyTest; import java.sql.*; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); } catch (ClassNotFoundException e) { System.out.println("加载失败!"); e.printStackTrace(); } String url = "jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=BooksManagement"; String user = "admin", psd = "123456"; // Statement stmt; try { Connection cn = DriverManager.getConnection(url, "sa", ""); System.out.println("已经成功连接到数据库!"); PreparedStatement pst = cn.prepareStatement("use BooksManagement select count(*) from userInfo where Number=? and password=?"); pst.setString(1, user); pst.setString(2, psd); ResultSet res = pst.executeQuery(); res.next(); System.out.println(res.getInt(1)); res.close(); pst.close(); cn.close(); } catch(SQLException se) { se.printStackTrace(); } } }

运行后,让我意想不到的是输出结果是1!即成功连接数据库并且查询到数据表中的用户名、密码。为什么这个连接和查询作为一个整体程序时就能成功,而我将他们分离时就出现异常呢?

久思无果,于是上网搜索。网络就是好,这一搜就找到了与我遇到同样问题的前辈们的解决办法,就是修改登录用户的默认数据库为要使用的数据库名称。乖乖照着做了,果然成功了!大喜!但是马上又意识到,如果我没有修改登录用户的默认数据库的权限呢,再者说了,就算我拥有至高无上的权限(比如sa),就这样更改了登录用户的默认数据库,也是对用户的不尊重吧,如果这个登录用户名还有其他的用途呢。所以我决定放弃这种方法,转而采用在给出sql语句时直接指定数据库名称。具体做法如下:

url = "jdbc:microsoft:sqlserver://localhost:1433"; connect.prepareStatement("use "+DATABASEName+sql)

那么上一篇中的专门负责加载驱动和建立连接的类需要改了:

package cn.pdsu.rjgc4.six.function; import java.sql.*; public class LinkDatabase { private static String drive = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; private static String sqlUser = "sa"; private static String sqlPsd = ""; private static String url = "jdbc:microsoft:sqlserver://localhost:1433"; private static String DATABASEName = "BooksManagement ";//这里是一处更改 private static Connection connect; private PreparedStatement prestat; private ResultSet resSet; public LinkDatabase() { /* * Constructs a LinkDatabase with tolerant parameters. * these tolerant parameters are: * the Drive of SQLServer is "com.microsoft.jdbc.sqlserver.SQLServerDriver", * the login name of SQLServer administrator is "sa", * the password of SQLServer administrator is "" and * the url of SQLServer is "jdbc:microsoft:sqlserver://localhost:1433; * DatebaseName=BooksManagement" */ /* * 使用默认参数构造 LinkDatabase 。 * 默认参数有:连接数据库的驱动,不设置时默认为"com.microsoft.jdbc.sqlserver.SQLServerDriver"、 * 数据库登录名 "sa"、登录密码 ""、连接的url "jdbc:microsoft:sqlserver://localhost:1433; * DatebaseName=BooksManagement" */ connectToDatabase(); } public LinkDatabase(String sqlDrive, String sqlUserName, String sqlPassword, String url, String databaseName) {//参数增加一个 /* * Constructs a LinkDatabase with tolerant parameters. */ /* * 使用自定义参数构造 LinkDatabase 。 */ setSQLDrive(sqlDrive); setSQLUser(sqlUserName); setSQLPassword(sqlPassword); setSQLUrl(url); connectToDatabase(); } private void connectToDatabase(){ try { Class.forName(drive); } catch (ClassNotFoundException ne) { System.out.println("sqlserver驱动加载失败!"); ne.printStackTrace(); } try { connect = DriverManager.getConnection(url, sqlUser, sqlPsd); System.out.println("Linking to database successed!"); } catch (SQLException se) { System.out.println("数据库访问失败!"); se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public static void setSQLDrive(String sqlDrive) { /* * set the Drive of SQLServer, and it is * "com.microsoft.jdbc.sqlserver.SQLServerDriver" by default */ /* * 设置连接数据库的驱动,不设置时默认为"com.microsoft.jdbc.sqlserver.SQLServerDriver" */ drive = sqlDrive; } public static void setSQLUser(String sqlUserName) { /* * set the login name of SQLServer administrator, * and it is "sa" by default */ /* * 设置连接数据库的登录名,不设置时默认为"sa" */ sqlUser = sqlUserName; } public static void setSQLPassword(String sqlPassword) { /* * set the password of SQLServer administrator, * and it is blank by default */ /* * 设置连接数据库的密码,不设置时默认为空 */ sqlPsd = sqlPassword; } public static void setSQLUrl(String linkUrl) { /* * set the url of SQLServer, * and it is "jdbc:microsoft:sqlserver://localhost:1433; * DatebaseName=BooksManagement" by default */ /* * 设置连接数据库的url,不设置时默认为"jdbc:microsoft:sqlserver:// * localhost:1433;DatebaseName=BooksManagement" */ url = linkUrl; } public static void setDATABASEName(String DatebaseName) { /* * set the DatebaseName of SQLServer, * and it is "BooksManagement " by default */ /* * 设置连接数据库的DatebaseName,不设置时默认为"BooksManagement " */ DATABASEName = DatebaseName+" "; } public static void setConnect(Connection connect) { /* * Rebuild the link to database */ /* * 重建到数据库的连接 */ LinkDatabase.connect = connect; } public Connection getConnect() { /* * Return a link to database */ /* * 返回一个到数据库的连接 */ return connect; } public void setPrestatement(PreparedStatement prestat) { /* * Rebuild a SQL language sentence */ /* * 重设SQL语句 */ this.prestat = prestat; } public PreparedStatement getPrestatement(String sql) { /* * Return a object of PreparedStatement */ /* * 返回一个 PreparedStatement 对象 */ try { setPrestatement(connect.prepareStatement("use "+DATABASEName+sql)); //这里也有变化! System.out.println("SQL PreparedStatement is built!"); } catch (SQLException e) { System.out.println("SQL error!"); e.printStackTrace(); } return prestat; } public void setResultSet(ResultSet resSet) { /* * Rebuild a object of ResultSet */ /* * 重设 ResultSet 对象 */ this.resSet = resSet; } public ResultSet getResultSet() { /* * Return a object of ResultSet */ /* * 返回一个 ResultSet 对象 */ try { setResultSet(prestat.executeQuery()); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return resSet; } }

Q2、然而,就在我准备完整的异常也粘贴上时,第一种情况却出现不了异常!一切又正常了。不管我把默认数据库更改为什么名称,所有代码都是正确的。

真是百思不得其解!明明就是会出现异常的,就是让电脑睡眠了两小时而已,一切又正常了!暂且放下疑问,还是采用原来的连接方式吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值