Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

How I can use a TClientDataset (of VCL.NET) in a ASP.NET WebService.

Posted on 2006-07-14
9
1,622 Views
Last Modified: 2008-01-09
Hi Experts,

After days examining different ways to consume a ADO.NET dataset sent
by a webservice method, I found that article of DrBob (http://www.drbob42.com/examines/examin62.htm)
which gave the idea to use the ADONETConnector to take the data to ClientDataset and save it to a
XML string.
The code for the function is below:
 
function ObterXMLDataPacket(
  pADONET_Dataset: DataSet; pNumero_DataTable: Integer): String;
var Conector:TADONETConnector;
    Cds:TclientDataset;
    DSP:TDatasetProvider;
    St: TStringStream;
begin
  If pADONET_Dataset.Tables.Count = 0 then Exit;
  (*Cria os componentes necessários*)
  Cds := TClientDataSet.Create(nil);
  DSP := TDataSetProvider.Create(nil);
  St := TStringStream.Create;
  Conector := TADONETConnector.Create(nil);
  (*Conecta os componentes*)
  DSP.Dataset := Conector;
  Cds.SetProvider(DSP);
  Conector.DataTable := pADONET_Dataset.Tables[pNumero_DataTable];
  (*Obtém os dados*)
  Conector.Open;


  CDS.Open;  // Here the method throws the exception


  (*Transforma os dados em XML Datapacket*)
  Cds.SaveToStream(St,dfXML);
  Result := ST.DataString;
  (*Limpa o ambientes*)
  St.Free;
  Cds.Free;
  Conector.Free;
  DSP.Free;
end;

The function is used in a WebMethod which opens a BDPDataAdapter and calls the function with the Dataset
populated by the Adapter.

Here is the code:

function TCC_DataLayer.RetornaDatasetXMLDPacket: String;
begin
  BdpDataAdapter1.Active := True;
  Result := ObterXMLDataPacket(ds1,0);
end;

With the needed units (ADONetDb, System.Data, etc among a few other ones) - the WebService build without problems. But when the method is called, the execution is aborted with a exception (on the Win32 client, on the browser gave only a internal server error).

Here is the message of the Exception: "Servidor não pôde processar a solicitação. --> Invalid threading model (STAThreadAttribute is required)"

The first part is in Brazilian Portuguese and means: "Server could not process the request"

Here is the code where the WebMethod is called:
 
procedure TForm2.Button2Click(Sender: TObject);
var Comm:THTTPRIO;
begin
  Comm := THTTPRIO.Create(nil);
  WServico := GetTCC_DataLayerSoap(False,'http://localhost/CredCob_DataLayer/uCC_DataLayer.asmx',Comm);
  try
    ClientDataSet1.XMLData := WServico.RetornaDatasetXMLDPacket;
    ClientDataSet1.Open;
  except
  on E: Exception do
    begin
    With TStringList.Create do
      begin
      Add(E.Message);
      SaveToFile('c:\mensagemerro.txt');
      Free;
      end;
    end;
  end;
end;

 
Environment: Delphi 2006 Architect (Borland® Developer Studio for Microsoft® Windows™ Version 10.0.2288.42451 Update 2), IIS + ASP.NET 1.1.4322...
DataBase: MSSQL 2005 (just for the sake of completeness).

Best Regards and thank you very much for the attention,
Fabricio (Delphian)
0
Comment
Question by:Delphian
  • 4
  • 3
9 Comments
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 17114029
Have you tried this:

[STAThreadAttribute]
function TCC_DataLayer.RetornaDatasetXMLDPacket: String;
....
0
 
LVL 4

Author Comment

by:Delphian
ID: 17121919
You mean apply the attibute to the WebMethod? Does not work.
And even putting in  both (internal function and WebMethod), or
in one of them - does not work, the exception is thrown wherever
the attribute is located...

Any ideas?
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 17122930
[STAThread]
static void Main()
{
}

This way you change the Threading Model to Single Threaded.
0
Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

 
LVL 4

Author Comment

by:Delphian
ID: 17123337
No luck on this also...
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 17123779
No more ideas on my side... Sorry.
0
 
LVL 4

Author Comment

by:Delphian
ID: 17124499
I did some additional testing, the results are:

-> In a desktop Windows Forms: OK (no changes, no additional attributes needed)
-> In a desktop VCL.NET: OK (ditto above)

The great trouble is when ASP.NET Web Services come in scene. Seems a agreement
that someone needs to get a STAThread attrib... But is not the likely ones.

So, the 500 points question: WHERE I put the this 'lovely' attribute? Or is not an attribute
question?

Any comments?

(BTW: Thank you for the good will, Ivanov)
0
 
LVL 4

Author Comment

by:Delphian
ID: 17964054
I discovered later that it's reported on Borland Quality Central at
http://qc.borland.com/wc/qcmain.aspx?d=33679

And after that I forgot the question. It's a real shame.

Since I changed the implementation, there's no use for me the
workaround on the link, but I ask you just to mantain the question
on the DB - it can help others.

But I would like the refund.

0
 
LVL 1

Accepted Solution

by:
Computer101 earned 0 total points
ID: 17983746
PAQed with points refunded (500)

Computer101
EE Admin
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question