如何读取数据库中某一字段类型为Blob类型的数据,并存到字节数组中???急!!! (100分)

  • 主题发起人 主题发起人 金洪
  • 开始时间 开始时间

金洪

Unregistered / Unconfirmed
GUEST, unregistred user!
由于表中的密码字段的数据加了密,字段类型为Blob类型,如何读出加密的数据,小弟
对此类数据的读取不太了解!
 
可以先读取IMAGE字段数据,然后解码。

金洪老兄,你还在济南吗?
 
我认为是要经过一个反运算的,就是它用什么方法如base64加密的,你就要用base64
的反运算再把它还原成字符串。
 
是要经过反运算的,指导思想与楼上一个意思。
 
用计算字段解码。
 
TO 荷塘新月:
嘿,好长时间不见,俺怪想你的!呵呵!
我还在济南,你呢,现在怎样!

不好意思,字段类型其实就是bolb类型,
var strpass :TBlobBytedata;
tmp:byte;
query_login.GetBlobFieldData(2,strpass);
tmp:=strpass[0];
strpass是字节数组类型可是通过strpass[0]方式却无法读出数据,说明白点
tmp:=strpass[0];根本就不执行,而是直接跳过去,不知为何。
 
用计算字段解码
 
试试下面代码:
procedure Tfrm_tmp.CbtempChange(Sender: TObject);
var
tempname:string;
bphoto:tmemorystream;
begin
bphoto:=tmemorystream.Create();
empname:=trim(Cbtemp.text);
CDS_CUR.Locate('name',Tempname,[]);
gstrID:=CDS_CUR.fieldbyname('ID').asstring;
if not CDS_CUR.FieldByName('photo').isnull then
begin
try
TBLOBFIELD(CDS_CUR.FieldByName('PHOTO')).savetostream(bphoto);
bphoto.Position:=0;
image1.Picture.bitmap:=nil;
image1.Picture.bitmap.LoadFromStream(bphoto);
finally
bphoto.free;
end;
end;
 
To sunrainwang:
不好意思,字段类型其实是bolb类型,那是用户信息表中密码字段加密后的类型!
 
bolb类型里存的是2进制数据的,按你这么说并没有加密啊
 
To nibul:
存入数据库中的是加密后的数据,数据类型为BOLB类型,现在的关键
的问题是如何逐字节的把经过加密数据读出。下面的方法
var strpass :TBlobBytedata;
tmp:byte;
query_login.GetBlobFieldData(2,strpass);
tmp:=strpass[0];==〉这一句不知为什么会跳过???
 
奇怪,真奇怪
var tmpsize:integer;
strpass :TBlobBytedata;
tmpsize:=query_login.GetBlobFieldData(2,strpass);==>>tmpsize的值为空,而
var tmpsize:string;
strpass :TBlobBytedata;
tmpsize:=inttostr(query_login.GetBlobFieldData(2,strpass);==>>tmpsize的值
却是128,why??????
 
如何把字段为blob类型的数据读到一个字节数组中???

没人帮忙吗???
 
To bowa:
具体做法!3Q!
 
富翁们都休假了吗?
 
如何把字段为blob类型的数据按字节读到一个字节数组中???

没人帮忙吗???可以加银子!!!
 
procedure password.read
var
s: tstream ;
b: array[0..??] of byte ;
begin
s:= tmemorystream.create;// or s:=table.creatblobstream(password,????) ;
passwordfield.savetostream(s) ;
s.seek(0,stbeginning) ;
s.read(b,s.size) ;
s.free;
end ;

procedure password.save ;
var
b:array[0..??]of byte;
s:tstream;
begin
s:=tmemorystream.create;
s.write(s,sizeof(b));
passwordfield.readfromstream(s);
s.free;
end;
 
To pascal:
3Q,我试试,另外,知不知道
var strpass :TBlobBytedata;
tmp:byte;
query_login.GetBlobFieldData(2,strpass);
tmp:=strpass[0];==〉这一句不知为什么会跳过???的原因
 
我这儿有一段用java的代码,读的是同一个表,富翁们给个方法:
if (ifPass()) {
//启用服务器安全策略
try {
userdm = getdM().getText();
java.sql.Statement st = conn.createStatement();
String query =
"select name,dbuserinfo,fullname from sys_logins where

name='" + userdm + "'";
java.sql.ResultSet rs = st.executeQuery(query);

if (rs.next()) { //解密过程
String gh = rs.getString("name");
byte[] mm = rs.getBytes(2);
if (mm == null) {
String temppass = new String(getkL().getPassword());

if (temppass == null || (temppass.equals("")))
ispass = true;
else
ispass = false;
} else {
int ll_pos = 0;
int lb_tmp = mm[ll_pos];
int li_len = lb_tmp;
ll_pos += 2;
if (li_len > 30)
System.out.println("server password error");
String as_str = "";
for (int i = 1; i <= li_len; i++) {
lb_tmp = mm[ll_pos];
if (lb_tmp < 0)
lb_tmp += 256;
ll_pos += 2;
as_str = as_str + (char) (lb_tmp - i * i);
}
if (mm[ll_pos] != li_len)
System.out.println("server password error");
if (as_str.equals(HzBmZh.StringToDb(new

String(getkL().getPassword()))))
ispass = true;
}
}
rs.close();
st.close();
} catch (java.sql.SQLException e) {
e.printStackTrace();
}
if (!ispass) {
java.awt.Toolkit.getDefaultToolkit().beep();
javax.swing.JOptionPane.showMessageDialog(this, "代码或密码错!");
getdM().setText("");
getxM().setText("");
getkL().setText("");
getdM().requestFocus();

}

} else {
Object[] options = {"确定", "取消"};
int value =
javax.swing.JOptionPane.showOptionDialog(
this,
"无法使用网络安全策略,请以本系统安全策略登陆",
"警告!",
javax.swing.JOptionPane.DEFAULT_OPTION,
javax.swing.JOptionPane.ERROR_MESSAGE,
null,
options,
options[0]);
switch (value) {
case javax.swing.JOptionPane.OK_OPTION :
{
getJRadioButton_wl().setSelected(false);
getJRadioButton_bxt().setSelected(true);
getdM().setText("");
getdM().requestFocus();
break;
}
case javax.swing.JOptionPane.CANCEL_OPTION :
{
System.exit(0);
break;
}
}

}
 
后退
顶部