2010-05-20 101 views
1

我一直在关注本教程如何做一个LINQ到SQL批处理插入。从字符串转换datetime时转换失败。 Linq To SQL&OpenXML

http://www.codeproject.com/KB/linq/BulkOperations_LinqToSQL.aspx

但是我有我的数据库中的日期时间字段,我不断收到此错误。

System.Data.SqlClient.SqlException是 未处理消息= “转化从 字符串变换日期时间时失败 ”。源= “净 SqlClient数据提供。”
错误码= -2146232060类= 16
LineNumber上= 7总数= 241
过程= “spTEST_InsertXMLTEST_TEST” 服务器= “” 状态= 1个堆栈跟踪: 在System.Data。 SqlClient.SqlConnection.OnError(SQLEXCEPTION 例外,布尔breakConnection) 在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand的cmdHandler, SqlDataReader的dataStream, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)

我不知道为什么,当我刚刚参加生成的XML文件中的日期时间,并手动将其复制到SQL Server 2005中它与它没有任何问题,并将其转换就好了。

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

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()); 
} 

渲染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> 

回答

1

OK,两件事情:

首先:如果你是使用XML数据类型,您必须在SQL S上erver 2005或更新版本,对不对?

提示:停止使用NTEXT作为数据类型! 现在!所以不是(@UpdatedProdData nText)你一定要使用(@UpdatedProdData NVARCHAR(MAX))

其次 - 如果你已经使用SQL Server 2005和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') 

试试吧!

+1

Intresting.Can请解释为什么这2种方式更好,为什么你不应该使用“nText”?你为什么还有[1]?在这种情况下,我只有一条记录,但这只是一个测试,我会有很多记录。我正在使用SQL Server 2005,我不确定我是否使用XQuery。 – chobo2 2010-05-20 17:43:31

+0

我试图做你的第二个选项,但我不断收到。第3行 值函数需要2个参数。 – chobo2 2010-05-20 18:03:08

+0

啊,我明白为什么我得到这个错误。这是因为我认为在做varchars时需要第三个参数的长度,但是你只需要像'varchar(50)' – chobo2 2010-05-20 18:13:32

相关问题