ResultSet读取ntext类型数据乱码

2008.10.14 / 标签: ,,, / 分类: J2EE技术

项目终于快搞定了,就差最后那么一点点了…从开工到现在一直都有数据乱码的问题存在,起初也没太在意,先把整体搞定了再慢慢研究研究这个,现在是时候了!
数据是从我现在用的这个博客的ACCESS数据库转到MSSQL中的,有些文章显示一切正常,有些则全部是乱码,经过再三查看,我确定所有原来是以FCK模式发布的文章都没有问题,唯独UBB模式的都是乱码。先来试试读取的时候直接对数据转码看看:
article.setContent(new String(rs.getBytes(6), "GBK"));
结果是:转成GBK、GB2312以及iso-8859-1之后显示还是乱码。无奈之下只好百度了。
看到某人也碰到了和我同样的遭遇,同样也是一个接一个的测试,最后用utf-16le读取出来正常了。
晕倒~我这还真是头一次听到还有个utf-16le编码格式,这下长见识了。

数据库触发器与事务

2008.10.13 / 标签: ,,,,,,, / 分类: 未分类

当对数据库中的一张表进行操作且同时又要对与之相关的其他表的数据进行修改时,要如何操作呢?一种方法是写出每一个操作的SQL语句,然后逐一执行。但是,如果碰到银行转账这种业务,我们需要先从A帐户扣钱,然后给B帐户加钱。若A帐户扣钱成功但是B帐户加钱失败,我们还得再多写一条SQL用以在失败的时候再把A的钱给加上。这样太麻烦而且需要我们在底层写很多数据库操作代码,容易出错也不安全。
此时就可以用触发器与事务来处理,当对A帐户进行修改时自动触发执行对B帐户的修改,并且当其中任何一个操作失败时,事务会自动回滚,取消之前所有的操作,这样就无形的减少了不少代码及安全隐患。
我所做的项目就有这样的一个需要:有一个文章表和一个文章类别表,文章类别表中有个字段用于存储该类别下的文章数量。所以,增加或删除一篇文章同时需要对类别表进行修改,只需要使用如下的代码创建一个触发器即可。

 
  1. CREATE TRIGGER trig_Article_Ins–开始创建触发器
  2. ON dbo.blog_Article–指明要对哪个表创建
  3. FOR INSERT–创建INSERT类型的触发器
  4. AS
  5. BEGIN TRANSACTION–开始事务
  6.     DECLARE @cateId int,@errorSum int–声明变量,分别用于存储类别ID和错误统计
  7.     SET @errorSum = 0–错误统计初值为0
  8.     SELECT @cateId=log_CateID FROM inserted–查到新插入的文章的类别ID
  9.     SET @errorSum=@errorSum+@@ERROR–累计错误
  10.     UPDATE blog_Category SET cate_Count=cate_Count+1 WHERE cate_ID=@cateId–对相应的表进行更新
  11.     SET @errorSum=@errorSum+@@ERROR–累计错误
  12.     
  13.     IF @errorSum <> 0–若执行期间出现错误则回滚,否则提交事务
  14.         BEGIN
  15.             print ‘创建失败,回滚事务!’
  16.             ROLLBACK TRANSACTION
  17.         END
  18.     ELSE
  19.         BEGIN
  20.             print ‘创建成功,提交事务!’
  21.             COMMIT TRANSACTION
  22.         END
  23. GO

 

另外,使用这个还有另外一个原因:好久没有写过这些东西了,该练练手了。所以,今天在编写这个触发器的时候还小查了一下帮助手册。

 

列名或所提供值的数目与表定义不匹配

2008.10.12 / 标签: ,,,,, / 分类: 未分类
Sofa

今天在操作数据库的时候报出了一个错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]插入错误: 列名或所提供值的数目与表定义不匹配。怎么可能呢,我昨天对同样的数据库同样的表执行同样的操作时候是没有问题的啊!开玩笑呢吧!开始抓虫…
首先从程序的代码入手,顺便用企业管理器打开对应的表,检查了一下字段数是对的呀,难道代码中的SQL我拼错了?给代码中又加了句System.out.println(sql)。

 
  1. public static boolean createCategory(CategoryBean cate)
  2.     {
  3.         String sql = "INSERT INTO blog_Category VALUES(‘"+cate.getCateName()+"’,"+cate.getCateCount()+")";
  4.         dbc = new DataSource();
  5.         System.out.println(sql);
  6.         stmt = dbc.getPreparedStatement(sql);
  7.         return dbc.executeUpdate(stmt);
  8.     }

