我有以下代码:
_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创建相同的代码。
由于
答案 0 :(得分:0)
通过在查询中指定FOR XML子句,您将SQL查询的结果检索为Sql Server XML datatype,而不是字符串
Database.ExecuteSqlCommand执行用于创建或修改数据库结构或插入,删除和更新数据的命令。即不查询。
对于您需要的查询Database.SqlQuery。它将返回给定类型的元素,但xml不是基本类型,因此它不能与查询一起使用。如果需要xml将sql server中的查询返回的xml序列化为字符串,或者删除FOR XML子句并创建一个类型,其属性与查询返回的列的名称相匹配。然后将在C#代码中创建的实例序列化为xml。
答案 1 :(得分: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语句中使用的最终字符串。
Simples!