简体   繁体   English

从字符串转换日期时间时转换失败。 Linq To SQL和OpenXML

[英]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.

相关问题 SQL Server“从字符串转换日期和/或时间时转换失败。” 从 WinForm DateTimePicker 插入日期值时 - SQL Server 'Conversion failed when converting date and/or time from character string.' when inserting date values from WinForm DateTimePicker 从C#中的字符串转换日期时间时转换失败 - Conversion failed when converting datetime from character string in C# 从字符串转换日期和/或时间时,DateTime转换失败 - DateTime conversion failed when converting date and/or time from character string 从字符串转换日期时间时转换失败 - Conversion failed when converting datetime from character string 从字符串转换日期时间时转换失败 - Conversion failed when converting datetime from character string 从字符串DateTime转换日期和/或时间时转换失败 - Conversion failed when converting date and/or time from character string DateTime 从字符串转换日期时间时转换失败 - Conversion failed when converting datetime from character string 从字符串转换日期时间时转换失败 - Conversion failed when converting datetime from character string 从字符串转换日期和/或时间时,转换错误失败。 尝试生成GridView时 - error of Conversion failed when converting date and/or time from character string. when trying to generate gridview 从字符串转换日期和/或时间时转换失败。 从datetimepicker插入值 - Conversion failed when converting date and/or time from character string. Inserting value from datetimepicker
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM