我在做批量更新的时候,遇到这样的问题:
把生成的sql语句在PL/SQL中一条一条的执行,没有任何问题,可用批量更新就报"ora0091 invalid character",不知问题出在什么地方?代码如下:
=======================
frm_pubKC.qry_User.First;
while not frm_pubKC.qry_User.Eof do begin
maxNum:=maxNum+1;
i:=i+1;
sSerialNum:=sSerial+copy('000000',1,6-length(inttostr(maxNum)))+inttostr(maxNum);
sUserID:=frm_pubKC.qry_User.fieldByName('用户ID').Value;
strSQL:='update tbsdcme_studystatus set Send_Date=to_date('''+datetostr(self.dtpSendDate.Date)+''',''yyyy-MM-dd''),'
+'Operator='''+trim(self.txtOperator.Text)+''',serial_number='''+sSerialNum+''''
+' where User_ID='''+sUserID+''' and type_id='''+KCID+''';'; self.qry_Pub.SQL.Add(strSQL);
frm_pubKC.qry_User.Next;
end;
self.qry_Pub.SQL.SaveToFile('e:\ss.txt');
dataconn.conn.BeginTrans;
try
self.qry_Pub.ExecSQL;
dataconn.conn.CommitTrans;
MessageBox(Handle, '生成完毕!', '提示信息', MB_ICONASTERISK);
except
dataconn.conn.RollbackTrans;
MessageBox(Handle, '生成失败!', '提示信息', MB_ICONHAND);
end;
把生成的sql语句在PL/SQL中一条一条的执行,没有任何问题,可用批量更新就报"ora0091 invalid character",不知问题出在什么地方?代码如下:
=======================
frm_pubKC.qry_User.First;
while not frm_pubKC.qry_User.Eof do begin
maxNum:=maxNum+1;
i:=i+1;
sSerialNum:=sSerial+copy('000000',1,6-length(inttostr(maxNum)))+inttostr(maxNum);
sUserID:=frm_pubKC.qry_User.fieldByName('用户ID').Value;
strSQL:='update tbsdcme_studystatus set Send_Date=to_date('''+datetostr(self.dtpSendDate.Date)+''',''yyyy-MM-dd''),'
+'Operator='''+trim(self.txtOperator.Text)+''',serial_number='''+sSerialNum+''''
+' where User_ID='''+sUserID+''' and type_id='''+KCID+''';'; self.qry_Pub.SQL.Add(strSQL);
frm_pubKC.qry_User.Next;
end;
self.qry_Pub.SQL.SaveToFile('e:\ss.txt');
dataconn.conn.BeginTrans;
try
self.qry_Pub.ExecSQL;
dataconn.conn.CommitTrans;
MessageBox(Handle, '生成完毕!', '提示信息', MB_ICONASTERISK);
except
dataconn.conn.RollbackTrans;
MessageBox(Handle, '生成失败!', '提示信息', MB_ICONHAND);
end;
self.qry_Pub.SQL.SaveToFile('e:\ss.txt');
这一行可以不要.它是将生成的sql语句保存到'e:\ss.txt文件,只是用来查看用的,to jinjazz(人雅的标记--落寞刺客)
User_ID,type_id的类型都是VARCHAR2类型
{...}
self.qry_Pub.SQL.Add(strSQL);
frm_pubKC.qry_User.Next;
end;
self.qry_Pub.ExecSQL;你的意思是:
在「qry_Pub」中挿入多個「update」語句、最後一起「ExecSQL」?这样是不行的.試試↓
dataconn.conn.BeginTrans;
try
while not frm_pubKC.qry_User.Eof do begin
{...}
self.qry_Pub.SQL.Add(strSQL);
self.qry_Pub.ExecSQL;
frm_pubKC.qry_User.Next;
end;
dataconn.conn.CommitTrans;
except
dataconn.conn.RollbackTrans;
end;
然后用程储过程来处理
答:可以!解决方法如下:
sSql:='begin';
for i:=1 to XXXdo //用for来加入你的操作记录,插入,更新删除都可以。
begin
sSql:=sSql+ 'insert into Tablename(field1,field2...) value() ';
end;
sSql:=sSql+ 'commit; end;';with query1 do
begin
close;
sql.clear;
sql.add(sSql);
execsql;
end;