消息关闭
    暂无新消息!
项目需要采集到字符数组数据,比如 a[0]=$14, a[1]=$10, a[2]=$0a, a[4]=$01,其实就是采集到的日期20161001,需要把这个数据存到数据库里,要么以14100a01方式保存,要么以20161001方式保存到数据库里,然后另外一个程序可以把数据读出来,因为是现场采集数据,数据量很大,通讯频繁,所以不想采用for循环的方式解析数据,最好是直接内存操作,请附带源码,谢谢。

6个回答

︿ 3
现在能写入数据库,但是读出来的时候总报错
var 
   stream :TMemoryStream;
begin
stream :=TMemoryStream.Create;
  stream.Position :=0;
  stream.WriteBuffer(ATime[0], Length(ATime));
 ADOQuery1.SQL.Add('Insert Into PData (Data) values (:Data)');
  ADOQuery1.Parameters.ParamByName('Data').LoadFromStream(stream, ftblob);
  //TBlobField(ADOQuery1.Parameters.ParamByName('Data')).LoadFromStream(stream);
  ADOQuery1.ExecSQL;
end
能正常写入数据库
但是读出来的时候总是报类型转换错误
var 
   stream :TMemoryStream;
begin
ADOQuery1.SQL.Clear;
 ADOQuery1.SQL.Add('Select * From PData');
 ADOQuery1.Open;
 while not ADOQuery1.Eof do
 begin
   stream :=TMemoryStream.Create;
   TBlobField(ADOQuery1.FieldByName('Data')).SaveToStream(stream);//此句执行报错
   
   ADOQuery1.Next;
 end;
end
︿ 1
只要读出来的与写入的相同, 具体使用哪种格式有什么关系,挑方便快捷的.
︿ 1
转过去, 

S := '';
FOR I:=0 TO 3 DO
  S := S + INTTOHEX(A[I],2);


转回来, 

FOR I:=0 TO 3 DO
  A[i] :=   strtoint('$' + copy(S, i*2+1, 2));


现场手打,如有语法错误自行改正,速度不用怀疑
︿ 0
建议:
1、使用整数,对应data值。
2、使用string,对应日期字符值,如2016-10-27。
3、内存建立动态数组。
这样,退出保存数据表中,另一程序可通过表读取数据。
︿ 0
最好是当成一个variant直接存入数据库,这样可能效率最高,但是怎么把一个字节数组转换成这个,再怎么从这个variant转换成字节数组,不会写
︿ 0
用varbinary或者varchar保存都行,只要能读出来还原回原来的数组就行