delphi中使用TUniQuery线程调用报错

才子佳人丶 2018-03-05 05:20:23
RT,报错:ole db error occurred.Code 80040E05h


百度后说添加
CoInitialize(nil);或者CoInitializeEx(NIL,COINIT_MULTITHREADED);
CoUnInitialize;
可解决。尝试后,并未解决。

部分代码如下:
1.线程代码
procedure TSyncDataToLocalThread.execute;
var
valFileName: string;
begin
CoInitializeEx(nil, COINIT_MULTITHREADED);
valFileName := '';
VideoDBLocal_Sqlite.SyncData(valFileName, FOwner.FChannelID);
CoUninitialize;
end;

2.SyncData方法代码(这里面也试过添加CoInitializeEx,也报错)
function SyncData(valFileName: string; valChannelID: integer): boolean;
var
itemp: int64;
begin
///获取播出表数据并同步
SetBroadCastData(valChannelID);
end;

3.
function SetBroadCastData(valChannelID: Integer): boolean;
begin
TmpQuery := TUniQuery.Create(nil);
try
if TmpQuery.Connection = nil then
TmpQuery.Connection := DataModule_VideoDB.dbmain;
TmpQuery.SQL.Clear;
////查找当天及以后节目
tmpDate := GetDateEveryStartTime(now, FEveryDayStartTime);
sSql := 'select * from BroadcastListTable a left outer join material b on a.MaterialID=b.MatlID where ChannelNo=' +
IntToStr(valChannelID) + ' and startdate>=' + QuotedStr(datetimetostr(tmpDate));
sSql := sSql + ' order by iid';
if DataModule_VideoDB.ExecuteSqlstr(TmpQuery, sSql, iOpenSql, pError) = iResultFail then
begin
Exit;
end;
end;

4.function TDataModule_VideoDB.ExecuteSqlstr(Aquery: TUniQuery; sSqlString: WideString;
iType: integer; var pError: pchar): Integer;
begin
if Aquery.Active then
begin
Aquery.Close;
end;
if Aquery.Connection = nil then
Aquery.Connection := DataModule_VideoDB.dbmain;

