CLIENTDATASET的BUG!!!???(100分)

  • 主题发起人 主题发起人 eire
  • 开始时间 开始时间
E

eire

Unregistered / Unconfirmed
GUEST, unregistred user!
COMMANDTEXT如果是一般的‘SELECT * FROM TABLE1 '没什么错,加入
下列SQL语句出错,可SQL语句在SQL EXPLORE中可以执行!为何?
SELECT N.N, SUM(N.SL01) SL01,SUM(N.SL02)
SL02,SUM(N.SL03) SL03,SUM(N.SL04) SL04 , SUM(N.SL05)
SL05,SUM(N.SL06) SL06,SUM(N.SL07) SL07,SUM(N.SL08) SL08 ,
SUM(N.SL09) SL09,SUM(N.SL10) SL10,SUM(N.SL11) SL11,SUM(N.SL12) SL12 ,
SUM(N.JE01) JE01,SUM(N.JE02) JE02,SUM(N.JE03) JE03,SUM(N.JE04) JE04,
SUM(N.JE05) JE05,SUM(N.JE06) JE06,SUM(N.JE07) JE07,SUM(N.JE08) JE08, SUM(N.JE09) JE09,SUM(N.JE10) JE10,SUM(N.JE11) JE11,SUM(N.JE12) JE12, SUM(N.SLHJ) SLHJ,SUM(N.JEHJ) JEHJ FROM ( SELECT M.N, SUM(M.SL01) SL01,SUM(M.SL02) SL02,SUM(M.SL03) SL03,SUM(M.SL04) SL04 , SUM(M.SL05) SL05,SUM(M.SL06) SL06,SUM(M.SL07) SL07,SUM(M.SL08) SL08 , SUM(M.SL09) SL09,SUM(M.SL10) SL10,SUM(M.SL11) SL11,SUM(M.SL12) SL12 , SUM(M.JE01) JE01,SUM(M.JE02) JE02,SUM(M.JE03) JE03,SUM(M.JE04) JE04, SUM(M.JE05) JE05,SUM(M.JE06) JE06,SUM(M.JE07) JE07,SUM(M.JE08) JE08, SUM(M.JE09) JE09,SUM(M.JE10) JE10,SUM(M.JE11) JE11,SUM(M.JE12) JE12, 0 SLHJ,0 JEHJ FROM ( SELECT X.N,X.Y, DECODE(X.Y,'01',KPSL) SL01,DECODE(X.Y,'01',KPJE) JE01, DECODE(X.Y,'02',KPSL) SL02,DECODE(X.Y,'02',KPJE) JE02, DECODE(X.Y,'03',KPSL) SL03,DECODE(X.Y,'03',KPJE) JE03, DECODE(X.Y,'04',KPSL) SL04,DECODE(X.Y,'04',KPJE) JE04, DECODE(X.Y,'05',KPSL) SL05,DECODE(X.Y,'05',KPJE) JE05, DECODE(X.Y,'06',KPSL) SL06,DECODE(X.Y,'06',KPJE) JE06, DECODE(X.Y,'07',KPSL) SL07,DECODE(X.Y,'07',KPJE) JE07, DECODE(X.Y,'08',KPSL) SL08,DECODE(X.Y,'08',KPJE) JE08, DECODE(X.Y,'09',KPSL) SL09,DECODE(X.Y,'09',KPJE) JE09, DECODE(X.Y,'10',KPSL) SL10,DECODE(X.Y,'10',KPJE) JE10, DECODE(X.Y,'11',KPSL) SL11,DECODE(X.Y,'11',KPJE) JE11, DECODE(X.Y,'12',KPSL) SL12,DECODE(X.Y,'12',KPJE) JE12 FROM ( SELECT A.N N,A.Y Y, SUM(A.KPSL) KPSL,SUM(A.KPJE) KPJE FROM XSFPD_VIEW A GROUP BY A.N,A.Y ORDER BY A.N,A.Y) X ) M GROUP BY M.N UNION ALL SELECT DISTINCT A.N N , 0 SL01,0 SL02,0 SL03,0 SL04, 0 SL05,0 SL06,0 SL07,0 SL08, 0 SL09,0 SL10,0 SL11,0 SL12, 0 JE01,0 JE02,0 JE03,0 JE04, 0 JE05,0 JE06,0 JE07,0 JE08, 0 JE09,0 JE10,0 JE11,0 JE12, SUM(A.KPSL) SLHJ,SUM(A.KPJE) JEHJ FROM XSFPD_VIEW A GROUP BY A.N ) N GROUP BY N.N
 
注意他是字符串型,SQL语句要专程字符串。注意语句中原有的‘’
 
