所以我有这个代码来处理客户端在模式上发送的内容。如果他发送'getBENUds',服务器使用SaveToString方法返回该表的DataSet。
然后,将其发送给客户端。 (我正在使用Synapse)。
procedure TTCPSocketThrd.Execute;
var s: String;
strm: TMemoryStream;
ADO_CON: TADOConnection;
ADO_QUERY: TADOQuery;
DS_PROV: TDataSetProvider;
DS_CLIENT: TClientDataSet;
begin
CoInitialize(nil);
Sock := TTCPBlockSocket.Create;
try
Sock.Socket := CSock;
Sock.GetSins;
with Sock do
begin
repeat
if terminated then break;
s := RecvTerminated(60000,'|');
if s = 'getBENUds' then
begin
//ini ADO_CON
ADO_CON := TADOConnection.Create(Form1);
ADO_CON.ConnectionString := 'not for public';
ADO_CON.LoginPrompt := false;
ADO_CON.Provider := 'SQLOLEDB.1';
ADO_CON.Open;
//ini ADO_QUERY
ADO_QUERY := TADOQuery.Create(ADO_CON);
ADO_QUERY.Connection := ADO_CON;
//ini DS_PROV
DS_PROV := TDataSetProvider.Create(ADO_CON);
DS_PROV.DataSet := ADO_QUERY;
//ini DS_CLIENT
DS_CLIENT := TClientDataSet.Create(ADO_CON);
DS_CLIENT.ProviderName := 'DS_PROV';
//SQLQUERY Abfrage
ADO_QUERY.SQL.Clear;
ADO_QUERY.SQL.Add('SELECT * FROM BENU');
ADO_QUERY.Open;
//DSCLIENTDATASET bauen
strm := TMemoryStream.Create;
DS_CLIENT.Open;
DS_CLIENT.SaveToStream(strm);
end
else if s = 'getBESTEds' then
...
它说的行:DS_CLIENT.Open引发异常:
抛出异常:类EDatabaseError。文字:'缺少数据提供者或数据包'。
数据提供程序已设置为上面的“DS_PROV”,因此它必须是缺少的数据包。
但是ClientDataSet不应该从DataSetProvider获取数据,而DataSetProvider又从从数据库获取数据的ADOQuery中获取数据吗?
据我所知,这是我的知识水平。我希望它不会太难,因为在我看来,我所做的一切都是正确的。
答案 0 :(得分:3)
使用
DS_CLIENT.SetProvider(DS_PROV);
或创建DS_PROV之后:(此时您的组件确实没有名称)
DS_PROV.name := 'DS_PROV';