2012/05/14 08:43:16
Tags: bulkupdate, hhh-2408, hhh-5785, Hibernate, hql Posted in :开源框架, 数据库, 编程开发
在使用hibernate进行更新时,经常会碰到以下的操作。如将name为xxx的a下的bList的code信息更新为code+'f'。在使用hibernate时,经常会写下以下的hibernate操作:
update b set b.code='f' + b.code where b.a.name='xxx'
然而,这句看似没有错误的hql语句,在hibernate进行运行时,却会产生一个奇怪的现象。在生成的hql中,会在表b后面出现一下奇怪的逗号,会报一个错误的sql解析错误的异常,并且在生成的hql中,所没有出现在链接时所使用的a。
原因在于hibernate在进行更新以及删除时候时,并不支持联接操作,包括含有隐式的联接也是不行的。在相应的hibernate jira界面,可以看到以问题的错误:https://hibernate.onjira.com/browse/HHH-2408。在官方的hibernate手册时,有一条很不起眼的描述。http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/batch.html#batch-direct。描述的描述如下:
15.4. DML-style operations
Some points to note:
No joins, either implicit or explicit, can be specified in a bulk HQL query. Sub-queries can be used in the where-clause, where the subqueries themselves may contain joins.
read more… »
在32位的windows下,包括windows7,windows xp以及windows 2003,都可以使用instsrv.exe和srvany.exe来创建自定义的windows服务。比如,我们有一个bat文件,用于将指定的程序作为服务进行启动,使用一般的工具都不可以进行此类工作,而使用由windows 2003的资源工具包windows toolkit中所带的instsrv就可以。
详细的用法这里就不再具体叙述,简单一点就是使用instsrv将相应的srvany注册成服务,然后在注册表中增加相应的Application和AppDirectory参数,用于srvany启动我们所相应的服务。如下列代码所示://将相应程序生成成服务
set s32=%windir%\system32
%s32%\instsrv.exe %service_name% %s32%\srvany.exe
//在注册表中更新相应的参数
echo Windows Registry Editor Version 5.00> %reg_file%
echo >> %reg_file%
echo [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\%service_name%\Parameters] >> %reg_file%
echo "Application"="%prog_path%\\%prog_name%" >> %reg_file%//程序地址
echo "AppDirectory"="%prog_path%" >> %reg_file%//程序目录
以上的代码在所有的32位系统之上都可以正常的运行,包括windows 2000。然而,在64位的windows下,以上的代码却失效了。会报一个以下错误:
Unable to find the file at the given path
在仔细检查了参数之后,确定这是由于系统原因所引起的。
最终的原因在于,我们所使用的instsrv和srvany是32位的,而windows现在没有相对应的64位相对应工具发布。而程序本身是没有问题的,问题在于我们将instsrv和Srvany放到windows/system32正面,而在64位系统中,这里应该存放64位的程序,所以最终的解决问题很简单。我们只需要将这两个程序再copy至32位程序应该放置的地方,比如windows/sysWow64目录,这样就可以了。原先的相应步骤以及程序根本就不需要作任何改动。instsrv会自动地找到原先应该放在system32下的程序,而这个程序现在被放置在了SysWow64目录下。
简单一点的解决方法就是,将instsrv和srvany程序在windows/sysWow64目录下再copy一份,相当于在system32和sysWow64下都有程序,这样问题即解决。更底层的原因,也许只有微软能解释了,简而言之,在64位系统下,32位程序是看不到放置在system32下面的程序的,而它应该访问的system32目录被系统映射到了sysWow64目录下了,在运行时系统会自动地将相应的sysWow64目录映射为程序所认为的system32。
参考文档:http://en.wikipedia.org/wiki/WoW64
2012/04/24 07:30:54
Tags: gcd, 算法 Posted in :数据结构
本文转自:http://www.cnblogs.com/ider/archive/2010/11/16/gcd_euclid.html,原文作者:Ider。内容有整理。
常识:如果 a≥b 并且 b≤a,那么 a=b.
前提:
1)只在正数(原谅为非负整数)范围内讨论两个数 m 和 n 的最大公约数,即 m, n ∈ N.
2)不考虑0的情况。(原文为处理0的特殊情况)
引理:
假设 k|a(表示a能够被整除), k|b,则对任意的 x,y ∈ Z, k|(xa+yb)均成立.
证明:
k|a => a=pk, k|b => b==qk (其中 p,q ∈ Z)
于是有 xa+yb=xpk+yqk=(xp+yq)k
因为 k|(xp+yq)k, 所以 k|(xa+yb)
这上面的结论表示,对于都能被k整除的a和b,对a和b进行整数倍的乘法,并相加起来的结果仍然能够被k整除,可以理解为整除的结合率。
gcd的Euclid算法证明:
命题:对任意 m, n ∈ N,证明gcd(m,n) = gcd(n, m mod n)
证明:
证明第一节
令 k=gcd(m,n),则 k|m 并且 k|n;
令 j=gcd(n, m mod n), 则j|n 并且 j|(m mod n);
对于m, 可以用n 表示为 m=pn+(m mod n);//即m可以表示为xn+y(m mod n)的方式,x为p,y为1
由引理可知 j|m(其中 x=p,y=1), 又 j|n,于是 j 是 m 和 n 的公约数(但不一定是最大的);
因为 k 是 m 和 n 的最大公约数,所以必有 k≥j;
证明第二节
通过另一种表示形式:(m mod n)=m-pn,同理可得://即m mod n可以表示为xm+yn的方式,x为1,y为-p
k|(m mod n),又k|n,于是 k 是 (m mod n) 和 n 的公约数(也不一定是最大的);
同样由 j 是 n 和 (m mod n) 的最大公约数可以得到 j≥k;
//证明第三节,使用常识
由常识,得出结论 k=j,
即gcd(m,n) = gcd(n, m mod n) ,得证。
2012/04/24 07:12:01
Tags: javascript, print, webBrowser, web开发, 打印 Posted in :程序生活, 编程开发, 计算机应用
以前做的一个系统(内部小型局域网,在线售票系统),采用的是基于浏览器的打印方式,客户提出在每次打印时都必须选择一次打印机,即在调用window.print()的时候弹出选择打印机的界面,这样很费时间,能不能去掉。
后来在网上找了一些控件,比较有名的就是scriptx这个控件,它可以实现打印控制,包括控制边距,选择页数等。的确很不错,不过很可惜,这个控件是收费的,而且破解版根本就找不到,要不就是已经失效了。估计内部使用了基于联网的方式进行认证。
而且该控件提供的免费版中,方法factory.printing.print(false)基本起不到预期的作用,本来想不弹出选择界面,结果还是不能幸免。于是放弃寻找破解版的念头,寻找其他的控件吧。
后台终于找到可以使用windows自带的webBrowrser进行操作了,因为笔者的需求很简单,不需要控制打印选项这些,就是想直接使用默认的打印机,不弹出打印选择界面而已。OK,以下是实现代码,很简单的(主要是后面有一些限制)//界面上
<object ID="PrintCommandObject" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>
//javascript
var PrintCommand = document.getElementById("PrintCommandObject");
PrintCommandObject.ExecWB(6, 2);//这里使用的是6,2参数,有的说6,6,笔者测试不通过
read more… »
2012/04/20 14:26:05
Tags: ODatabase, oo4o, oracle, vc Posted in :数据库, 编程开发
使用oo4o已经是很多年的事情了,前段时间有同事使用这个东西往oracle中添加图片等blob数据,一直找不到方法。经本人测试,找到一个很简单的方法,现记录如下。
过程就是先添加一个空的blob数据,然后再去修改这个blob数据,在oracle的oo4o的workbook中,也采用了这种方式,不过是源代码的blob填充数据没有使用copyFromFile的方法,而是采用数据读写,这相对于日常存照片文件,还是过于繁琐。本段代码直接使用copyFromFile,简单一点。代码总共不超过10行(核心代码)。
#include "stdafx.h"
#include "obound.h"
#include "ORACL.H"
#include
using namespace std;
//oracle定义了表为xa,两个字段id和vv,其中id为主键,vv为blob类型。
OStartup();//启动,必须要
ODatabase x;
//打开数据库
x.Open("tnsname", "用户名", "密码");
//取得一个结果集,这个结果集没数据,为了添加使用的
ODynaset os(x,"select id,vv from xa where 1 = 0");//专门使用1=0不查询任何数据
os.AddNewRecord();
os.SetFieldValue("id",i);
OValue ov;
ov.SetEmpty();
os.SetFieldValue("vv", ov);
os.Update();
//以上为添加一个图片为空的记录,下面准备添加图片了。
os.StartEdit();
OBlob ob;
os.GetFieldValue("vv", &ob);//读取数据
ob.CopyFromFile("d:/x.jpg");//将文件写入blob
os.Update();
ob.Close();//关闭blob,必须调用,否则在oshutdown之后,会出现内存出错
os.Close();//关闭记录集
x.Close();//关闭会话
OShutdown();
以上代码相当简单,需要注意的是,由于oracle把所有权力都交由了开发者,开发者必须在分配内存之后,关闭内存。否则就会在运行时出现"内存报错"的情况。以上的close方法,一个都不能少,少一个都会报错,需要注意。
以上代码,在vs2005下运行通过
本文转自:http://www.dbforums.com/oracle/1635283-how-connect-idle-instance-ora10gr1-windows2k.html,原文作者:dayneo.
现在有一个oracle数据库还未启动,但我要手动地启动它。因此,按理说可以通过连接到一个idle的数据库,但是却发生了以下的错误(这些错误在linux下是不会发生的)
1) sqlplus sys/password@sid as sysdba
which gives
ORA-12514: TNS: listener does not currently know of service requested in connect descriptor
2) set ORACLE_SID=SID
sqlplus sys/password as sysdba
which gives
ORA-12560: TNSrotocol adapter error
3) set ORACLE_SID=SID
sqlplus / as sysdba
which gives
ORA-12560: TNSrotocol adapter error
That one works on my Linux server by the way....
4) sqlplus "/ as sysdba"
which gives
ORA-12560: TNSrotocol adapter error
非常让人奇怪的是监听器根本不知道还没有启动的oracle服务,那么如何让监听器知道这个服务呢,或者通过什么样的方式注册这个sid信息?
read more… »