【发布时间】:2017-01-13 04:36:40
【问题描述】:
具有以下配置: 德尔福XE7 微软 SQL 服务器 2008 使用 FireDAC 连接到 SQL 服务器
我正在使用存储过程来检索表,其中包含来自 SQL 服务器的所有详细记录,以 XML 格式转换为 nvarchar(max)。这是一个例子:
CREATE PROCEDURE uspUsers_GetAll
@ReturnData nvarchar(max) = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @ReturnData = CONVERT(nvarchar(max),
(SELECT *, ( SELECT UserID, RightType
FROM UserRights
WHERE UserRights.UserID = Users.ID
FOR XML RAW('UserRight'),
ROOT('UserRights'), ELEMENTS, TYPE)
FROM Users
FOR XML RAW('Users'),
ROOT('root') , ELEMENTS));
END;
在 Delphi 方面,我调用这个存储过程,将其加载到 XML 中,然后我尝试解析它以便将其转换为本地对象列表。像这样的:
procedure TUsers.LoadFromDatabase;
var
usersXML: String;
xmlDoc: IXMLDocument;
workNode: IXMLNode;
userObj: TUser;
begin
Items.Clear;
with dmApp.uspWork do
begin
Close;
if Prepared then
Prepared := False;
Params.Clear;
StoredProcName := 'uspUsers_GetAll';
Prepare;
ExecProc;
end;
usersXML := dmApp.uspWork.Params.ParamByName('@ReturnData').Value;
xmlDoc := TXMLDocument.Create(nil);
xmlDoc.LoadFromXML(usersXML);
workNode := xmlDoc.DocumentElement;
workNode := workNode.ChildNodes.FindNode('Users');
while (workNode <> nil) and (workNode.NodeName = 'Users') do
begin
userObj := TUser.Create;
userObj.LoadFromXMLNode(workNode);
Items.Add(userObj);
workNode := workNode.NextSibling;
end;
end;
在上面的代码中
workNode := workNode.ChildNodes.FindNode('Users');
line 在 Xml.XMLDoc 单元深处的某处返回异常。不是我可以修复的特定问题的错误消息。确实尝试将 xmlDoc 保存到 xml 文件中,它看起来不错(可以使用 Firefox 等各种工具打开它)。
奇怪的是,如果我将 @ReturnData 更改为 varchar(max),我将不再收到此错误。
知道我做错了什么吗?
【问题讨论】:
标签: sql-server xml delphi nvarchar firedac