【发布时间】:2014-02-27 11:05:15
【问题描述】:
我有一个无法解决的难题和一个一般性问题:我正在解析来自供应商的 XML 文件,但无法修改 API 输出。感谢这里所有出色的人,我设法编写代码以将数据转储到 SQL Server 2008 R2 中。我不知道如何完成的一件事是将<date> 节点从其当前形式转换为datetime2(或您可以推荐的任何datetime 格式)。我尝试了许多不同的方法,每一种都比前一次失败得更惨。
我得到的错误是
将数据类型 nvarchar 转换为 datetime2 时出错
另外,我认为必须有一种更简单的方法来循环遍历子节点。还有 15 个文本字段,如果我可以让 SQL 服务器以某种方式完成繁重的工作,我是否应该能够遍历每个子注释并将名称/值对作为字符串参数发送?
提前致谢。
XML:
<results>
<result>
<title>Application Developer</title>
...
<date>Thu, 30 Jan 2014 14:09:00 GMT</date>
<expired>false</expired>
</result>
sp:
INSERT INTO dbo.StaffWriteImport
(
title ,
...
jbdate ,
expired
)
VALUES
(
@title ,
...
@jbdate ,
CAST(CASE @expired WHEN 1 THEN 1 ELSE 0 END AS BIT)
)
C#:
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
string responseFromServer = reader.ReadToEnd();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(responseFromServer);
XmlNodeList Xn = xmlDoc.SelectNodes("//response/results/result");
using (SqlConnection conn = new SqlConnection("data source=myconnectionstring yada yada yada;"))
using (SqlCommand cmd = new SqlCommand(sqlStmt, conn))
{
foreach (XmlNode xnode in Xn)
{
XmlElement resultElement = (XmlElement) xnode;
conn.Open();
cmd.CommandType = CommandType.StoredProcedure;
if(!string.IsNullOrEmpty(resultElement.GetElementsByTagName("title")[0].InnerText))
{ cmd.Parameters.AddWithValue("title", resultElement.GetElementsByTagName("title")[0].InnerText); }
...
if (!string.IsNullOrEmpty(resultElement.GetElementsByTagName("date")[0].InnerText))
{ var dateformat = "yyyy-MM-dd HH:mm:ss:fff";
cmd.Parameters.AddWithValue("jbdate", resultElement.GetElementsByTagName("date")[0].InnerText); }
if (!string.IsNullOrEmpty(resultElement.GetElementsByTagName("expired")[0].InnerText))
{
int exprd = 0;
if (resultElement.GetElementsByTagName("expired")[0].InnerText == "true") { exprd = 1; }
cmd.Parameters.AddWithValue("expired", exprd) ; }
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
conn.Close();
}
}
}}}
【问题讨论】:
-
你没有对你的 dateFormat 变量做任何事情,你只是创建它。这可能是一个问题。还使用 XDocument 将使代码更漂亮/更易于使用。最后,如果要插入大量这些结果,请考虑使用 TVP(表值参数)。您将创建一个包含所有结果的 DataTable 并将整个内容传递给 SP。
-
这是我混淆示例中的一个错字。实际上,我已经尝试过无数种不同的方式。
-
谢谢大卫。您能否指出一个与我正在做的类似的 XDocument 示例?我自己找不到任何例子。谢谢
-
你运行的是什么版本的sql server?
-
问题中说的是 SQL 2008 R2...
标签: c# sql sql-server xml