当前位置: 代码迷 >> PB >> 这种状况难道PB无解吗
  详细解决方案

这种状况难道PB无解吗

热度:81   发布时间:2016-04-29 08:09:46.0
这种情况难道PB无解吗?
declare emp_cur cursor for  
select mingwen  
from md5info  
where MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))=:a;

open emp_cur;
fetch emp_cur into :b;
close emp_cur;

MDString是在程序中定义的一个函数,调用外部dll文件中的函数,md5jiami1是表中的一列,这样写无法正确执行,如何修改才能正确执行?问题就出在MDString是一个程序中的函数,sqlserver无法识别。数据窗口也试过,其实和写sql是一样的。

------解决方案--------------------
string ls_string
MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))
改成substring(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text))


------解决方案--------------------
MDString 作用难道跟substring一样
string ls_string
string ls_init_a
string ls_b
declare emp_cur cursor for
select md5jiami1,mingwen
from md5info;
open emp_cur;
fetch emp_cur into :ls_a,:b;
while sqlca.sqlcode = 0 
ls_string = MDString(ls_a + :sle_1.text,len(ls_a + :sle_1.text))
if ls_string = ls_init_a then
ls_b = b
end if
loop
close emp_cur;
------解决方案--------------------
SQL语句是提交到数据库执行再返回的,而你的MDString是程序的外部函数,运行在程序端,这显然不可行。为何不在数据库里自定义一个功能类似的MDString函数?
或者如果md5info表数据不多的话,你可以将md5info所有数据取到datastore中,然后SetFilter("MDString(md5jiami1 + "+sle_1.text+",len(md5jiami1 + "+sle_1.text+"))="+string(a)),再取过滤后的数据
------解决方案--------------------
既然是内嵌在PB脚本中的游标,就肯定可以用数据窗口实现,而且效率更高。为什么钻这个牛角尖呢?
------解决方案--------------------
分页啊,大数据量下当然不可能一次搞过来
------解决方案--------------------
楼主的思路是错误的

我认为你的mdstring函数应该是个类似md5 has的函数
1.存储:数据库里应该是md5 has后的值
2.查询:先将字段has,然后where等值查询
------解决方案--------------------
mdstring是一个外部函数吧。外部函数不能在嵌入式sql里使用

应该把数据库的字段内容取出来,再在脚本里进行运算对比


------解决方案--------------------
第一: 游标 这东西 尽量 少用 无论在 pb里面还是 数据库里面
第二: 应该 从数据库里面查询 变形后的密码字段。。而不是现场计算。。
 一般是 
 保存:明文-密文-保存
 查询:查询密文 得到 用户
很少 像楼主这样操作。。。性能、、可靠性 全差很多。。。
------解决方案--------------------
mdstring应该是你在PB脚本里使用的外部函数。外部函数不能在嵌入式sql里使用
你应该把 MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text)) 的值计算出来,赋值给变量,再在SQL中使用。
 string x
x = MDString(md5jiami1 + :sle_1.text,len(md5jiami1 + :sle_1.text)) 

select mingwen
from md5info
where :x=:a;
------解决方案--------------------
我感觉你应该看看数据库支不支持调用dll里函数,如果支持的话再数据库里自定义一个函数来实现这个功能
------解决方案--------------------
你的这个函数MDstring是在PB中定义的一个函数吗?如果是的话,肯定无法执行

如果你把这个函数放在sqlserver里定义,应该是可以的

建议先把数据检索出来,然后再用你的函数判断数据是否符合条件
------解决方案--------------------
游标尽量少用
------解决方案--------------------
再次读了下楼主的帖子,发现 楼主 目标好像是从一个很大的用户表中查找 密码是 指定 值(:a)的用户来。。。而算法代码在dll中,叫 【MDString】 函数

如果 MDString 的算法可以在 sql中实现,那么在sql中 增加 函数 MDString ,就可以在sql语句中直接调用了,
否则。。简单来说有2种方式解决此问题
1 读取所有数据,然后 全部用MDString计算下,然后将计算的结果保存到 md5info 表里面(可以增加一个【新密文】字段)
2 读取所有数据,然后 就地计算 MDString,然后 立刻判断是否符合条件
可以利用 yejihui9527 的回复做少量修改就可以使用了


string ls_string
string ls_init_a //这里保存需要核对的目标:a
string ls_b
declare emp_cur cursor for
select md5jiami1,mingwen
from md5info;
  相关解决方案