C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 151 を表示中)
■87943 / )  Re[2]: Webサービスからのタグなし項目を取得時の挙動
□投稿者/ 雪だるま (2回)-(2018/07/17(Tue) 01:09:42)
WebSurferさん
PANG2さん

返信が遅くなり申し訳ございません。
また、情報と前提が抜けているようで本当に申し訳ございません。

開発環境の情報と現状の処理イメージを追加させていただきます。

【前提】
Webサービス側のソースは提供してもらえない。
Webサービスは他社が提供しているため修正は難しい
→Webサービス側としては、タグなしとタグありで見分けられる筈だとのことです。

バージョン
OS:Windows10
.NET:NET Framework 3.5
IIS:IIS10.0
ブラウザ:IE11(エンタープライズモード(IE8互換))

-----レスポンスイメージ(通常時)-----
<tns:Status>
<tns:Status_Code>000</tns:Status_Code>
</tns:Status>
<tns:RESPONSE>
<tns:STR1>hoge</tns:STR1>
<tns:LNG1>1000</tns: LNG1>
<tns:LNG2>2000</tns:LNG2>
</tns:RESPONSE>
-------------------------------------------------------

-----レスポンスイメージ(STR1、LNG2がタグなし)-----
<tns:Status>
<tns:Status_Code>000</tns:Status_Code>
</tns:Status>
<tns:Response>
<tns:LNG1>1111</tns:LNG1>
</tns:Response>
-------------------------------------------------------

----------------------WSDL(抜粋)--------------------
<xsd:element minOccurs="0" name="STR1" type="xsd:string" />
<xsd:element minOccurs="0" name="LNG1" type="xsd:long" />
<xsd:element minOccurs="0" name="LNG2" type="xsd:long" />
<xsd:element minOccurs="0" name="LNG3" type="xsd:long" />
-------------------------------------------------------
---------------------------ソース(抜粋)---------------------------
'検索条件の設定
Dim result As New HogeSystem.HogeSerch.HogeSerch応答
sercInput(0) = New App_HogeSerch.HogeSerchRequestInput()
sercInput(0).KEY = 12345

’検索処理
result = webService.HogeSerch(sercInput)

'検索結果の取得
Dim str1 As Object = result.HogeSystem(0).SERCH_HOGE(0).STR1)
Dim lng1 As Object = result.HogeSystem(0).SERCH_HOGE(0).LNG1)
'タグあり:2000、タグなし:0が取得されている
Dim lng2 As Object = result.HogeSystem(0).SERCH_HOGE(0).LNG2)

’Nullの置換処理
If str1 Is Nothing Then
str1 = "N/A"
End If

If lng1 Is Nothing Then
lng1 = "N/A"
End If

If lng2 Is Nothing Then
lng2 = "N/A"
End If
----------------------------------------------------------------------------

No87920 (WebSurfer さん) に返信
> ■No87907 (雪だるま さん) に返信
>>環境はVisual Studio 2010でVBです。
>
> PANG2 さんのレスから想像を膨らませてみました。
>
> xml 上で NULL を表すのが既定では要素が存在しないということになるそうですが、それを「Web
> サービスからタグなしで返却」と言っていたのだと理解します。
>
> 以下の Web サービスの GetLong メソッドの戻り値は long? 型でこの例では null を返します。
> GetDataTable は SQL Server DB のテーブルの全レコードを DataTable に取得して返しますが、
> その最初のレコードの CategoryID が NULL になっています。
>
> <%@ WebService Language="C#" Class="NorthwindProductsWebService" %>
>
> using System;
> using System.Web;
> using System.Web.Services;
> using System.Web.Services.Protocols;
> using NorthwindProducts;
> using NorthwindProducts.ProductsDataSetTableAdapters;
>
> [WebService(Namespace = "http://tempuri.org/")]
> [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
> public class NorthwindProductsWebService : System.Web.Services.WebService
> {
> [WebMethod]
> public long? GetLong()
> {
> return null;
> }
>
> [WebMethod]
> public ProductsDataSet.ProductsDataTable GetDataTable()
> {
> ProductsDataSet.ProductsDataTable datatable = new ProductsDataSet.ProductsDataTable();
> ProductsTableAdapter adapter = new ProductsTableAdapter();
> adapter.Fill(datatable);
> return datatable;
> }
> }
>
> それをクライアント側のアプリで取得すると GetLong は null を返しますので null が返ってき
> たら "N/A" と表示すれば良いはずです。
>
> GetDataTable は DataTable を返しますが、DB で NULL になっているとその行・列のデータは
> DBNull 型になっているので、その場合は "N/A" とすればよいはずです。
>
> 以下のその例を示します。
>
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;
> using System.Threading.Tasks;
> using System.Data;
>
> namespace ConsoleAppWebService
> {
> class Program
> {
> static void Main(string[] args)
> {
> ServiceReference1.NorthwindProductsWebServiceSoapClient client =
> new ServiceReference1.NorthwindProductsWebServiceSoapClient();
>
> long? value = client.GetLong();
> Console.WriteLine("Result of GetLong: {0}", (value == null) ? "N/A" : value.ToString());
>
> ServiceReference1.ProductsDataSet.ProductsDataTable table = client.GetDataTable();
> for (int i = 0; i < 5; i++)
> {
> string categoryId = (table[i][table.CategoryIDColumn] is DBNull) ?
> "N/A" : table[i][table.CategoryIDColumn].ToString();
>
> Console.WriteLine("Name: {0}, SupplierID: {1}, CategoryID: {2}",
> table[i].ProductName, table[i].SupplierID, categoryId);
> }
>
> // 結果は:
> // Result of GetLong: N/A
> // Name: Chai, SupplierID: 1, CategoryID: N / A
> // Name: Chang, SupplierID: 1, CategoryID: 1
> // Name: Aniseed Syrup, SupplierID: 1, CategoryID: 2
> // Name: Chef Anton's Cajun Seasoning, SupplierID: 2, CategoryID: 2
> // Name: Chef Anton's Gumbo Mix, SupplierID: 2, CategoryID: 2
> }
> }
> }
返信 編集キー/


管理者用

- Child Tree -