2012-05-02 4 views
6

私は受信トレイに上位5つの電子メールを返し、データグリッドに表示するWebサービスがあります。最初に私のデータをDataTableに入れました。しかし、エラーを続ける[WebMethod]でデータテーブルを返す方法

ここに私のコードは、私は何かが不足しているか間違って何かを宣言していますか?

[WebMethod] 
    public DataTable DisplayMailList(String inMailServer, String inPort, bool inSSlCheck, String inUsername, String inPassword) 
    { 
     objClient.Connect(inMailServer, int.Parse(inPort), inSSlCheck); 
     objClient.Authenticate(inUsername, inPassword); 

     int count = objClient.GetMessageCount(); 

     DataTable dtMessages = new DataTable(); // Creating datatable. 
     dtMessages.Columns.Add("MessageNumber"); 
     dtMessages.Columns.Add("From"); 
     dtMessages.Columns.Add("Subject"); 
     dtMessages.Columns.Add("DateSent"); 
     dtMessages.TableName = "dtMessages"; 

     int counter = 0; 
     for (int i = count; i >= 1; i--) 
     { 
      OpenPop.Mime.Message msg = objClient.GetMessage(i); 

      dtMessages.Rows.Add(); 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["MessageNumber"] = i; //Populateing Datatable 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["Subject"] = msg.Headers.Subject; 
      dtMessages.Rows[dtMessages.Rows.Count - 1]["DateSent"] = msg.Headers.DateSent; 

      counter++; 
      if (counter > 5) 
      { 
       break; 
      } 
     } 
     return dtMessages; 
    } 

私はそれをオブジェクトとして宣言されていますが、それは、エーテルを動作しませんでしたのDataTable ....ため息、私はとしてそれを宣言すべき問題が公開されていると思いますか?
これは誤りです....

のSystem.InvalidOperationException: XMLドキュメントを生成中にエラーが発生しました。 ---> System.InvalidOperationException: DataTableをシリアル化できません。 DataTable名が設定されていません。

+1

Aを作成するときにテーブル名だけを与えます[WebMethod]は静的にする必要があります。エラーには名前が割り当てられていないと表示されています...名前を割り当ててみてください(例: DataTable.TableName = "MyTable")。 – Zachary

+1

データ型の使用をやめて強く型付けされたオブジェクトを使用すると、長期的にはより良い状態になります。 –

答えて

12

dtMessages.DataTableに値を割り当てると、エラーメッセージが示すように、シリアル化エラーが停止します。

[WebMethod] 
    public DataTable GetDataTable() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("Col1", typeof(string)); 
     dt.Rows.Add("testing"); 
     dt.TableName = "Blah"; // <--- 
     return dt; 
    } 

しかし、Bob Horn氏によると、戻り値のクラスを定義する方がDataTableを使用する方がよいという意見に同意します。

+1

これは、ASP.NET AJAX WebMethodであると仮定しています。それが古典的なASP.NET Webサービスの場合は、静的にすることはできません... –

+0

実際に静的かどうか、古典的なASPかどうかは、この答えには関係ありません。要は、 "Add' dt.TableName = 'Blah'; '"と言うだけでした。私はあなたの意見が気に散らばっていると思います。 – vapcguy

+0

私のコメントはそれまで削除されていた以前のコメントに対する回答でした。以前のコメントは、メソッドのシグネチャに "static"キーワードを含めていないという事実に問題がありました。 –

0

これが私の仕事:あなたのアプリケーションで

あなたのサービス

 DataTable dtOutput= new DataTable(); 
     [WebMethod] 
     public void TestService(DataTable dtInput , ref DataTable dtOutput) 
     { 
     DataRow drRow; 
     drRow= dtInput.NewRow(); 
     drRow["ID"] = 2; 
     drRow["Name"] = "Success"; 
     dtInput.Rows.Add(drRow); 
     dtOutput= dtInput; 
     } 
5

 public void app() 
     { 
     try 
     { 
      DataTable dtInput = new DataTable(); 
      DataRow drRow; 
      dtInput.Columns.Add("ID"); 
      dtInput.Columns.Add("Name"); 
      drRow = dtInput.NewRow(); 
      drRow["ID"] = 1; 
      drRow["Name"] = "Star"; 
      dtInput.Rows.Add(drRow); 
      dtInput.TableName = "Input";//Table name is mandatory to avoid serialization exception 
      DataTable dtOutput = new DataTable(); 
      dtOutput.TableName = "Output";//Table name is mandatory to avoid serialization exception 
      service.TestService(dtInput ,ref dtOutput); 
     } 
     catch (Exception ex) 
     { 
     } 
     } 

をDataTableオブジェクト

DataTable dt = new DataTable("tablename"); 
関連する問題