接着再次执行了一下还是报错:
INSERT INTO blog_Category VALUES(‘测试’,0)
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]插入错误: 列名或所提供值的数目与表定义不匹配。
从输出的结果来看,我的SQL是绝对没有拼错的!OK,静下心来整理一下思路:
假如数据库中有张表,此表包含3个字段且均为必填,如果有一个字段是自增类型的标识列,那么我们写SQL的时候就不需要管它。反之,在插入一条数据的时候就必须有这一字段的数据,否则就会报出这样的错误。
OK,想明白了,也知道自己的SQL是的确没有拼错,那么问题就是出在我的标识列上了,仔细检查了一下这张表的主键列,结果发现竟然忘记设置它为标识列并令其自增了。这时突然想起来我昨天貌似把数据库重新覆盖过一次,用来覆盖的那个数据库是还没有设计完整的!我狂晕~
不过,其实遇到问题遇到错误是件好事,从中可以学到很多知识,没有问题才是最大的问题!切记:遇到问题时不要头大,或许当时有点烦躁,但一定要冷静一下,静下心来仔细想想为什么会出现这样的问题,你会发现原来问题如此简单!

SQL Server不允许进行远程连接的解决办法

2008.08.17 / 标签: , / 分类: 未分类
Sofa

刚刚安装的数据库系统,按照默认安装的话,很可能在进行远程连接时报错,通常是错误:”在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: 命名管道提供程序, error: 40 – 无法打开到 SQL Server的连接) “,现在针对此问题总结如下:
明白了SQL Server是个网络数据库就可迎刃而解了,简单的分为下面的几种情况。
◆1.数据库引擎没有启动。有两种启动方式:
(1)开始->程序->Microsoft SQL Server 2005->SQL Server 2005外围应用配置器,在打开的界面单击”服务的连接的外围应用配置器”,在打开的界面中找到Database Engine,单击”服务”,在右侧查看是否已启动,如果没有启动可单击”启动”,并确保”启动类型”为自动,不要为手动,否则下次开机时又要手动启动;
(2)可打开:开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server Configuration Manager,选中SQL Server 2005服务中SQL Server(MSSQLSERVER) ,并单击工具栏中的”启动服务”按钮把服务状态改为启动;
使用上面两种方式时,有时候在启动的时候可能会出现错误,不能启动,这时就要查看”SQL Server 2005配置管理器”中的SQL Server 2005网络配置->MSSQLSERVER协议中的VIA是否已启用,如果已启用,则把它禁止.然后再执行上述一种方式操作就可以了.
◆2.是否已经允许远程连接。这个部分可以简单的分为4个方面,分别是在 SQL Server上启用远程连接、启用SQL Server 浏览服务、在Windows 防火墙中为SQL Server 2005 创建例外和在Windows 防火墙中为“SQLBrowser”创建例外。下面是几个具体的操作方式:
在SQLServer 实例上启用远程连接
◆1.指向“开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外围应用配置器”
◆2.在“SQL Server 2005 外围应用配置器”页, 单击“服务和连接的外围应用配置器”
◆3.然后单击展开“数据库引擎”, 选中“远程连接”,在右边选中“本地连接和远程连接”,
再选择要使用的协议,( 这个地方应当启用TCP/IP 和命名管道服务!)单击“应用”,您会看到下消息:
“直到重新启动数据库引擎服务后,对连接设置所做的更改才会生效。”,单击“确定”按钮返回
◆4.展开“数据库引擎”, 选中“服务”,在右边单击“停止”,等到 MSSQLSERVER 服务停止,
然后单击“启动”,重新启动MSSQLSERVER 服务。
启用SQLServer 浏览器服务
◆1.指向“开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外围应用配置器”
◆2.在“SQL Server 2005 外围应用配置器”页, 单击“服务和连接的外围应用配置器”
◆3.然后单击展开“SQL Server Browser”, 选中“服务”,在右边“启动类型”选择“自动”,
再单击“启动”,单击“确定”按钮返回
在Windows 防火墙中为“SQL Server 2005”创建例外
◆1.在 Windows 防火墙设置界面中,选择“ 例外” 选项卡,然后单击“添加程序”
◆2.在“添加程序窗口”中单击“浏览”
◆3.然后找到“C:\ProgramFiles\Microsoft Files\Microsoft SQL Server\ MSSQL.1 \MSSQL\Binn\sqlservr.exe”,
单击“确定”返回
注意 : 路径可能会根据 SQL Server 2005 安装不同而不同。 MSSQL.1 是占位符,对应数据库实例ID。
◆4.对每个需要打开远程访问的SQL Server 2005 实例,重复步骤 1 至 3。
在Windows 防火墙中为“SQLBrowser”创建例外
◆1.在 Windows 防火墙设置界面中,选择“ 例外” 选项卡,然后单击“添加程序”
◆2.在“添加程序窗口”中单击“浏览”
◆3.然后找到“C:\ProgramFiles\Microsoft Files\Microsoft SQL Server\90\Shared\sqlbrowser.exe”,
单击“确定”返回
注意 :路径可能会根据 SQL Server 2005 安装不同而不同。在使用.NET开发进行时,会遇到使用连接字符串连接SQL Server 2005数据库使用机器名称和localhost都能连接,但是使用IP地址却不能连接的问题,解决的办法是在SQL Server实例上启用本地和远程连接,并且在选择协议的时候使用TCP/IP和命名管道服务即可解决。

无觅相关文章插件,快速提升流量