首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

这种景况难道PB无解吗

2013-01-06 
这种情况难道PB无解吗?declare emp_cur cursor forselect mingwenfrom md5infowhere MDString(md5jiami1 +

这种情况难道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;
open emp_cur;
while sqlca.sqlcode = 0  
    fetch emp_cur into :ls_a,:b;
    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;

注意:
   fetch emp_cur into :ls_a,:b;  必须在 循环体内执行。。不能在循环体外执行。。。否则只能执行一次。。这好像不符合要求
   ls_b = b  语句得到了 mingwen 字段的值,但没有后续处理代码,如果得到一个就可以了,那么这里必须增加退出循环的代码 如 【exit】,如果每一个符合要求的记录全要找出来,那么这里需要增加 一个数组或者dw或则其他什么东西保存 mingwen 字段的值然后 在这段代码结束后,再来处理这个结果集

整个代码很奇怪。。。好像在找一个拥有相同密码的明文??在猜密码???仔细看了看,。,。。真在破解啊。。。呵呵。。。楼主在做坏事???嘎嘎。。。
  
   mingwen 存放的是明文,,?
   md5jiami1 存放的是md5计算后变形的密文  ?
   MDString 是将密文解密的函数??还是 个加密函数??如果是加密函数,,则应该对明文进行处理。。。呵呵。。
   
   


  


[解决办法]
没什么样问题呀?
MDString是SQl函数吗?

热点排行