德尔福:ClientDataSet的:EDatabaseError上。开;用的ProviderName集
-
13-09-2019 - |
题
所以我具有该代码,其处理什么客户端发送上形成图案。如果他发送“getBENUds”,服务器发送数据集用于该表背使用SaveToString方法。
然后,将其发送到客户端。 (我使用突触)。
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的这反过来又得到它从从数据库中获取数据的ADOQuery的数据?
这是据我得到我的知识水平。我希望这不是太困难,因为在我的眼前,我所做的一切是正确的。
解决方案
使用
DS_CLIENT.SetProvider(DS_PROV);
或DS_PROV创建后:(此时你的组件有真的没有名字)
DS_PROV.name := 'DS_PROV';
不隶属于 StackOverflow