⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tkglserver_p.pas

📁 考试系统,是一个简单的但是很经典的
💻 PAS
字号:
unit tkglserver_p;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
  DBClient, tkglsvr_TLB, StdVcl, DB, ADODB, newadodb, Provider, forms;

type
  Ttkglserver = class(TRemoteDataModule, Itkglserver)
    adodb: Tnewadodb;
    qry1: TADOQuery;
    qry2: TADOQuery;
    qry3: TADOQuery;
    qry4: TADOQuery;
    qry5: TADOQuery;
    qry6: TADOQuery;
    qry7: TADOQuery;
    qry8: TADOQuery;
    qry9: TADOQuery;
    qry10: TADOQuery;
    qry11: TADOQuery;
    qry12: TADOQuery;
    qry13: TADOQuery;
    qry14: TADOQuery;
    qry15: TADOQuery;
    qry16: TADOQuery;
    dsp1: TDataSetProvider;
    dsp2: TDataSetProvider;
    dsp3: TDataSetProvider;
    dsp4: TDataSetProvider;
    dsp5: TDataSetProvider;
    dsp6: TDataSetProvider;
    dsp7: TDataSetProvider;
    dsp8: TDataSetProvider;
    dsp9: TDataSetProvider;
    dsp10: TDataSetProvider;
    dsp11: TDataSetProvider;
    dsp12: TDataSetProvider;
    dsp13: TDataSetProvider;
    dsp14: TDataSetProvider;
    cds: TClientDataSet;
    CDS1: TClientDataSet;
    procedure addksmd(tkbh: Integer; ksbh: Integer; const zkzh: WideString; const xm: WideString;
            xb: Integer; const sfzh: WideString; const lxfs: WideString;const lxdz: WideString;
            var err: OleVariant); safecall; //添加考生
    procedure adddfjl(tkbh: Integer; sjbh: Integer; const dfjl: WideString; qsfw: Integer;
                      jzfw: Integer; var err: OleVariant); safecall;  //添加得分结论
    procedure RemoteDataModuleCreate(Sender: TObject);
    procedure RemoteDataModuleDestroy(Sender: TObject);
    procedure getdata(const sSQL: WideString; var vData: OleVariant); safecall;//获取数据
    procedure ExecSqls(const sSql: WideString); safecall; //执行SQL
    procedure chkusr(const usrid: WideString; const usrpwd: WideString; var usrrgts: OleVariant); safecall;//检查用户
    procedure isreged(const usrid: WideString; var betrue: OleVariant); safecall; //检查用户登录名称是否注册
    procedure addtree(tkbh: Integer; const parentid: WideString; const nodetext: WideString; var isok: OleVariant); safecall;
    procedure addlib(const dlmc:WideString;tklx:Integer;const tkmc:WideString;var tkbh:OleVariant;var err:OleVariant);safecall;
    procedure addst(df1: Integer; df2: Integer; df3: Integer; df4: Integer;var stnr: OleVariant; 
                    var err: OleVariant); safecall;//添加、修改试题
    procedure scst(tkbh: Integer; stbh: Integer; var err: OleVariant); safecall;//删除试题
  private
    { Private declarations }
  protected
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
  public
    { Public declarations }
  end;

implementation

uses svrmain_p;

{$R *.DFM}


class procedure Ttkglserver.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
  if Register then
  begin
    inherited UpdateRegistry(Register, ClassID, ProgID);
    EnableSocketTransport(ClassID);
    EnableWebTransport(ClassID);
  end else
  begin
    DisableSocketTransport(ClassID);
    DisableWebTransport(ClassID);
    inherited UpdateRegistry(Register, ClassID, ProgID);
  end;
end;

