Erreur lors de l'insertion de données à l'aide de SqlBulkCopy
Je suis en train de lot insérer des données dans SQL server 2008 à l'aide de SqlBulkCopy
.
Voici ma table:
IF OBJECT_ID(N'statement', N'U') IS NOT NULL
DROP TABLE [statement]
GO
CREATE TABLE [statement](
[ID] INT IDENTITY(1, 1) NOT NULL,
[date] DATE NOT NULL DEFAULT GETDATE(),
[amount] DECIMAL(14,2) NOT NULL,
CONSTRAINT [PK_statement] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
Voici mon code:
private DataTable GetTable()
{
var list = new List<DataColumn>();
list.Add(new DataColumn("amount", typeof(SqlDecimal)));
list.Add(new DataColumn("date", typeof(SqlDateTime)));
var table = new DataTable("statement");
table.Columns.AddRange(list.ToArray());
var row = table.NewRow();
row["amount"] = (SqlDecimal)myObj.Amount; //decimal Amount { get; set; }
row["date"] = (SqlDateTime)myObj.Date; //DateTime Date { get; set }
table.Rows.Add(row);
return table;
}
private void WriteData()
{
using (var bulk = new SqlBulkCopy(strConnection, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls))
{
//table.Columns.ForEach(c => bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping(c.ColumnName, c.ColumnName)));
bulk.BatchSize = 25;
bulk.DestinationTableName = "statement";
bulk.WriteToServer(GetTable()); //a table from GetTable()
}
}
Donc j'obtiens une erreur:
La valeur donnée de type
SqlDateTime
de la source de données ne peuvent pas être convertis en typedate
de la colonne cible.
Pourquoi?? Comment puis-je régler ce problème? Aidez-moi, s'il vous plaît!
source d'informationauteur abatishchev | 2009-06-21
Vous devez vous connecter pour publier un commentaire.
À l'aide de votre table d'origine script, le code suivant fonctionne.
Comme déjà indiqué par Amal, vous avez besoin de les mappages de colonnes en raison de la colonne d'Identité.
Le SQL de type Date est différente de la SQL de type DateTime. Je pense que la date de la colonne de votre tableau doit être de type DateTime, basé sur la façon dont vous l'utilisez.
SQL de Type Date
SQL de type DateTime
Mise à jour:
Je pense que la réponse de Marc-ci devrait fonctionner, mais vous avez probablement besoin de spécifier le SqlBulkCopyColumnMappings à partir de votre source DataTable à la destination, sinon il pourrait être l'obtention de la cartographie de mal parce que la structure de votre table d'entrée ne correspond pas à la table de sortie exactement ie de l'ordre des dates de ligne et de colonnes échangé.
par exemple
SqlDateTime
représente l'originaldatetime
type. Avez-vous essayé tout à l'aide de laDateTime
.NET type dans leDataTable
? J'espère qu'il peut convertir ce soit sur le TSQLdatetime
oudate
types. Idemdecimal
au lieu deSqlDecimal
.