是什么错误呢?你可以把你的错误信息给贴出来吗
这样别人就可以更清楚的了解你的问题所在。
 
edatabase error with field 'y)' not found
说什么某字段没找到,可我的SQL语句中根本没有此字段,好象是被中断了
我最后用CLIENTDATASET的DATAREQUEST把SQL语句加入到服务端执行也报这个错。
可如果DEBUG 其SQL语句把其拷贝到QUERY1。SQL中去执行没问题!
 
//----------------------------
// 数据连接池
//
// 目的:加快数据库连接速度;增加客户端连接数
// write by lmy
// amend by lmy 2002-9-3
//----------------------------
unit Uni_Pooler;
interface
uses
ComObj, ActiveX, pSalesSvr_TLB, Classes, SyncObjs, Windows, DBTables,
SysUtils, Forms, ExtCtrls;
type
PRDM = ^TRDM;
TRDM = record
Intf: IcoSalesRMD;
InUse: Boolean;
end;

{
This is the pooler class.
}
TPooler = class(TAutoObject, IcoSalesRMD)
private
function LockRDM(): IcoSalesRMD;
procedure UnlockRDM(Value: IcoSalesRMD);
protected
{ IAppServer }
function AS_ApplyUpdates(const ProviderName: WideString;
Delta: OleVariant;
MaxErrors: Integer;
out ErrorCount: Integer;
var OwnerData: OleVariant): OleVariant;
safecall;
function AS_GetRecords(const ProviderName: WideString;
Count: Integer;
out RecsOut: Integer;
Options: Integer;
const CommandText: WideString;
var Params: OleVariant;
var OwnerData: OleVariant): OleVariant;
safecall;
function AS_DataRequest(const ProviderName: WideString;
Data: OleVariant): OleVariant;
safecall;
function AS_GetProviderNames: OleVariant;
safecall;
function AS_GetParams(const ProviderName: WideString;
var OwnerData: OleVariant): OleVariant;
safecall;
function AS_RowRequest(const ProviderName: WideString;
Row: OleVariant;
RequestType: Integer;
var OwnerData: OleVariant): OleVariant;
safecall;
procedure AS_Execute(const ProviderName: WideString;
const CommandText: WideString;
var Params: OleVariant;
var OwnerData: OleVariant);
safecall;
{
function Backup(const Fromdate, ToDate: WideString;
IFDel: WordBool): WordBool;
safecall;
}
public
end;

TPoolManager = class(TObject)
private
FMaxCount: Integer;
FTimeout: Integer;
FCriticalSection: TCriticalSection;
FSemaphore: THandle;
function GetLock(Index: Integer): Boolean;
procedure ReleaseLock(Index: Integer;
var Value: IcoSalesRMD);
public
FRDMList: TList;
constructor Create;
destructor Destroy;
override;
function CreateNewInstance: IcoSalesRMD;
function LockRDM(): IcoSalesRMD;
procedure UnlockRDM(var Value: IcoSalesRMD);
property Timeout: Integer read FTimeout;
property MaxCount: Integer read FMaxCount;
end;

var
PoolManager: TPoolManager;
implementation
uses ComServ, uni_Rmd, DataBkr, inifiles, Registry ;
constructor TPoolManager.Create;
begin
FRDMList := TList.Create;
FCriticalSection := TCriticalSection.Create;
FTimeout := 5000;
FMaxCount := 20;
FSemaphore := CreateSemaphore(nil, FMaxCount, FMaxCount, nil);
end;

destructor TPoolManager.Destroy;
var
i: Integer;
begin
FCriticalSection.Free;
for i := 0 to FRDMList.Count - 1do
begin
PRDM(FRDMList).Intf := nil;
FreeMem(PRDM(FRDMList));
end;
FRDMList.Free;
CloseHandle(FSemaphore);
inherited Destroy;
end;

function TPoolManager.GetLock(Index: Integer): Boolean;
begin
FCriticalSection.Enter;
try
Result := not PRDM(FRDMList[Index]).InUse;
if Result then
PRDM(FRDMList[Index]).InUse := True;
finally
FCriticalSection.Leave;
end;
end;

procedure TPoolManager.ReleaseLock(Index: Integer;
var Value: IcoSalesRMD);
begin
FCriticalSection.Enter;
try
PRDM(FRDMList[Index]).InUse := False;
Value:= nil;
ReleaseSemaphore(FSemaphore, 1, nil);
finally
FCriticalSection.Leave;
end;
end;

function TPoolManager.CreateNewInstance: IcoSalesRMD;
var
p: PRDM;
begin
FCriticalSection.Enter;
try
New(p);
p.Intf := RDMFactory.CreateComObject(nil) as IcoSalesRMD;
p.InUse := true;
FRDMList.Add(p);
Result := p.Intf;
finally
FCriticalSection.Leave;
end;
end;

