前置文章
PyPb系列-pb和python交互支持xp(一)-数据库连接https://blog.csdn.net/u010238274/article/details/126914000创建表
# 创建表
SQLCA.execsql("create table testCRUD(a varchar(10) null,b varchar(25))")
创建数据窗口
# 创建报表来实现增删查
ls_error=ref('')
syntax = SQLCA.syntaxfromsql("select a,b from testCRUD",'Style(type=Grid)',ls_error)
if string(ls_error) != '':
raise Exception("构建动态报表失败:%s" % string(ls_error))
syntax = PyPB_dwsyntaxAddUpdate(syntax,"testCRUD",["a","b"])
ds.create(syntax, ls_error)
if string(ls_error) != '':
raise Exception("创建动态报表失败:%s" % string(ls_error))
# 查询表数据
ds.settransobject(SQLCA)
ds.retrieve()
插入一行数据
row = ds.insertrow(0)
ds.setitem(row,"a","字段A")
ds.setitem(row,2,"字段B")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("插入后的数据",epj.tojson(ds,"testCRUD"))
修改数据
ds.setitem(row, "a", "修改")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("修改a后的数据",epj.tojson(ds,"testCRUD"))
删除数据
ds.deleterow(1)
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("删除后的数据",epj.tojson(ds,"testCRUD"))
删除表
# 删除表
SQLCA.execsql("drop table testCRUD")
print("disconnect",SQLCA.disconnect())
完整的testCRUD.py
# -*- coding: utf-8 -*-
from testSQLCA import *
def PyPB_Uodatastore():
return pb.Obj("uo_datastore")
def PyPB_dwsyntaxAddUpdate(src,tablename,keyname=[]):
import re
r = src
if len(keyname) >0:
for k in keyname:
p = re.compile(r'(column=\(.* name=%s )'%k)
r = p.sub(r'\1 key=yes', r)
p = re.compile(r'(column=\(type=\w+\(\d+\))')
r = p.sub(r'\1 update=yes', r)
p = re.compile(r'(retrieve="[^"]+")\)')
r = p.sub(r'\1 update="%s" updatewhere=0 updatekeyinplace=no)'% tablename, r)
return r
def ref(obj):
return pb.Obj().ref(obj)
def string(obj):
return pb.Obj().string(obj)
def PyPB_dwUpdate(ds,SQLCA, withcommit=False):
r = ds.update()
if r != 1:
SQLCA.rollback()
return ds.is_error
if withcommit :SQLCA.commit()
return ''
ds = PyPB_Uodatastore()
# 创建表
SQLCA.execsql("create table testCRUD(a varchar(10) null,b varchar(25))")
# 创建报表来实现增删查
ls_error=ref('')
syntax = SQLCA.syntaxfromsql("select a,b from testCRUD",'Style(type=Grid)',ls_error)
if string(ls_error) != '':
raise Exception("构建动态报表失败:%s" % string(ls_error))
syntax = PyPB_dwsyntaxAddUpdate(syntax,"testCRUD",["a","b"])
ds.create(syntax, ls_error)
if string(ls_error) != '':
raise Exception("创建动态报表失败:%s" % string(ls_error))
# 查询表数据
ds.settransobject(SQLCA)
ds.retrieve()
# 插入一行数据
row = ds.insertrow(0)
ds.setitem(row,"a","字段A")
ds.setitem(row,2,"字段B")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("插入后的数据",epj.tojson(ds,"testCRUD"))
# 修改a字段的值
ds.setitem(row, "a", "修改")
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("修改a后的数据",epj.tojson(ds,"testCRUD"))
# 删除
ds.deleterow(1)
PyPB_dwUpdate(ds,SQLCA, withcommit=True)
print("删除后的数据",epj.tojson(ds,"testCRUD"))
# 删除表
SQLCA.execsql("drop table testCRUD")
print("disconnect",SQLCA.disconnect())
实现细节
1 SQLCA.syntaxfromsql构建的报表默认没有update属性需要转换一下
column=(type=char(10) updatewhereclause = yes name=a dbname="testCRUD.a")
通过正则表达式替换为
column=(type=char(10) update=yes updatewhereclause=yes key=yes name=a dbname="testCRUD.a" )
这里注意一点 如果没有设置任何一个key=yes 报表update的时候会导致程序崩溃
2 Python中实现pb的ref参数
// 一般的变量引用方式
ot_build_simple_refarg(_obThis, rt, data,
ob_get_group_id(_obThis, getAppGroup()));
ob_set_data_type(rt, ob_get_data_type(data));
// 如果是引用对象中的某个字段
ob_instance_fldupdate_refpkt(_obThis, pd2, obj2, pDataInfo->sym_id);
// 如果是引用数组中的某一个元素,需要用ob_array_group_id
POB_DATA _TempRef;
_TempRef = ot_array_index(_obThis, _arrayTemp2, _ulongTemp3);
ot_build_simple_refarg(_obThis, _obdataArray, _TempRef
, ob_array_group_id(_obThis, _arrayTemp2));
ob_set_data_type(_obdataArray, ob_get_data_type(_TempRef));
3 数据库commit,rollback,connect,disconnect操作
if (strcmp(opt,"commit")==0) {
rtdb_commit(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "rollback") == 0) {
rtdb_rollback(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "connect") == 0) {
rtdb_start(_obThis, rinst(sqlca));
}
else if (strcmp(opt, "disconnect") == 0) {
rtdb_stop(_obThis, rinst(sqlca));
}
python中直接SQLCA.commit() SQLCA.rollback() SQLCA.connect() SQLCA.disconenct()即可
依赖文件目录
easypj.dll、Libjcc.dll、ntwdblib.dll、python.zip、testCRUD.py
pb8或者pb9自行选择
pbweb80.exe、pbvm80.dll、pbmss80.dll、pbdwe80.dll
pbweb90.exe、pbvm90.dll、pbmss90.dll、pbdwe90.dll
直接测试testCRUD.py代码的cmd命令
pbweb80.exe -c "import testCRUD"
输出结果
插入后的数据 [{"a":"字段A","b":"字段B"}]
修改a后的数据 [{"a":"修改","b":"字段B"}]
删除后的数据 [{}]