[英]Conversion failed when converting datetime from character string. Linq To SQL & OpenXML
I been following this tutorial on how to do a linq to sql batch insert. 我一直在按照本教程讲解如何对SQL批处理插入linq。
http://www.codeproject.com/KB/linq/BulkOperations_LinqToSQL.aspx http://www.codeproject.com/KB/linq/BulkOperations_LinqToSQL.aspx
However I have a datetime field in my database and I keep getting this error. 但是,我的数据库中有一个datetime字段,并且不断出现此错误。
System.Data.SqlClient.SqlException was unhandled Message="Conversion failed when converting datetime from character string." “ System.Data.SqlClient.SqlException未处理Message =”从字符串转换日期时间时转换失败。“ Source=".Net SqlClient Data Provider" Source =“。Net SqlClient数据提供程序”
ErrorCode=-2146232060 Class=16 ErrorCode = -2146232060类= 16
LineNumber=7 Number=241 LineNumber = 7数字= 241
Procedure="spTEST_InsertXMLTEST_TEST" Server="" State=1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) Procedure =“ spTEST_InsertXMLTEST_TEST” Server =“” State = 1 StackTrace:位于System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)处于System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔值BreakConnection),位于System.Data。 SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
I am not sure why when I just take the datetime in the generated xml file and manually copy it into sql server 2005 it has no problem with it and converts it just fine. 我不确定为什么当我只将生成的xml文件中的datetime并手动将其复制到sql server 2005时,它就没有问题并将其转换为正常。
This is my SP 这是我的SP
CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData nText)
AS
DECLARE @hDoc int
exec sp_xml_preparedocument @hDoc OUTPUT,@UpdatedProdData
INSERT INTO UserTable(CreateDate)
SELECT XMLProdTable.CreateDate
FROM OPENXML(@hDoc, 'ArrayOfUserTable/UserTable', 2)
WITH (
CreateDate datetime
) XMLProdTable
EXEC sp_xml_removedocument @hDoc
C# code C#代码
using (TestDataContext db = new TestDataContext())
{
UserTable[] testRecords = new UserTable[1];
for (int count = 0; count < 1; count++)
{
UserTable testRecord = new UserTable()
{
CreateDate = DateTime.Now
};
testRecords[count] = testRecord;
}
StringBuilder sBuilder = new StringBuilder();
System.IO.StringWriter sWriter = new System.IO.StringWriter(sBuilder);
XmlSerializer serializer = new XmlSerializer(typeof(UserTable[]));
serializer.Serialize(sWriter, testRecords);
db.spTEST_InsertXMLTEST_TEST(sBuilder.ToString());
}
Rendered XML Doc 呈现的XML文档
<?xml version="1.0" encoding="utf-16"?>
<ArrayOfUserTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserTable>
<CreateDate>2010-05-19T19:35:54.9339251-07:00</CreateDate>
</UserTable>
</ArrayOfUserTable>
OK, couple of things: 好,几件事:
First: if you're using the XML datatype, you must be on SQL Server 2005 or newer, right? 第一:如果您使用的是XML数据类型,则必须使用SQL Server 2005或更高版本,对吗?
Hint: stop using NTEXT
as a data type! 提示:停止使用NTEXT
作为数据类型! NOW! 现在! So instead of (@UpdatedProdData nText)
you should definitely use (@UpdatedProdData NVARCHAR(MAX))
因此,您绝对应该使用(@UpdatedProdData NVARCHAR(MAX))
而不是(@UpdatedProdData nText)
(@UpdatedProdData NVARCHAR(MAX))
Secondly - if you're already using SQL Server 2005 and XQuery, I would definitely rewrite that stored procedure to not use OPENXML and all those methods - those are deprecated and not really needed. 其次,如果您已经在使用SQL Server 2005和XQuery,那么我肯定会重写该存储过程,以不使用OPENXML和所有这些方法-这些已被弃用,并不是真正需要的。 Try this instead: 尝试以下方法:
CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData NVARCHAR(MAX))
AS BEGIN
DECLARE @InputData XML
SET @InputData = CAST(@UpdatedProdData AS XML)
INSERT INTO
dbo.UserTable(CreateDate)
SELECT
@InputData.value('(/ArrayOfUserTable/UserTable/CreateDate)[1]', 'DATETIME')
You can make this even easier if you pass in a thing of datatype XML directly: 如果直接传递数据类型为XML的东西,则可以使此过程变得更加容易:
CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData XML)
AS
INSERT INTO
dbo.UserTable(CreateDate)
SELECT
@UpdatedProdData.value('(/ArrayOfUserTable/UserTable/CreateDate)[1]', 'DATETIME')
Try it! 试试吧!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.