用了五个控件
1. HOST: TADOConnection
2. ADO: TADOQuery
3. DSP: TDataSetProvider
4. CDS: TClientDataSet
5. DS: TDataSource
6 DBGrid1: DBGrid;ADO.Connection := HOST;
DSP.DataSet := ADO;
CDS.ProviderName := DSP;
DS.DataSet := CDS;
DBGrid1.DataSource := DS;为什么我用CDS.ApplyUpdates(0);不能把已修改的数据提交到服务器呢?
我主要是想通过三层的方法更新数据,请各位大哥大姐指点下
1. HOST: TADOConnection
2. ADO: TADOQuery
3. DSP: TDataSetProvider
4. CDS: TClientDataSet
5. DS: TDataSource
6 DBGrid1: DBGrid;ADO.Connection := HOST;
DSP.DataSet := ADO;
CDS.ProviderName := DSP;
DS.DataSet := CDS;
DBGrid1.DataSource := DS;为什么我用CDS.ApplyUpdates(0);不能把已修改的数据提交到服务器呢?
我主要是想通过三层的方法更新数据,请各位大哥大姐指点下
SQLCommand:string; --获得表结果
TableName:String; --更新的表名
DataSet:TClientDataSet; --需要更新的dataset
NotUpField:Array of string --不更新的字段名
调用
updatedataset('select * from tablename where 1=2','tablename',yourclientdataset,[]);
你看看是怎么实现的吧,要想直接用这个类,你简单修改一下也可以
unit IClsDBAccessADO;interfaceuses
SysUtils, Classes, ADODB, Provider, DB, DBClient,Dialogs,Tool_N,IniFiles,IBase,MIDASLIB;
type
TDBAccessADO = class (TDataModule, IDBAccess)
ADOCommand1: TADOCommand;
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
ClientDataSet1: TClientDataSet;
DataSetProvider1: TDataSetProvider;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DataSetProvider1BeforeUpdateRecord(Sender: TObject; SourceDS:
TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
private
FNotUpdateField: array of string;
SqlPwd,SqlUserName,SqlDBName,ServerIp:string;
//设置连接
procedure SetConnectStr;
public
Function InitServer:integer;
function ExecSQLCommand(SQLCommand:string): Integer; stdcall;
function GetDataSet(SQLCommand:string;DataSet:TClientDataSet): Integer;
stdcall;
function UpdateDataSet(SQLCommand:string;TableName:String;
DataSet:TClientDataSet;NotUpField:Array of string): Integer;
stdcall;
end;
var
DBAccessADO: TDBAccessADO;implementationuses FrmDialog;//uses SystemConst;{$R *.dfm}{ TDataModuleDBConMgr }{
********************************* TDBAccessADO *********************************
}procedure TDBAccessADO.DataModuleCreate(Sender: TObject);
var
s: string;
begin
s:='数据库连接失败!';
if InitServer=S_False then exit;
end;procedure TDBAccessADO.DataModuleDestroy(Sender: TObject);
begin
ADOConnection1.Connected:=False;
end;procedure TDBAccessADO.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind:
TUpdateKind; var Applied: Boolean);
var
int1: Integer;
Field1: TField;
begin
if Length(FNotUpdateField)=0 then Exit;
for int1:=Low(FNotUpdateField) to High (FNotUpdateField) do
begin
Field1:=DeltaDS.FieldByName(FNotUpdateField[int1]);
Field1.ProviderFlags:=
Field1.ProviderFlags-[pfInUpdate,pfInWhere];
end;
end;function TDBAccessADO.ExecSQLCommand(SQLCommand:string): Integer;
begin
adocommand1.CommandText:=SqlCommand;
try
adoconnection1.Connected:=false;
adoconnection1.Connected:=true;
adocommand1.Execute;
adoconnection1.Connected:=false;
result:=S_OK;
except
result:=S_False;
end;
end;function TDBAccessADO.GetDataSet(SQLCommand:string;DataSet:TClientDataSet):
Integer;
begin
try
adoconnection1.Connected:=false;
adoconnection1.Connected:=true;
clientdataset1.Active:=false;
clientdataset1.CommandText:=SQLCommand;
clientdataset1.Active:=true;
DataSet.Data:=ClientDataSet1.Data;
clientdataset1.Active:=false;
result:=S_OK;
except
result:=S_False;
end;
end;function TDBAccessADO.InitServer: Integer;
//var
// SQLPwd, SQLUserName, SQLDBName, ServerIP: string; procedure InitSqlParam;
var
FileName:string;
begin
FileName:=GetMainPath+'resource\ServerList.ini';
with TInifile.Create(Filename) do
begin
ServerIP:=ReadString('ServerInfo','ServerIP','');
SQLDBName:=ReadString('ServerInfo','SQLDBName','');
SQLUserName:=ReadString('ServerInfo','SQLUserID','');
SQLPwd:=ReadString('ServerInfo','SQLPwd','');
Destroy;
end;
end;begin
InitSqlParam; ADOConnection1.Connected:=False;
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password='+
SQLPwd+
';Persist Security Info=True;'+
'User ID='+
SQLUserName+
';Initial Catalog='+
SQLDBName+
';Data Source='+
ServerIP;
try
ADOConnection1.Connected:=True;
result:=S_OK;
except
result:=S_FALSE;
end;end;procedure TDBAccessADO.SetConnectStr;
var
ConnStr:string;
begin
Connstr:='Provider=SQLOLEDB.1;Integrated Security=SSPI;'+
'Persist Security Info=False;Data Source='+ServerIp;
adoconnection1.Connected:=false;
adoconnection1.ConnectionString:=ConnStr;
end;function TDBAccessADO.UpdateDataSet(SQLCommand:string;TableName:String;
DataSet:TClientDataSet;NotUpField:Array of string): Integer;
var
ErrorCount:integer;
int1,int2:integer;
begin
if DataSet=nil then
begin
result:=S_False;
exit;
end;
if DataSet.ChangeCount=0 then
begin
result:=0;
exit;
end;
try
adoconnection1.Connected:=false;
adoconnection1.Connected:=true;
except
result:=S_False;
exit;
end; //FNotUpdateField
int1:=length(NotUpField);
if int1<>0 then
begin
setlength(FNotUpDateField,int1);
int2:=0;
for int1:=low(NotUpField) to high(notUpField) do
begin
FNotUpdateField[int2]:=NotUpField[int1];
inc(int2);
end;
end; try
adodataset1.CommandText:=SQLCommand;
clientDataset1.Data:=dataset.Delta;
DataSetProvider1.ApplyUpdates(clientdataset1.Data,0,errorcount);
if errorcount=0 then
dataset.MergeChangeLog;
result:=errorcount;
except
result:=S_False;
end;
end;end.数据库配置文件ini内容
[ServerInfo]
ServerIP=127.0.0.1
SQLDBName=dngr
SQLUserID=sa
SQLPwd=sa
不胜感激,这里的分不够,我重开再加