【发布时间】:2017-01-27 02:28:57
【问题描述】:
我正在使用 Consolibyte 提供的优秀 Quickbooks PHP 开发工具包,我正在将销售代表导入数据库。下面的代码是我对请求 xml 的代码。 Quickbooks 文件有超过 3000 名销售代表,并且响应 xml 无效。我知道我可以使用元数据来获取计数并使用 MaxReturned 来获取有限的记录。不确定是否在迭代器中?
我将 xml 传递给 mssql 数据库并在那里解析它。问题是当 xml 无效时,它会导致 sqlserver 在查询运行时挂起 - 所以我需要在将 xml 传递给 sql 之前以某种方式对其进行验证。
任何帮助将不胜感激。
$xml = '<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="' . $version . '"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<SalesRepQueryRq>
<ActiveStatus>ActiveOnly</ActiveStatus>
<FromModifiedDate>' . $last . '</FromModifiedDate>
<IncludeRetElement>ListID</IncludeRetElement>
<IncludeRetElement>SalesRepEntityRef</IncludeRetElement>
</SalesRepQueryRq>
</QBXMLMsgsRq>
</QBXML>';
return $xml;
----用下面的代码更新--- @keith - 感谢您抽出宝贵时间回复。以下是我的请求/响应功能
//sales rep list import request
function _quickbooks_salesrep_import_request($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $version, $locale)
{
$last = _quickbooks_get_last_run($user, $action); //get last run time
_quickbooks_set_last_run($user, $action); //set current run
// Build the request
$xml = '<?xml version="1.0" encoding="utf-8"?>
<?qbxml version="' . $version . '"?>
<QBXML>
<QBXMLMsgsRq onError="stopOnError">
<SalesRepQueryRq>
<ActiveStatus>ActiveOnly</ActiveStatus>
<FromModifiedDate>' . $last . '</FromModifiedDate>
<IncludeRetElement>ListID</IncludeRetElement>
<IncludeRetElement>SalesRepEntityRef</IncludeRetElement>
</SalesRepQueryRq>
</QBXMLMsgsRq>
</QBXML>';
return $xml;
}
//sales rep list import response
function _quickbooks_salesrep_import_response ($requestID, $user, $action, $ID, $extra, &$err, $last_action_time, $last_actionident_time, $xml, $idents)
{
global $conn;
$sql = '{call dbo.spQBAddUpdateSalesRep (?)}';
$params = array($xml);
$stmt = dbQuery($sql,$conn,$params);
dbCloseQuery($stmt);
//QuickBooks_Utilities::log(QB_QUICKBOOKS_DSN, 'rep xml - ' . $xml);
return true;
}
这是我在传递 xml 的存储过程中的内容
@strXML XML --- this is passed as parameter
BEGIN TRY
BEGIN TRANSACTION
UPDATE dbo.qb_salesrep SET
TimeCreated = SUB.TimeCreated
,TimeModified = SUB.TimeModified
,EditSequence = SUB.EditSequence
,Initial = SUB.Initial
,IsActive = SUB.IsActive
,SalesRepEntityRef_ListID = SUB.SalesRepEntityRef_ListID
,SalesRepEntityRef_FullName = SUB.SalesRepEntityRef_FullName
FROM
(SELECT
ListID = x.c.value('ListID[1]','VARCHAR(36)')
,TimeCreated = x.c.value('TimeCreated[1]','DATETIME')
,TimeModified = x.c.value('TimeModified[1]','DATETIME')
,EditSequence = x.c.value('EditSequence[1]','VARCHAR(16)')
,Initial = x.c.value('Initial[1]','VARCHAR(5)')
,IsActive = x.c.value('IsActive[1]','BIT')
,SalesRepEntityRef_ListID = x.c.value('SalesRepEntityRef[1]/ListID[1]','VARCHAR(36)')
,SalesRepEntityRef_FullName = x.c.value('SalesRepEntityRef[1]/FullName[1]','VARCHAR(41)')
FROM
@strXML.nodes('QBXML/QBXMLMsgsRs/SalesRepQueryRs/SalesRepRet') x(c)) AS SUB
WHERE
dbo.qb_salesrep.ListID = SUB.ListID
INSERT INTO dbo.qb_salesrep (
ListID
,TimeCreated
,TimeModified
,EditSequence
,Initial
,IsActive
,SalesRepEntityRef_ListID
,SalesRepEntityRef_FullName
)
SELECT
ListID = x.c.value('ListID[1]','VARCHAR(36)')
,TimeCreated = x.c.value('TimeCreated[1]','DATETIME')
,TimeModified = x.c.value('TimeModified[1]','DATETIME')
,EditSequence = x.c.value('EditSequence[1]','VARCHAR(16)')
,Initial = x.c.value('Initial[1]','VARCHAR(5)')
,IsActive = x.c.value('IsActive[1]','BIT')
,SalesRepEntityRef_ListID = x.c.value('SalesRepEntityRef[1]/ListID[1]','VARCHAR(36)')
,SalesRepEntityRef_FullName = x.c.value('SalesRepEntityRef[1]/FullName[1]','VARCHAR(41)')
FROM
@strXML.nodes('QBXML/QBXMLMsgsRs/SalesRepQueryRs/SalesRepRet') x(c)
WHERE
x.c.value('ListID[1]','VARCHAR(36)') NOT IN (SELECT ListID FROM dbo.qb_salesrep)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
RETURN
END CATCH
--所以发生的事情是从 quickbooks 返回的响应不是格式良好的 xml - 它最终被切断了。我猜是因为 xml 中的数据太多。因此,当这被传递给 sql 存储过程时 - 它会锁定插入/更新,因为它的 xml 格式不正确。所以我希望以某种方式验证 xml 并能够检索小块。
我使用 SalesRepQueryRq 中的元数据获得了总记录数。如果我在请求中将 MaxReturned 设置为 50,则一切正常。
这是来自网络连接器的消息
说明: QBWC1042:ReceiveResponseXML 失败 错误消息:操作已超时 有关详细信息,请参阅 QWCLog。记得开启登录功能。
我使用了 QUICKBOOKS_LOG_DEVELOP,最后几行是 接收响应XML()
Incoming XML response: <?xml version="1.0" ?> <QBXML> <QBXMLMsgsRs> <SalesRepQueryRs requestID="6" statusCode="0" statusSeverity="Info" statusMessage="Status OK"> <SalesRepRet> <ListID>31A0000-1193779738</ListID> <SalesRepEntityRef> <ListID>60F0002-1193780133</ListID> <FullName>*BRANDT'S</FullName> </SalesRepEntityRef> </SalesRepRet>
.....
.....
</Sales
xml 就是这样结束的
【问题讨论】:
-
发布您的代码。发布日志。发布确切的错误消息。我怀疑你严重误解了实际发生的事情,但你并没有真正发布足够的信息让任何人帮助你。
标签: sql-server xml quickbooks