function TPoolManager.LockRDM(): IcoSalesRMD;
var
i: Integer;
begin
Result := nil;
if WaitForSingleObject(FSemaphore, Timeout) = WAIT_FAILED then
raise Exception.Create('Server too busy');
for i := 0 to FRDMList.Count - 1do
begin
if GetLock(i) then
begin
Result := PRDM(FRDMList).Intf;
Exit;
end;
end;
if FRDMList.Count < MaxCount then
begin
Result := CreateNewInstance;
end;
if Result = nil then
{ This shouldn't happen because of the sempahore locks }
raise Exception.Create('Unable to lock RDM');
end;

procedure TPoolManager.UnlockRDM(var Value: IcoSalesRMD);
var
i: Integer;
begin
for i := 0 to FRDMList.Count - 1do
begin
if Value = PRDM(FRDMList).Intf then
begin
ReleaseLock(i,Value);
break;
end;
end;
end;

{
Each call for the server is wrapped in a call to retrieve the RDM, and then
when it is finished it releases the RDM.
}
function TPooler.LockRDM(): IcoSalesRMD;
begin
Result := PoolManager.LockRDM();
end;

procedure TPooler.UnlockRDM(Value: IcoSalesRMD);
begin
PoolManager.UnlockRDM(Value);
end;

function TPooler.AS_ApplyUpdates(const ProviderName: WideString;
Delta: OleVariant;
MaxErrors: Integer;
out ErrorCount: Integer;
var OwnerData: OleVariant): OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.AS_ApplyUpdates(ProviderName, Delta, MaxErrors, ErrorCount, OwnerData);
finally
UnlockRDM(RDM);
end;
end;

function TPooler.AS_DataRequest(const ProviderName: WideString;
Data: OleVariant): OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.AS_DataRequest(ProviderName, Data);
finally
UnlockRDM(RDM);
end;
end;

procedure TPooler.AS_Execute(const ProviderName, CommandText: WideString;
var Params, OwnerData: OleVariant);
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
RDM.AS_Execute(ProviderName, CommandText, Params, OwnerData);
finally
UnlockRDM(RDM);
end;
end;

function TPooler.AS_GetParams(const ProviderName: WideString;
var OwnerData: OleVariant): OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.AS_GetParams(ProviderName, OwnerData);
finally
UnlockRDM(RDM);
end;
end;

function TPooler.AS_GetProviderNames: OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.AS_GetProviderNames;
finally
UnlockRDM(RDM);
end;
end;

function TPooler.AS_GetRecords(const ProviderName: WideString;
Count: Integer;
out RecsOut: Integer;
Options: Integer;
const CommandText: WideString;
var Params,
OwnerData: OleVariant): OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
if Options=2 then
OwnerData:='';
Result := RDM.AS_GetRecords(ProviderName, Count, RecsOut, Options,
CommandText, Params, OwnerData);
finally
UnlockRDM(RDM);
end;
end;

function TPooler.AS_RowRequest(const ProviderName: WideString;
Row: OleVariant;
RequestType: Integer;
var OwnerData: OleVariant): OleVariant;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.AS_RowRequest(ProviderName, Row, RequestType, OwnerData);
finally
UnlockRDM(RDM);
end;
end;
{
function TPooler.Backup(const Fromdate, ToDate: WideString;
IFDel: WordBool): WordBool;
var
RDM: IcoSalesRMD;
begin
RDM := LockRDM();
try
Result := RDM.Backup(FromDate,ToDate,IFDel);
finally
UnlockRDM(RDM);
end;
end;
}
initialization
PoolManager := TPoolManager.Create;
TAutoObjectFactory.Create(ComServer, TPooler, CLASS_coSalesPooler, ciMultiInstance, tmFree);
EnableSocketTransport(GuidToString(CLASS_coSalesPooler));
finalization
PoolManager.Free;
// DisableSocketTransport(GuidToString(CLASS_FairDataService));
end.
 
不知是不是连接池的问题。
 
情况确实如此,ClientDataSet并不能正确解释所有的Sql语句,
我遇到过这样的问题,解决方法如下:
在数据库中建立ClientDataSet所需要的视图结构,然后ClientDataSet调用这个视图就可以了。
不单在[blue]ClientDataSet[/blue]上,[red]AdoDataSet[/red]我也遇到过这样的问题,可能Broland的DataSet确实存在某些问题。
 
BIGGO
谢谢你的回答,可我的上述SQL语句是动态生成的,不能用视图解决阿,
 
新年送分!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
861
import
I
I
回复
0
查看
636
import
I
后退
顶部