3

SQLServer2012データベースでジョブを実行する複数の機能を備えたWebサービスがあります。私の目的は、このWebサービス機能を使用してデータベースを選択して挿入するWindowsサービスを用意することです。

現在のWebサービスには、ブール値、文字列、または文字列のリストを返すさまざまな関数タイプがあります。Windowsフォームから文字列getGames()のリストを返す関数を呼び出す場合を除いて、すべてが正常に機能します。(WindowsサービスのレプリカとしてのWindowsフォーム)

エラー:タイプ「オブジェクトの1次元配列」の値を「System.collections.generic.list(OfString)」に変換できません

Windowsフォームプロジェクトから、Webサービスを追加しました-[サービス参照の追加]>[詳細設定]>[Web参照の追加]。私はまだ学生なので、Webサービスの経験はあまりありません。WindowsサービスはFramework3.5で作成され、WindowsフォームはFramework 4.5で作成されます(これが違いを生むかどうかはわかりません)エラー:

listOfGames = ws.getGames("username123", "password123") '** Error Here

これがWebサービス機能です

<WebMethod()> _
Public Function getGames(ByVal username As String, ByVal password As String) As List(Of String)
    Dim m As DBMember = DBMember.verifyUsername(username, password)
    If m IsNot Nothing Then
        Dim gList As New List(Of String)
        gList = DBGame.selectAllGames()
        Return gList
    End If
    Return Nothing
End Function

これが私がWebサービス関数を呼び出す方法です:

    Private Sub onStart()
    Dim ws As localhost.Service1 = New localhost.Service1
    listOfGames = ws.getGames("username123", "password123") '** Error Here
End Sub

クエリは次のとおりです。

 Shared Function selectAllGames() As List(Of String)
    Dim cmd As New SqlCommand
    cmd.CommandText = "SELECT g_Exe FROM Game"
    cmd.Connection = DB.Conn()

    Dim rdr As SqlDataReader = cmd.ExecuteReader()
    Dim gList As New List(Of String)

    If rdr.HasRows Then
        While rdr.Read
            gList.Add(rdr.Item("g_Exe").ToString())
        End While
    End If

    DB.CloseDB()
    Return gList
End Function
4

1 に答える 1

3

これが発生する理由は、Webサービスが実際の.NETListオブジェクトを返さず、リストの標準のSOAP形式を使用してリストのXML表現を返すだけだからです。そのため、クライアント側でデータを返すために使用されるタイプは、クライアントのコードによって完全に決定されます。

Webサービスへの参照を追加すると、VisualStudioによってプロキシクラスが自動的に生成されます。プロキシクラスは、サーバー側で定義されたWebメソッドのクライアント側のレプリカです。ただし、リストの場合、クライアント側には、Webメソッドによって返された特定の.NETタイプのリストを知る方法がありません。それが知る限り、Webサービスは.NET言語で書かれていなかったかもしれません。したがって、プロキシクラスでデータを表す方法を任意に選択する必要があります。プロキシクラスで使用されるデフォルトのリストタイプは単純な配列です。

Webサービスへの参照が追加されたときに、それをWeb参照として追加した場合、リストに使用するタイプを指定するオプションは提供されません。 Web参照は、常にリストに配列を使用します。ただし、参照をサービス参照として追加する場合は、リストを表すためにプロキシクラスで使用されるタイプを変更できます。これを行うには、参照を追加するときに、[詳細設定]ボタンをクリックします。次に、[データ型]セクションで、コレクションの種類をからSystem.Arrayに変更しSystem.Collections.Generic.Listます。

配列を使用してプロキシクラスを離れるのに行き詰まっている場合でも、次のListように配列をに変換するだけで機能させることができます。

Dim listOfGames As New List(Of String)()
listOfGames.AddRange(ws.getGames("username123", "password123"))
于 2013-03-11T13:22:32.193 に答える