with Aquery do
begin
close;
sql.clear;
sql.Add(sSqlString);
try
open; //这里报错
except
on E: Exception do
begin
pError := pchar(E.Message + #13#10);
exit;
end;
end;
end;
end;
...全文
1028 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
才子佳人丶 2018-03-13
  • 打赏
  • 举报
回复
引用 2 楼 yqbaby 的回复:
用的哪个版本?怎么用个线程这么复杂?现在XE的线程操作很简单了,接近傻瓜式的
procedure TFormPhoneMain.Button1Click(Sender: TObject);
begin
  CheckConnect;
  if not GBConnected then
  begin
    Exit;
  end;
  // 验证登录
  if (Edit3.Text='')or(Edit4.Text='') then
  begin
    // ShowMessage('请输入登录信息!');
    if Edit3.Text='' then
    begin
      Popup1.PlacementTarget:=Edit3;
      Label20.Text:='请输入账号!';
    end
    else
    begin
      Popup1.PlacementTarget:=Edit4;
      Label20.Text:='请输入密码!';
    end;
    Popup1.Popup();
    // Edit3.SetFocus;
    Exit;
  end;
  // 登录
  with UniQuery5 do
  begin
    Close;
    SQL.Clear;
    SQL.Add(format('select * from tfsyy_ryzd where (dm = ''%s'' or mc = ''%s'') and mm = ''%s''',
      [trim(Edit3.Text), trim(Edit3.Text), trim(Edit4.Text)]));
    Open;
    if RecordCount=0 then
    begin
      Popup1.PlacementTarget:=Button1;
      Label20.Text:='账号或密码不匹配!';
      Popup1.Popup();
      // ShowMessage('登录失败!不能下载!');
      Exit;
    end;
  end;
  TThread.CreateAnonymousThread(//无需界面显示的
    procedure()
    var
      i: integer;
    begin
      // 下载号码本
      try
        try
          UniQuery3.Close;
          UniQuery3.SQL.Clear;
          UniQuery3.SQL.Add('delete from phoneno where phone_flag = ''Y''');
          UniQuery3.ExecSQL;
          // UniQuery3.Close;
          UniQuery3.SQL.Clear;
          UniQuery3.SQL.Add('select * from phoneno where 1<>1');
          UniQuery3.Open;
          UniQuery2.Open;
          Layout2.Visible:=True;
          ScaledLayout1.Visible:=False;
          UniQuery4.Open;
          i:=UniQuery4.FieldByName('sl').AsInteger;
          ProgressBar1.Max:=i;
          ProgressBar1.Value:=0;
          Label1.Text:=format('正在更新记录:已更新%.0f 条记录/ 共%d条记录', [ProgressBar1.Value, i]);
          // Application.ProcessMessages;//线程内不可用此代码
          UniQuery2.First;
          while not UniQuery2.eof do
          begin
            UniQuery3.Append;
            UniQuery3.FieldByName('User_Name').AsString:=UniQuery2.FieldByName('User_Name').AsString;
            UniQuery3.FieldByName('User_Office').AsString:=UniQuery2.FieldByName('User_Office').AsString;
            UniQuery3.FieldByName('User_Number').AsInteger:=UniQuery2.FieldByName('SID').AsInteger;
            UniQuery3.FieldByName('User_ID').AsString:=UniQuery2.FieldByName('User_ID').AsString;
            UniQuery3.FieldByName('Phone_YDDH').AsString:=UniQuery2.FieldByName('Phone_YDDH').AsString;
            UniQuery3.FieldByName('Phone_YDHM').AsString:=UniQuery2.FieldByName('Phone_YDHM').AsString;
            UniQuery3.FieldByName('Phone_DXDH').AsString:=UniQuery2.FieldByName('Phone_DXDH').AsString;
            UniQuery3.FieldByName('Phone_DXHM').AsString:=UniQuery2.FieldByName('Phone_DXHM').AsString;
            UniQuery3.FieldByName('Phone_FLag').AsString:=UniQuery2.FieldByName('Phone_FLag').AsString;
            UniQuery3.FieldByName('User_Photo').Value:=UniQuery2.FieldByName('User_Photo').Value;
            UniQuery3.FieldByName('WBM').AsString:=UniQuery2.FieldByName('WBM').AsString;
            UniQuery3.FieldByName('PYM').AsString:=UniQuery2.FieldByName('PYM').AsString;
            UniQuery3.Post;
            UniQuery2.Next;
            // 更新进度条,存在界面显示的线程
            TThread.Synchronize(TThread.CurrentThread,
              procedure()
              begin
                ProgressBar1.Value:=ProgressBar1.Value+1;
                Label1.Text:=format('更新记录:已更新%.0f 条记录/ 共%d条记录', [ProgressBar1.Value, i]);
                // Application.ProcessMessages;
              end);
          end;
          UniQuery4.Close;
          UniQuery2.Close;
          UniConnection2.Disconnect;
          ShowMessage('更新成功!');
        except
          on E: Exception do
            ShowMessage('更新失败,请检查网络后重试!'+E.Message);
        end;
      finally
        Layout2.Visible:=False;
        ScaledLayout1.Visible:=True;
      end;
    end).Start;
end;
手机更新号码本的一段代码,不用线程,更新时出现假死,会提示‘’无响应,是否结束‘’,用了线程后就没这些问题了
谢谢回复。进程中调用必须使用Synchronize同步线程,已解决。
DelphixpeFan 2018-03-07
  • 打赏
  • 举报
回复
用的哪个版本?怎么用个线程这么复杂?现在XE的线程操作很简单了,接近傻瓜式的
procedure TFormPhoneMain.Button1Click(Sender: TObject);
begin
  CheckConnect;
  if not GBConnected then
  begin
    Exit;
  end;
  // 验证登录
  if (Edit3.Text='')or(Edit4.Text='') then
  begin
    // ShowMessage('请输入登录信息!');
    if Edit3.Text='' then
    begin
      Popup1.PlacementTarget:=Edit3;
      Label20.Text:='请输入账号!';
    end
    else
    begin
      Popup1.PlacementTarget:=Edit4;
      Label20.Text:='请输入密码!';
    end;
    Popup1.Popup();
    // Edit3.SetFocus;
    Exit;
  end;
  // 登录
  with UniQuery5 do
  begin
    Close;
    SQL.Clear;
    SQL.Add(format('select * from tfsyy_ryzd where (dm = ''%s'' or mc = ''%s'') and mm = ''%s''',
      [trim(Edit3.Text), trim(Edit3.Text), trim(Edit4.Text)]));
    Open;
    if RecordCount=0 then
    begin
      Popup1.PlacementTarget:=Button1;
      Label20.Text:='账号或密码不匹配!';
      Popup1.Popup();
      // ShowMessage('登录失败!不能下载!');
      Exit;
    end;
  end;
  TThread.CreateAnonymousThread(//无需界面显示的
    procedure()
    var
      i: integer;
    begin
      // 下载号码本
      try
        try
          UniQuery3.Close;
          UniQuery3.SQL.Clear;
          UniQuery3.SQL.Add('delete from phoneno where phone_flag = ''Y''');
          UniQuery3.ExecSQL;
          // UniQuery3.Close;
          UniQuery3.SQL.Clear;
          UniQuery3.SQL.Add('select * from phoneno where 1<>1');
          UniQuery3.Open;
          UniQuery2.Open;
          Layout2.Visible:=True;
          ScaledLayout1.Visible:=False;
          UniQuery4.Open;
          i:=UniQuery4.FieldByName('sl').AsInteger;
          ProgressBar1.Max:=i;
          ProgressBar1.Value:=0;
          Label1.Text:=format('正在更新记录:已更新%.0f 条记录/ 共%d条记录', [ProgressBar1.Value, i]);
          // Application.ProcessMessages;//线程内不可用此代码
          UniQuery2.First;
          while not UniQuery2.eof do
          begin
            UniQuery3.Append;
            UniQuery3.FieldByName('User_Name').AsString:=UniQuery2.FieldByName('User_Name').AsString;
            UniQuery3.FieldByName('User_Office').AsString:=UniQuery2.FieldByName('User_Office').AsString;
            UniQuery3.FieldByName('User_Number').AsInteger:=UniQuery2.FieldByName('SID').AsInteger;
            UniQuery3.FieldByName('User_ID').AsString:=UniQuery2.FieldByName('User_ID').AsString;
            UniQuery3.FieldByName('Phone_YDDH').AsString:=UniQuery2.FieldByName('Phone_YDDH').AsString;
            UniQuery3.FieldByName('Phone_YDHM').AsString:=UniQuery2.FieldByName('Phone_YDHM').AsString;
            UniQuery3.FieldByName('Phone_DXDH').AsString:=UniQuery2.FieldByName('Phone_DXDH').AsString;
            UniQuery3.FieldByName('Phone_DXHM').AsString:=UniQuery2.FieldByName('Phone_DXHM').AsString;
            UniQuery3.FieldByName('Phone_FLag').AsString:=UniQuery2.FieldByName('Phone_FLag').AsString;
            UniQuery3.FieldByName('User_Photo').Value:=UniQuery2.FieldByName('User_Photo').Value;
            UniQuery3.FieldByName('WBM').AsString:=UniQuery2.FieldByName('WBM').AsString;
            UniQuery3.FieldByName('PYM').AsString:=UniQuery2.FieldByName('PYM').AsString;
            UniQuery3.Post;
            UniQuery2.Next;
            // 更新进度条,存在界面显示的线程
            TThread.Synchronize(TThread.CurrentThread,
              procedure()
              begin
                ProgressBar1.Value:=ProgressBar1.Value+1;
                Label1.Text:=format('更新记录:已更新%.0f 条记录/ 共%d条记录', [ProgressBar1.Value, i]);
                // Application.ProcessMessages;
              end);
          end;
          UniQuery4.Close;
          UniQuery2.Close;
          UniConnection2.Disconnect;
          ShowMessage('更新成功!');
        except
          on E: Exception do
            ShowMessage('更新失败,请检查网络后重试!'+E.Message);
        end;
      finally
        Layout2.Visible:=False;
        ScaledLayout1.Visible:=True;
      end;
    end).Start;
end;
手机更新号码本的一段代码,不用线程,更新时出现假死,会提示‘’无响应,是否结束‘’,用了线程后就没这些问题了
frtrnr 2018-03-06
  • 打赏
  • 举报
回复
错误提示:只有前一个打开的数据集取到最后才能执行当前事务的命令。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