2013-10-23 28 views
0

我有以下代码:实体框架ExecuteSQLCommand返回XML字符串

_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_ [一些GUID]值。

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

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

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

感谢

回答

0

通过在查询中指定FOR XML条款您检索一个SQL查询的结果为SQL Server XML datatype,而不是字符串

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

查询需要Database.SqlQuery。它将返回给定类型的元素,但xml不是原始类型,因此它不会与查询一样工作。如果您需要xml,请将sql server中的查询返回的xml序列化为字符串,或者除去FOR XML子句并创建一个类型为匹配从查询返回的列名称的类型。然后将在C#代码中创建的实例序列化为xml。

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的语句中使用。

简单!