CCADOConnection con;
CCADORecordset rs;
ComVariant v;
;
#CCADO
con=new CCADOConnection();
con.connectionString(SqlHelper::connectionString());
con.open();
rs=new CCADORecordset();
rs.cursorLocation(#adUseClient);
rs.open('select * from mytable',con,#adOpenStatic,#adLockReadOnly);
v=new ComVariant(ComVariantInout::In,ComVariantType::VT_UNKNOWN);
rs.recordSet().activeconnection( v);
con.close();
posted @
2009-08-24 08:50 jjx 阅读(37) |
评论 (0) |
编辑
django 1.1 的每个新特色都非常的喜欢
管理界面
1. action ,list_editable, 这两个特性都是针对changelist,action允许选择一些记录进行操作,而list_editable,则允许你直接在changelist中进行更新
orm
1. 聚集函数和F表达式(允许你引用其它字段)
2. proxy ,允许你扩展已经存在的model
3.managed=False 让你的model脱离django的控制
4. defer 带来了非关系字段延迟装载的功能
posted @
2009-07-30 11:38 jjx 阅读(101) |
评论 (0) |
编辑
migration 这种东西一般适用在数据库已经初步定型,可能已经在试运行,有业务数据的情况下。否则,用migration可能会花费额外的时间
早先通常的流程是修改model定义,然后manage.py syncdb . 在使用south后,流程就改为
①修改model
②创建migration 脚本,自动或手动创建
③用manage.py migration app [xx]执行migration
1. 下载并安装
hg clone http://bitbucket.org/andrewgodwin/south/
hg update -C stableish
cd south
setup.py install
2. 转换存在项目
①将south加入到 settings.py INSTALLED_APPS中
②manage.py syncdb
安装south表 south_migrationhistory
③manage.py convert_to_south myapp
3。新项目
①将south加入到 settings.py INSTALLED_APPS中
②manage.py migrate south
③./manage.py startmigration southdemo --initial
3. 表更新
自动
manage.py startmigration southdemo extend_model --auto
手动
使用--add-field --model 参数
4. 手动写migration 脚本
posted @
2009-07-24 16:51 jjx 阅读(22) |
评论 (0) |
编辑
zope 3有三种类型的组件,内容组件,适配器和实用组件
1. 内容组件
内容组件相当于我们平时常说的entity,model,比方说User,Category,Department,Order 都可以理解为内容组件, 例子
class IUser(Interface):
name=Attribute('name')
password=Attribute('password')
email=Attribute('email')
class User(object):
implements(IUser)
def __init__(self,name,password,email):
self.name=name
self.password=password
self.email=email
2. 适配器
适配器可以理解为我们平常所用的服务类,服务类一般操作一个特定的内容组件,比方说UserService会操作User对象,而OrderService会操作Order对象。服务类通常会有一个或多个方法。这个被操作的对象在zope3中就是适配者。在zope3中,适配器可以有以下规律
①实现一接口
②适配一个或多个对象,多个对象叫多适配器
③对象通过构造函数传入
这同一般我们所用的java/c# 静态服务类不同,在那种情况中,所操作对象通常是作为第一个参数传入的,如
interface IUserService{
void login(User user);
}
在zope3中,适配器有服务单一对象的,服务多对象的叫多适配器,另外还有订阅适配器和handler适配器
让我们来看看zope 3的适配器写法,可能像这样

Code
from zope.interface import Interface,Attribute,implements
from zope.component import getGlobalSiteManager,getAdapter,adapts
class IUserService(Interface):
def login():
'''login'''
class UserService(object):
implements(IUserService)
adapts(IUser)
def __init__(self,user):
self.user=user
def login(self):
print 'pass
同spring的解决依赖的观点还不太一样,spring 解决的是服务依赖。而zope3的适配器,大概只关心业务方法实现的替换
zope3 的组件管理你可以用spring的对象工厂去理解,虽然实际的实现很不一样,一般可以归纳为二点
①如何注册组件
②如何获取组件
同spring一样,组件可以通过xml注册 (zcml) 或是代码
通过xml注册
<configure xmlns="http://namespaces.zope.org/zope">
<adapter
factory=""
provides=""
for=""
/>
factory是指适配器,如UserServcie,providers是指适配器接口 IUserService,for是指适配者,这里是IUser,一般秩序提供factory信息即可
在通过代码注册时,zope3 需要你了解你适配器的类型而调用不同的方法。过程是类似的
from zope.component import getGlobalSiteManager
gsm = getGlobalSiteManager()
注册适配器
gsm.registerAdapter(我的适配器类)
注册subscribte
gsm.registerSubscriptionAdapter(subscribe)
注册handler
gsm.registerHandler(handler)
获取一般适配器
getAdapter(内容组件实例,适配器接口)
获取多适配器
getMultiAdapter((内容组件实例tuple),适配器接口)
获取订阅
subscribers([内容组件实例], 接口)
执行handler
handler(内容组件)

Code
gsm=getGlobalSiteManager()
gsm.registerAdapter(UserService)
user=User('jjx','123456','jjx@email.com')
user_service=gsm.getAdapter(user,IUserService)
user_service.login()
posted @
2009-07-22 10:04 jjx 阅读(41) |
评论 (0) |
编辑
花了半年多时间在django,当然,主要是做项目,研究的不算深入。但总体感觉而言,django现在的状态很适合刚进入python web开发的新手(全堆栈,良好的社区,良好的文档,较多的使用者,没有使用较多的魔术),它得确也能满足大部分需求,只是后期,大家可能要引入一些第三方的东西。
当你为了明确和优化查询,引入sqlalchemy后,你的项目就同时并存了django orm和sqlalchemy,当你因为django的模板过于束手束脚导致你不你quick and dirty的完成一些工作时,你可能要引入mako. 现在你的项目同时存在了django的 template或是mako,或者可能是jinja2. django的管理界面得确不错,得确也能满足80%的需求,在原型开发时很有效。但是在一个产品环境,为了提高易用性,它就不能满足了。而且,这个管理界面的存在会加强开发人员的惰性,会产生以管理界面对付产品环境的想法。
还有django forms,用下来感觉是不错的,但是,如果你的前端过分依赖js和ajax,django form用起来就有点麻烦。它看起来主要是为了老式的web请求、响应模式设计的 。
大家可以看出,这样批评一下,django看起来就没有什么优点了。所以,打算寻找另外一个web framework了。 选择的两个重要条件是①能使用sqlalchemy ②不限定模板
目前比较有名的还有web2py,pylons,turbogears,bfg等。 web2py因为不能使用sqlalchemy而被排除(个人感觉web2py也比较另类),turbogears 2.0据说要建立在pyons上了,两者的社区都不算活跃。 不过和bfg 一样,都有使用paster,rounting这类功能(bfg支持的更广些,像rounting只是其选择之一,另外还有zope式的对象导航). 这三个比较一下,感觉选bfg 后期可以使用zope社区的资源,会比较有利一点,呵呵。当然,很多人对zope(无论是2和3)有莫名的恐惧,甚至是他完全没有接触的情况下都是如此,从某种程度上说名,要使用zope的资源,也不是那么容易的哦,好在这些年都有陆续的关注zope的东西,应该会克服过去的。
posted @
2009-07-08 11:30 jjx 阅读(317) |
评论 (6) |
编辑
摘要: 最新从launcepad中检出的web client已经移除了对turbogears 的依赖,模板使用了mako ,从使用速度来看,有明显的提升从launcepad检出代码后,直接使用setup.py install安装,会自动安装cherrypy 3.12,mako 0.24,simplejson, babel,beaker等依赖包。并在python25\scripts中复制openerp-we...
阅读全文
posted @
2009-05-20 04:14 jjx 阅读(666) |
评论 (0) |
编辑
摘要: colspan 说明该控件占用父容器多少列,openerp form为顶级容器,约定为4列 col 用于容器控件,如group,它表示这个容器内部分几列 在openerp中,控件一般都有label,每个控件(设计元素)默认是占据两列 在一个group中,控件是从左到右,用完所有总列数后,然后从上往下排列的 ①<group col="6" colspan="4"> ②<group ...
阅读全文
posted @
2009-05-19 10:16 jjx 阅读(529) |
评论 (0) |
编辑
摘要: 在qiuhao上我回复一个网友的贴子,但觉的这里可以展开的点很多。在窗体编程中,element 通常就是指formrun 也就是我们看到的form你在为哪个对象编写代码,this就是哪个对象,比方说你为formbuttoncontrol写click方法,则this就是指这个按钮,如果我们覆盖form的init方法,那么里面的this其实就是element深入探讨这个就是ax的代码生成机制有关了,a...
阅读全文
posted @
2009-05-02 11:04 jjx 阅读(52) |
评论 (0) |
编辑
摘要: 两个ContextBoundObject 同步为REQUIRED的 A和B,当客户端依次调用时,会生成几个上下文,答案是2个A a=new A();a.Test(); //生成一个上下文B b=new B();b.Test(); //生成一个新的上下温要使的B在A的上下文中,势必需要在A中创建B的实例才行扩展方法,用起来像是类的实例,但方法作用范围并不在类的内部,而是在调用扩展方法中,所以,在这个...
阅读全文
posted @
2009-04-17 09:50 jjx 阅读(28) |
评论 (0) |
编辑
摘要: 1. 建立一个元数据仓库表,列,关系,窗体,报表,菜单项,菜单,文档均存放在元数据仓库,能方便的存取建议使用db4o ,元数据在使用时下载 2. 良好的数据访问机制建立元数据和数据访问框架之间的连接,建议从 建立使用 linq to sql 或是ado.net entity framework 起步3. 方便的,一致的ui 生成机制①选择一套自己喜欢控件包,如devexpress或ja...
阅读全文
posted @
2009-02-06 11:15 jjx 阅读(76) |
评论 (1) |
编辑