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)

如果我直接在 SSMS 中运行上述 SQL 语句,它会返回一个名为 XML_[some guid] 的值。

当我在 VS 2012 中运行代码时,值 _Rtn 是 -1,这就是我得到的全部。我可以看到 ExecuteSQLCommand 可以有一个 parms 数组,但我不确定在这种情况下我应该做什么。

我应该将代码更改为存储过程并调用它吗?

或者有人可以告诉我如何使用 Linq to Entities 或 Linq to SQL 创建相同的代码。

谢谢

4

2 回答 2

0

通过在查询中指定FOR XML子句,您可以将 SQL 查询的结果检索为 Sql Server XML 数据类型,而不是字符串

Database.ExecuteSqlCommand执行用于创建或修改数据库结构或插入、删除和更新数据的命令。即不查询。

对于查询,您需要Database.SqlQuery。它将返回给定类型的元素,但 xml 不是原始类型,因此它不能与当前的查询一起使用。如果您需要 xml,请将 sql server 中的查询返回的 xml 序列化为字符串,或者删除 FOR XML 子句并创建一个具有与查询返回的列的名称匹配的属性的类型。然后将C#代码中创建的实例序列化为xml。

于 2013-10-23T11:43:38.517 回答
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 回答