C# 从字符串转换日期时间时转换失败。Linq To SQL&;OpenXML

C# 从字符串转换日期时间时转换失败。Linq To SQL&;OpenXML,c#,sql-server,linq-to-sql,openxml,C#,Sql Server,Linq To Sql,Openxml,我一直在学习如何执行linq到sql批插入的教程 然而,我的数据库中有一个datetime字段,我不断收到这个错误 System.Data.SqlClient.SqlException被删除 未处理的消息=“转换失败。” 从转换日期时间时 字符串。“Source=”.Net SqlClient数据提供程序“ 错误代码=-2146232060类=16 LineNumber=7 Number=241 过程=“spTEST\u InsertXMLTEST\u测试” Server=”“State=1堆

我一直在学习如何执行linq到sql批插入的教程

然而,我的数据库中有一个datetime字段,我不断收到这个错误

System.Data.SqlClient.SqlException被删除 未处理的消息=“转换失败。” 从转换日期时间时 字符串。“Source=”.Net SqlClient数据提供程序“
错误代码=-2146232060类=16
LineNumber=7 Number=241
过程=“spTEST\u InsertXMLTEST\u测试” Server=”“State=1堆栈跟踪: 位于System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔断开连接) 位于System.Data.SqlClient.TdsParser.ThroweException和Warning(TdsParserStateObject stateObj) 位于System.Data.SqlClient.TdsParser.Run(RunBehavior 运行行为,SqlCommand cmdHandler, SqlDataReader数据流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)

我不知道为什么我只是在生成的xml文件中获取datetime并手动将其复制到SQLServer2005中,它没有问题,并且可以很好地转换它

这是我的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#代码

使用(TestDataContext db=newtestdatacontext())
{
UserTable[]testRecords=新的UserTable[1];
对于(int count=0;count<1;count++)
{
UserTable testRecord=newusertable()
{
CreateDate=DateTime.Now
};
testRecords[计数]=testRecord;
}
StringBuilder sBuilder=新StringBuilder();
System.IO.StringWriter sWriter=新的System.IO.StringWriter(sBuilder);
XmlSerializer serializer=新的XmlSerializer(typeof(UserTable[]);
serializer.Serialize(sWriter,testRecords);
db.spTEST_InsertXMLTEST_TEST(sBuilder.ToString());
}
呈现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>

2010-05-19T19:35:54.9339251-07:00
好的,有两件事:

第一:如果您使用的是XML数据类型,那么您必须在SQLServer2005或更高版本上,对吗

提示:停止使用
NTEXT
作为数据类型现在因此,您不应该使用
(@UpdatedProdData-nText)
而应该使用
(@UpdatedProdData-NVARCHAR(MAX))

第二,如果您已经在使用SQLServer2005和XQuery,我肯定会重写存储过程,使其不使用OPENXML和所有这些方法——这些方法已被弃用,并且不是真正需要的。请尝试以下方法:

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')   
如果您直接传入一个数据类型为XML的对象,则可以更轻松地执行此操作:

CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData XML)
AS 
   INSERT INTO 
      dbo.UserTable(CreateDate)
      SELECT
         @UpdatedProdData.value('(/ArrayOfUserTable/UserTable/CreateDate)[1]', 'DATETIME')   
试试看

好的,有两件事:

第一:如果您使用的是XML数据类型,那么您必须在SQLServer2005或更高版本上,对吗

提示:停止使用
NTEXT
作为数据类型现在因此,您不应该使用
(@UpdatedProdData-nText)
而应该使用
(@UpdatedProdData-NVARCHAR(MAX))

第二,如果您已经在使用SQLServer2005和XQuery,我肯定会重写存储过程,使其不使用OPENXML和所有这些方法——这些方法已被弃用,并且不是真正需要的。请尝试以下方法:

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')   
如果您直接传入一个数据类型为XML的对象,则可以更轻松地执行此操作:

CREATE PROCEDURE [dbo].[spTEST_InsertXMLTEST_TEST](@UpdatedProdData XML)
AS 
   INSERT INTO 
      dbo.UserTable(CreateDate)
      SELECT
         @UpdatedProdData.value('(/ArrayOfUserTable/UserTable/CreateDate)[1]', 'DATETIME')   

试试看

有趣。你能解释一下为什么这两种方式更好,为什么你不应该使用“nText”吗?你为什么有[1]?在这种情况下,我只有一个记录,但这只是一个测试,我将有很多记录。我正在使用SQL Server 2005,我不确定我是否在使用XQuery。我尝试了您的第二个选项,但我一直在使用。第3行value函数需要2个参数。啊,我明白为什么会出现这个错误了。这是因为我认为在执行varchars时,您需要第三个参数来表示长度,但您只需要使用类似于“varchar(50)”的参数。现在,当我尝试将SP从linq拖到sql到designer视图时,我得到了未知的返回类型。我知道它应该是‘none’,现在我看到我必须先传递System.Xml.Linq.XElement,然后才能传递字符串生成器。那么,我是如何将其更改为这种新类型的呢?Intresting.能否请您解释一下为什么这两种方法更好,以及为什么不应该使用“nText”?你为什么有[1]?在这种情况下,我只有一个记录,但这只是一个测试,我将有很多记录。我正在使用SQL Server 2005,我不确定我是否在使用XQuery。我尝试了您的第二个选项,但我一直在使用。第3行value函数需要2个参数。啊,我明白为什么会出现这个错误了。这是因为我认为在执行varchars时,您需要第三个参数来表示长度,但您只需要使用类似于“varchar(50)”的参数。现在,当我尝试将SP从linq拖到sql到designer视图时,我得到了未知的返回类型。我知道它应该是‘none’,现在我看到我必须先传递System.Xml.Linq.XElement,然后才能传递字符串生成器。那我怎么把它换成这种新的呢?