- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个无法解决的难题和一个一般性问题:我正在解析来自供应商的 XML 文件,但无法修改 API 输出。感谢这里所有优秀的人,我设法编写了代码以将数据转储到 SQL Server 2008 R2 中。我不知道如何完成的一件事是转换 <date>
节点从它的当前形式到 datetime2
(或您可以推荐的任何 datetime
格式)。我尝试了很多不同的方法,每一种都比前一种尝试失败得更惨。
我得到的错误是
Error converting data type nvarchar to datetime2
另外,我认为必须有一种更简单的方法来遍历子节点。还有 15 个文本字段,如果我能让 SQL Server 以某种方式完成繁重的工作,我难道不能循环遍历每个子注释并将名称/值对作为字符串参数发送吗?
提前致谢。
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();
}
}
}}}
最佳答案
这是我的做法:
SQL
这里我只用了3列作为例子,你可以添加所有你需要的。
-- This is needed to use as a parameter in an SP
CREATE TYPE XmlResultType AS TABLE
(
Title varchar(50),
[Date] datetime2(7),
Expired bit
)
GO
-- Simple stored procedure just copies results from TVP into actual table
Create Procedure usp_InsertXmlResultsByTable
(
@XmlResultTable dbo.XmlResultType READONLY
)
As
Insert Into XmlResult
Select Title, [Date], Expired
From @XmlResultTable
和示例 C#:
请注意,我知道您正在调用 Web 服务,所以在我的示例中,假设 xml
变量是您的 Web 服务调用的结果。在这两种情况下,您都可以使用 XDocument.Parse(xml)
来创建 XDocument
对象。
string xml = @"
<results>
<result>
<title>Application Developer</title>
<date>Thu, 30 Jan 2014 14:09:00 GMT</date>
<expired>false</expired>
</result>
<result>
<title>Incomplete</title>
<date></date>
<expired></expired>
</result>
<result>
<title>Professional Time-waster</title>
<date>Fri, 31 Jan 2014 18:35:00 GMT</date>
<expired>false</expired>
</result>
</results>";
XDocument xDoc = XDocument.Parse(xml);
// Create a DataTable that mimics the Table Valued Parameter structure.
DataTable dt = new DataTable();
dt.Columns.Add("Title", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Expired", typeof(bool));
// Just make the code cleaner
Func<string, string> getString = s => string.IsNullOrEmpty(s) ? null : s;
Func<string, DateTime?> getDateTime = d => string.IsNullOrEmpty(d) ? null : (DateTime?)DateTime.Parse(d);
Func<string, bool?> getBool = b => string.IsNullOrEmpty(b) ? null : (bool?)Convert.ToBoolean(b);
// here we populate the table variable, using above Funcs<> to handle nulls
// This code does assume that your date format, when present, will always be parseable.
xDoc.Descendants("result")
.ToList()
.ForEach(r =>
dt.Rows.Add(
getString(r.Element("title").Value),
getDateTime(r.Element("date").Value),
getBool(r.Element("expired").Value)
)
);
// Now all that's left is to call the stored procedure and pass the DataTable to it
string connString = "your connection string";
using(var conn = new SqlConnection(connString))
using(var cmd = new SqlCommand())
{
conn.Open();
cmd.Connection = conn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "usp_InsertXmlResultsByTable";
SqlParameter tableParameter = cmd.Parameters.AddWithValue("XmlResultTable", dt);
tableParameter.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();
conn.Close();
}
这是一种略有不同的方法,但它的性能会更好,因为您只需为来自网络服务的整个 XML 负载调用一次数据库。我希望这对您有所帮助!
关于c# - 解析XML转sql参数,datetime2和bit问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536217/
我正在尝试使用以下方法对 datetime.datetime 对象列表求和: from datetime import datetime, timedelta d= [datetime.datetim
我正在尝试这个 (datetime.datetime.today()-datetime.datetime.today()).days 给出 -1 并期待值 0 而不是我得到 -1。在这种情况下,我将结
如果我列一个时间增量的列表,平均值比我对这些增量的微秒值求平均时要大。为什么会这样呢?。赠送。这是Linux上的Python3.8.10。
考虑以下片段: import datetime print(datetime.datetime.now() - datetime.datetime.now()) 在 x86_64 Linux 下的 P
如何在 SQLAlchemy 查询中比较 DateTime 字段和 datetime.datetime 对象? 例如,如果我这样做 candidates = session.query(User).f
我收到以下错误: type object 'datetime.datetime' has no attribute 'datetime' 在下面一行: date = datetime.datetime
尝试找出如何将当前日期锁定为变量,以从输入的 self.birthday 中减去。我已经查看了各种示例和链接,但无济于事......建议? from datetime import datetime
您好,我有一些 datetime.datetime 格式的日期,我用它们来过滤带有 Pandas 时间戳的 Pandas 数据框。我刚刚尝试了以下方法并获得了 2 小时的偏移量: from datet
如果您调用 datetime.datetime.now(datetime.timezone.utc) 您会得到类似 datetime.datetime(2021, 9, 8, 1, 33, 19, 6
我正在使用 pywin32 读取/写入 Excel 文件。我在 Excel 中有一些日期,以 yyyy-mm-dd hh:mm:ss 格式存储。我想将它们作为 datetime.datetime 对象
据我所知,自 Unix 纪元(1970-01-01 00:00:00 UTC)以来的秒数在全局各地应该是相同的,因为它固定为 UTC。 现在,如果您所在的时区有几个小时 +/- UTC,为什么这样做会
我正在尝试添加 datetime.datetime 和 datetime.time 以获得一列。我正在尝试结合: import datetime as dt dt.datetime.combine(m
我有一个脚本需要在脚本的不同行执行以下操作: today_date = datetime.date.today() date_time = datetime.strp(date_time_string
我在 AppEngine 上收到 type object 'datetime.datetime' has no attribute 'datetime' 错误,提示日期时间类型,但我的导入是 impo
所以我一直在使用 python 语言制作东西。我遇到了一些不太容易理解的错误: TypeError: 'datetime.datetime' object is not subscriptable (
当我运行时 from datetime import date, time, timedelta date(2012, 11, 1) + timedelta(0, 3600) 结果是 datetime
我的目标是转换 utc进入loc : use chrono::{Local, UTC, TimeZone}; let utc = chrono::UTC::now(); let loc = chron
假设您有一个 datetime.date 对象,例如 datetime.date.today() 返回的对象。 稍后您还会得到一个表示时间的字符串,它补充了日期对象。 在 datetime.datet
我试过了 In [16]: import datetime In [17]: now = datetime.datetime.utcnow() In [18]: isinstance(now, dat
我有以下代码并且收到上述错误。由于我是 python 新手,因此无法理解此处的语法以及如何修复错误: if not start or date < start: start = date 最佳答案 有
我是一名优秀的程序员,十分优秀!