0

次のコードがあります。

_sql += "SELECT [CodeListNumber] as '@Number'"
_sql += "      ,[ShortDescription]"
_sql += "      ,[ExpiryDate]"
_sql += "      ,[CompositeCode]"
_sql += "  FROM [Aviva_Guidewire_Dev_V3].[dbo].[Aviva_CompleteCodeList] as [CodeListNumber]"
_sql += "  order by [CodeListNumber]"
_sql += "  for xml path('CodeList'), root('CodeLists'), elements"

Dim params As String()
Dim _Rtn As String = _dbRoot.Database.ExecuteSqlCommand(_sql, params)
Dim _xDoc As New XmlDocument
_xDoc.LoadXml(_Rtn)

上記の SQL ステートメントを SSMS で直接実行すると、XML_[some guid] という値が返されます。

VS 2012 内でコードを実行すると、値 _Rtn は -1 になり、それだけが得られます。ExecuteSQLCommand は parms 配列を持つことができますが、この場合何をすべきかわかりません。

コードをストアド プロシージャに変更して呼び出す必要がありますか?

または、Linq to Entities または Linq to SQL を使用して同じコードを作成する方法を教えてもらえますか。

ありがとう

4

2 に答える 2

0

興味のある他の人のための解決策を見つけました。

SQL をストアド プロシージャに直接移動しました。

CREATE PROCEDURE [dbo].[CompleteListofCodes]
    -- Add the parameters for the stored procedure here
    -- <@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    -- <@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
SELECT [CodeListNumber] as '@Number'
      ,[ShortDescription]
      ,[ExpiryDate]
      ,[CompositeCode]
  FROM [DB_V3].[dbo].[CompleteCodeList] as [CodeListNumber]
  order by [CodeListNumber]
  for xml path('CodeList'), root('CodeLists'), elements

END

次に、EF モデルに関数を追加した後、ストアド プロシージャを呼び出します。

Dim _Rtn As String() = _dbRoot.CompleteListofCodes().Array
Dim _BuildXML as string =Nothing
For Each _Element as string in _Rtn
    _BuildXML += _Element.ToString()
Next
Dim _xDoc As New XmlDocument
_xDoc.LoadXml(_BuildXML)

返される配列文字列には 2K の制限があるように見えるので、それらを連結して、LoadXML ステートメントで使用する最終的な文字列を生成します。

シンプル!

于 2013-10-25T11:46:20.990 に答える