procedure Ttkglserver.RemoteDataModuleCreate(Sender: TObject);
var vrt:olevariant;
begin
    adodb.AutoLoadCfg:=false;
    adodb.AutoLoadCfg:=true;
    try
        adodb.Open;
    except
        on e:exception do
        begin
            application.MessageBox(pchar('无法连接数据库!'+#13+#13+e.Message),'错误信息',16);
            abort;
        end;
    end;
end;

procedure Ttkglserver.RemoteDataModuleDestroy(Sender: TObject);
begin
   adodb.Close;
end;

procedure Ttkglserver.getdata(const sSQL: WideString; var vData: OleVariant); safecall;
begin
    qry1.Close;
    qry1.SQL.Text:=sSql;
    try
       qry1.Open;
       cds.Active:=false;
       cds.Active:=true;
       vData:=cds.Data;
    finally
       cds.Close;
       qry1.Close;
    end;
end;

procedure Ttkglserver.ExecSqls(const sSql: WideString); safecall;
begin
   if sSql='' then
   begin
      exit;
   end;
   try
      qry15.Close;
      qry15.SQL.Text:=sSQl;
      qry15.ExecSQL;
   except
      on e:exception do
      begin
          application.MessageBox(pchar('数据处理失败!'+#13+#13+e.Message),'错误信息',16);
      end;
   end;
end;

procedure Ttkglserver.chkusr(const usrid: WideString; const usrpwd: WideString; var usrrgts: OleVariant); safecall;
begin
    qry15.Close;
    qry15.SQL.Text:='select ryqx from x_yhb where dlmc='''+usrid+''' and dlmm='''+usrpwd+''' and sybj=0';
    usrrgts:=-1;
    try
        qry15.Open;
        if not qry15.IsEmpty then usrrgts:=qry15.Fields[0].asinteger;
    finally
        qry15.Close;
    end;
end;

procedure Ttkglserver.isreged(const usrid: WideString; var betrue: OleVariant); safecall;
begin
   qry15.Close;
   qry15.SQL.Text:='select dlmc from x_yhb where dlmc='''+usrid+'''';
   try
       qry15.Open;
       if not qry15.IsEmpty then betrue:=1 else betrue:=0;
   finally
       qry15.Close;
   end;
end;

procedure Ttkglserver.addtree(tkbh:Integer; const parentid: WideString; const nodetext: WideString; var isok: OleVariant); safecall;
//添加章节、知识点
var zjbh:string;
    i,n:integer;
begin
   isok:=-1;
   qry15.close;
   qry15.SQL.Text:='select kcfw from k_stfwb where kcfw like :bh and len(kcfw)=:cd order by kcfw';
   qry15.Parameters.ParamByName('bh').Value:=parentid+'%';
   n:=length(parentid);
   qry15.Parameters.ParamByName('cd').Value:=n+2;
   try
       qry15.Open;
       if qry15.RecordCount>99 then abort;//每级编号从 00到99共100个,超过之后就不允许再建
       if not qry15.IsEmpty then
       begin
          i:=0;
          while not qry15.Eof do
          begin
              zjbh:=copy(trim(qry15.Fields[0].asstring),n+1,2);
              if i<>strtoint(zjbh) then break;
              inc(i);
              qry15.Next;
          end;
          if i>99 then abort;
          if i<10 then zjbh:=parentid+'0'+inttostr(i)
          else zjbh:=parentid+inttostr(i);
       end
       else zjbh:=parentid+'00';
       qry16.Close;
       qry16.SQL.Text:='insert into k_stfwb values(:tkbh,:zjbh,:zjmc)';
       qry16.Parameters.ParamByName('tkbh').Value:=tkbh;
       qry16.Parameters.ParamByName('zjbh').Value:=zjbh;
       qry16.Parameters.ParamByName('zjmc').Value:=nodetext;
       try
           qry16.ExecSQL;
       except
           abort;
       end;
       isok:=zjbh;
   finally
       qry15.Close;
   end;
end;

procedure Ttkglserver.addlib(const dlmc: WideString; tklx: Integer; const tkmc: WideString;
                     var tkbh: OleVariant; var err: OleVariant); safecall;
begin
    tkbh:=-1;
    err:='';
    qry15.Close;
    qry15.SQL.Text:='select tkbh from k_tkmcb where tkmc='''+tkmc+'''';
    try
        qry15.Open;
        if not qry15.IsEmpty then
        begin
           err:='该题库名称已经存在,请修改!';
           qry15.Close;
           exit;
        end;
    except
        on e:exception do
        begin
            err:='无法读取数据!'+#13+#13+e.Message;
            exit;
        end;
    end;
    qry15.SQL.Text:='select isnull(max(tkbh),0)+1 from k_tkmcb';
    try
        qry15.Open;
        tkbh:=qry15.Fields[0].AsInteger;
        qry15.Close;
        qry15.SQL.Text:='insert into k_tkmcb values(:tkbh,:tkmc,:tklx,:dlmc)';
        qry15.Parameters.ParamByName('tkbh').Value:=tkbh;
        qry15.Parameters.ParamByName('tkmc').Value:=tkmc;
        qry15.Parameters.ParamByName('tklx').Value:=tklx;
        qry15.Parameters.ParamByName('dlmc').Value:=dlmc;
        qry15.ExecSQL;
    except
       on e:exception do err:='数据处理失败!'+#13+#13+e.Message;
    end;
end;

procedure Ttkglserver.adddfjl(tkbh: Integer; sjbh: Integer; const dfjl: WideString; qsfw: Integer;
                      jzfw: Integer; var err: OleVariant); safecall;
var i:integer;
begin
    err:='-1';
    try
        qry16.Close;
        qry16.SQL.Text:='select dfjl from k_ksjlb where tkbh='+inttostr(tkbh)
         +' and sjbh='+inttostr(sjbh)+' and dfjl='''+dfjl+'''';
        qry16.Open;
        if not qry16.IsEmpty then
        begin
            qry16.Close;
            err:='该得分结论已经存在,请修改!';
            exit;
        end;
        qry16.Close;
        qry16.SQL.Text:='select isnull(max(jlxh),0)+1 from k_ksjlb where tkbh='
          +inttostr(tkbh)+' and sjbh='+inttostr(sjbh);
        qry16.Open;
        i:=qry16.Fields[0].AsInteger;
        qry16.Close;
        qry16.SQL.Text:='insert into k_ksjlb values(:tkbh,:sjbh,:xh,:qsfw,:jzfw,:jl)';
        qry16.Parameters.ParamByName('tkbh').Value:=tkbh;
        qry16.Parameters.ParamByName('sjbh').Value:=sjbh;
        qry16.Parameters.ParamByName('xh').Value:=i;
        qry16.Parameters.ParamByName('qsfw').Value:=qsfw;
        qry16.Parameters.ParamByName('jzfw').Value:=jzfw;
        qry16.Parameters.ParamByName('jl').Value:=dfjl;
        qry16.ExecSQL;
        err:='0';
    except
        on e:exception do err:='数据处理失败!'+#13+#13+e.Message;
    end;
end;

procedure Ttkglserver.addksmd(tkbh: Integer; ksbh: Integer; const zkzh: WideString; const xm: WideString;
  xb: Integer; const sfzh: WideString; const lxfs: WideString;const lxdz: WideString; var err: OleVariant); safecall;
var i:integer;
begin
   err:='-';
   qry15.Close;
   if ksbh=-1 then//添加新考生
   begin
       qry15.SQL.Text:='select isnull(max(ksbh),0)+1 from k_ksmdb where tkbh='+inttostr(tkbh);
       try
           qry15.Open;
           i:=qry15.Fields[0].AsInteger;
           qry15.Close;
       except
           on e:exception do
           begin
               err:=err+'数据处理失败!'+#13+#13+e.Message;
               exit;
           end;
       end;
       qry15.SQL.Text:='insert into k_ksmdb values(:tkbh,:ksbh,:zkzh,:sfzh,:xm,:xb,:lxfs,:lxdz)';
       qry15.Parameters.ParamByName('ksbh').Value:=i;
   end
   else
   begin
      qry15.SQL.Text:='update k_ksmdb set zkzh=:zkzh,sfzh=:sfzh,xm=:xm,xb=:xb,lxfs=:lxfs,lxdz=:lxdz'
        +' where tkbh=:tkbh and ksbh=:ksbh';
      qry15.Parameters.ParamByName('ksbh').Value:=ksbh;
   end;
   qry15.Parameters.ParamByName('tkbh').Value:=tkbh;
   qry15.Parameters.ParamByName('zkzh').Value:=zkzh;
   qry15.Parameters.ParamByName('sfzh').Value:=sfzh;
   qry15.Parameters.ParamByName('xm').Value:=xm;
   qry15.Parameters.ParamByName('xb').Value:=xb;
   qry15.Parameters.ParamByName('lxfs').Value:=lxfs;
   qry15.Parameters.ParamByName('lxdz').Value:=lxdz;
   try
       qry15.ExecSQL;
       err:=inttostr(i);
   except
      on e:exception do
      begin
          err:=err+'无法保存数据!'+#13+#13+e.Message;
      end;
   end;
end;

procedure Ttkglserver.addst(df1: Integer; df2: Integer; df3: Integer; df4: Integer;
     var stnr: OleVariant;var err: OleVariant); safecall;  //如果不出错,err返回的是'0'或者新添加的试题编号
var xh:integer;
    stm:tstream;
begin
   try
      cds1.Close;
      cds1.Data:=stnr;
      qry16.Close;
      qry15.Close;
      if cds1.FieldByName('stbh').AsInteger=0 then
      begin
         qry14.Close;
         qry14.SQL.Text:='select isnull(max(stbh),0)+1 from k_stb where tkbh='+cds1.FieldByName('tkbh').Asstring;
         qry14.Open;
         xh:=qry14.Fields[0].AsInteger;
         qry14.Close;
         qry16.SQL.Text:='insert into k_stb values(:tkbh,:stbh,:kcfw,:stnd,:stnr)';
         qry16.Parameters.ParamByName('stbh').Value:=xh;
         qry15.SQL.Text:='insert into k_fzb values(:tkbh,:stbh,:df1,:df2,:df3,:df4)';
         qry15.Parameters.ParamByName('stbh').Value:=xh;
      end
      else
      begin
         qry16.sql.Text:='update k_stb set stnd=:stnd,stnr=:stnr,kcfw=:kcfw where tkbh=:tkbh and stbh=:stbh';
         qry16.Parameters.ParamByName('stbh').Value:=cds1.FieldByName('stbh').AsInteger;
         qry15.SQL.Text:='update k_fzb set da1=:df1,da2=:df2,da3=:df3,da4=:df4 where tkbh=:tkbh and stbh=:stbh';
         qry15.Parameters.ParamByName('stbh').Value:=cds1.FieldByName('stbh').AsInteger;
      end;
      qry16.Parameters.ParamByName('tkbh').Value:=cds1.FieldByName('tkbh').AsInteger;
      qry16.Parameters.ParamByName('kcfw').Value:=cds1.fieldbyname('kcfw').AsString;
      qry16.Parameters.ParamByName('stnd').Value:=cds1.fieldbyname('stnd').AsInteger;
      stm:=cds1.CreateBlobStream(cds1.FieldByName('stnr'),bmread);
      stm.Position:=0;
      qry16.Parameters.ParamByName('stnr').LoadFromStream(stm,ftblob);
//      qry16.Parameters.ParamByName('stnr').Value:=cds1.fieldbyname('stnr').Value;
      qry15.Parameters.ParamByName('tkbh').Value:=cds1.FieldByName('tkbh').AsInteger;
      qry15.Parameters.ParamByName('df1').Value:=df1;
      qry15.Parameters.ParamByName('df2').Value:=df2;
      qry15.Parameters.ParamByName('df3').Value:=df3;
      qry15.Parameters.ParamByName('df4').Value:=df4;
      cds1.Close;
      adodb.BeginTrans;
      try
          qry16.ExecSQL;
          qry15.ExecSQL;
          adodb.CommitTrans;
          err:=inttostr(xh);
          stm.Free;
      except
         on e:exception do
         begin
            adodb.RollbackTrans;
            stm.Free;
            err:='-'+'保存数据失败!'+#13+#13+e.Message;
            exit;
         end;
      end;
   except
      on e:exception do
      begin
         qry14.Close;
         err:='-'+'无法读取数据!'+#13+#13+e.Message;
      end;
   end;
end;

procedure Ttkglserver.scst(tkbh: Integer; stbh: Integer; var err: OleVariant); safecall;
begin
   err:='-';
   adodb.BeginTrans;
   try
      qry15.close;
      qry16.close;
      qry15.SQL.Text:='delete from k_stb where tkbh='+inttostr(tkbh)+' and stbh='+inttostr(stbh);
      qry16.SQL.Text:='delete from k_fzb where tkbh='+inttostr(tkbh)+' and stbh='+inttostr(stbh);
      qry15.ExecSQL;
      qry16.ExecSQL;
      adodb.CommitTrans;
      err:='0';
   except
      on e:exception do
      begin
          adodb.RollbackTrans;
          err:=err+'数据处理失败!'+#13+#13+e.Message;
      end;
   end;
end;

initialization
  TComponentFactory.Create(ComServer, Ttkglserver,
    Class_tkglserver, ciMultiInstance, tmApartment);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -