2010-05-20 5 views
1

Je suivais ce tutoriel sur la façon de faire un insert batch linq à sql.La conversion a échoué lors de la conversion de datetime à partir d'une chaîne de caractères. Linq To SQL & OpenXML

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

Toutefois, j'ai un champ datetime dans ma base de données et je continue à obtenir cette erreur.

System.Data.SqlClient.SqlException était unhandled Message = "Échec de la conversion lors de la conversion de datetime chaîne de caractères." Source = "Net SqlClient fournisseur de données."
ErrorCode = -2146232060 classe = 16
LineNumber = 7 Nombre = 241
Procédure = "spTEST_InsertXMLTEST_TEST" serveur = "" Etat = 1 StackTrace: à System.Data. SqlClient.SqlConnection.OnError (SqlException exception, Boolean breakConnection) à System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) à System.Data.SqlClient.TdsParser.Run (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)

Je ne sais pas pourquoi quand je prends juste le datetime dans le fichier XML généré et copier manuellement dans SQL Server 2005, il n'a pas de problème avec elle et le convertit très bien.

Ceci est mon 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

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 Rendus 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> 

Répondre

1

OK, deux choses:

Première: si vous êtes en utilisant le type de données XML, vous devez être sur SQL S erver 2005 ou plus récent, non? Astuce: Arrêtez d'utiliser NTEXT comme type de données! MAINTENANT! Ainsi, au lieu de (@UpdatedProdData nText) vous devriez certainement utiliser (@UpdatedProdData NVARCHAR(MAX))

En second lieu - si vous utilisez déjà SQL Server 2005 et XQuery, je serais certainement réécrire cette procédure stockée pour ne pas utiliser OPENXML et toutes ces méthodes - ceux-ci sont désapprouvée et pas vraiment nécessaire. Essayez ceci:

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') 

Vous pouvez faire encore plus facile si vous passez une chose de type XML directement:

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

Essayez!

+1

Intresting.Pouvez-vous expliquer pourquoi ces 2 façons sont meilleures et pourquoi vous ne devriez pas utiliser "nText"? Aussi, pourquoi avez-vous [1]? Dans ce cas, je n'ai qu'un seul enregistrement, mais ce n'est qu'un test, je vais avoir beaucoup d'enregistrements.J'utilise SQL Server 2005 et je ne sais pas si j'utilise XQuery. – chobo2

+0

J'ai essayé de faire votre 2ème option mais je continue d'obtenir. Ligne 3 La fonction de valeur nécessite 2 argument (s). – chobo2

+0

Ah, je vois pourquoi je reçois cette erreur. C'est parce que je pensais que lorsque vous faites varchars vous avez besoin d'un 3ème paramètre pour la longueur mais à la place vous avez juste comme 'varchar (50)' – chobo2

Questions connexes