Преобразование не удалось при преобразовании даты и времени из символьной строки. Linq To SQL и OpenXML - PullRequest
1 голос
/ 20 мая 2010

Я следовал этому руководству о том, как выполнить пакетную вставку linq to sql.

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

Однако в моей базе данных есть поле datetime, и я получаю эту ошибку.

System.Data.SqlClient.SqlException был необработанное сообщение = "преобразование не выполнено при преобразовании даты и времени из строка символов. "Source =". Net SqlClient Data Provider "
ErrorCode = -2146232060 Класс = 16
LineNumber = 7 число = 241
Процедура = "spTEST_InsertXMLTEST_TEST" Server = "" State = 1 StackTrace: в System.Data.SqlClient.SqlConnection.OnError (SqlException исключение, Boolean 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, у него нет проблем с ним, и он прекрасно конвертируется.

Это мой ИП

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 Doc

<?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 Ответ

1 голос
/ 20 мая 2010

ОК, пара вещей:

Во-первых: если вы используете тип данных XML, вы должны использовать SQL Server 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')   

Попробуй!

...