#4
第一点:就我以前的经历,oracle数据库你最好有一个Primary Key,强烈建议
第二点:读例(我刚完成的项目中的)
//==============================================================================
//功能:从批量交易表中读出当前的交易信息
//入参:aRecIndex 当前的批量交易表的记录号
//出参:aBITran 交易数据信息
//返回:当数据库操作正常 返加true 否则返回 false
//==============================================================================
function ReadRecFmBatchTab(const aRecIndex:Integer;
aDatabase:TDatabase;
var aBITran:TBITran):Boolean;
var
mQuery:TQuery;
BlobStream:TStream;
begin
Result:=true;
mQuery:=TQuery.Create(nil);
mQuery.DatabaseName:=aDataBase.DatabaseName;
mQuery.SessionName:=aDataBase.SessionName;
mQuery.SQL.Clear;
with mQuery do
begin
Sql.Add('SELECT * FROM BATCHTRANS_TAB WHERE TINDEX='+IntToStr(aRecIndex));
try
try
mQuery.Open;
aBITran.RecIndex:=aRecIndex;
aBITran.BznsCode:=FieldByName('TRANS_CODE').AsInteger;
aBITran.BznsCtrl.BznsCtrlNo:=FieldByName('TRANS_CTRLNO').AsInteger;
aBITran.BznsCtrl.BznsSta:=FieldByName('TRANS_STATE').AsInteger;
aBITran.BznsCtrl.BznsNode:=FieldByName('TRANS_NODE').AsInteger;
aBITran.BznsCtrl.NodeSta:=FieldByName('TRANS_NODESTATE').AsInteger;
aBITran.UnitNo :=FieldByName('UNITNO').AsString;
aBITran.Card :=FieldByName('CUST_CARDNO').AsString;
aBITran.Ywh :=FieldByName('CUST_AGENTNO').AsString;
aBITran.Jzlsh :=FieldByName('UNITSERIAL').AsString;
aBITran.Sfbh :=FieldByName('SFBH').AsInteger;
aBITran.Zjfys :=FieldByName('ZJFYS').AsInteger;
aBITran.Zqfys :=FieldByName('ZQFYS').AsInteger;
aBITran.IFTRXSERNB :=FieldByName('HOSTSERIAL').AsInteger;
aBITran.PreAmount :=FieldByName('TRANS_PREAMOUNT').AsFloat;
aBITran.RealAmount :=FieldByName('TRANS_AMOUNT').AsFloat;
aBITran.Balance :=FieldByName('TRANS_BALANCE').AsFloat;
BlobStream:=CreateBlobStream(FieldByName('CONTENTS'),bmRead);
BlobStream.Read(aBITran.Content,BlobStream.Size+1);
except
Result:=false;
end;
finally
Free;
end;
end;
end;
第三点:写例:
//==============================================================================
//功能:向批量交易表中写入交易数据信息和交易控制信息
//入参:aRecIndex 当前的批量交易表的记录号
// aBITran 交易数据信息
// aBznsCtrl 交易控制信息
//返回:当数据库操作正常 返加true 否则返回 false
//==============================================================================
function WriteRecToBatchTab(const aRecIndex:Integer;
aDataBase:TDatabase;
const aBITran:TBITran):Boolean;
var
mQuery:TQuery;
MS:TMemoryStream;
begin
Result:=true;
mQuery:=TQuery.Create(nil);
mQuery.DatabaseName:=aDataBase.DatabaseName;
mQuery.SessionName:=aDataBase.SessionName;
mQuery.SQL.Clear;
with mQuery do
begin
//组装mQuery的sql语句
SQL.Add('UPDATE BATCHTRANS_TAB SET TRANS_STATE=:TRANS_STATE,'+
'TRANS_NODE=:TRANS_NODE,TRANS_NODESTATE=:TRANS_NODESTATE,'+
'HOSTSERIAL=:HOSTSERIAL,TRANS_PREAMOUNT=:TRANS_PREAMOUNT,'+
'TRANS_AMOUNT=:TRANS_AMOUNT,TRANS_BALANCE=:TRANS_BALANCE,'+
'UNITSERIAL=:UNITSERIAL,'+
'SFBH=:SFBH,ZQFYS=:ZQFYS,ZJFYS=:ZJFYS,TRANS_MEMO=:TRANS_MEMO,'+
'CONTENTS=:CONTENTS'+
' WHERE TINDEX=:TINDEX');
MS:=TMemoryStream.Create;
try
MS.Write(aBITran.Content,StrLen(aBITran.Content));
try
ParamByName('TINDEX').AsInteger:=aBITran.RecIndex;
ParamByName('TRANS_STATE').AsInteger:=aBITran.BznsCtrl.BznsSta;
ParamByName('TRANS_NODE').AsInteger:=aBITran.BznsCtrl.BznsNode;
ParamByName('TRANS_NODESTATE').AsInteger:=aBITran.BznsCtrl.NodeSta;
ParamByName('HOSTSERIAL').AsInteger:=aBITran.IFTRXSERNB;
ParamByName('TRANS_PREAMOUNT').AsFloat:=aBITran.PreAmount;
ParamByName('TRANS_AMOUNT').AsFloat:=aBITran.RealAmount;
ParamByName('TRANS_BALANCE').AsFloat:=aBITran.Balance;
ParamByName('UNITSERIAL').AsString:=aBITran.Jzlsh;
ParamByName('SFBH').AsInteger:=aBITran.Sfbh;
ParamByName('ZQFYS').AsInteger:=aBITran.Zqfys;
ParamByName('ZJFYS').AsInteger:=aBITran.Zjfys;
ParamByName('TRANS_MEMO').AsString:=aBITran.Describe;
ParamByName('CONTENTS').LoadFromStream(MS,ftMemo);
aDataBase.StartTransaction;
ExecSQL;
aDataBase.Commit;
except
Result:=false;
aDataBase.RollBack;
end;
finally
Free;
MS.Free;
end;
end;
end;