2009-06-21 13 views
15

का उपयोग कर डेटा डालने में त्रुटि मैं SqlBulkCopy का उपयोग कर SQL 2008 में सम्मिलित डेटा बैच करने का प्रयास कर रहा हूं।SqlBulkCopy

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 

यहाँ है मेरी कोड:

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

तो मैं हो रही है त्रुटि:

यहाँ मेरी मेज है

The given value of type SqlDateTime from the data source cannot be converted to type date of the specified target column.

क्यों ?? मैं कैसे इसे ठीक कर सकता हूं? कृपया मेरी मदद करें!

उत्तर

19

अपनी मूल तालिका स्क्रिप्ट का उपयोग करके, निम्न कोड काम करता है।

private static DataTable GetTable() 
{ 
    var list = new List<DataColumn>(); 
    list.Add(new DataColumn("amount", typeof(Double))); 
    list.Add(new DataColumn("date", typeof(DateTime))); 
    var table = new DataTable("statement"); 
    table.Columns.AddRange(list.ToArray()); 

    var row = table.NewRow(); 
    row["amount"] = 1.2d; 
    row["date"] = DateTime.Now.Date; 

    table.Rows.Add(row); 
    return table; 
} 
private static void WriteData() 
{ 
    string strConnection = "Server=(local);Database=ScratchDb;Trusted_Connection=True;"; 
    using (var bulk = new SqlBulkCopy(strConnection, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls)) 
    { 
     bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("amount", "amount")); 
     bulk.ColumnMappings.Add(new SqlBulkCopyColumnMapping("date", "date")); 
     bulk.BatchSize = 25; 
     bulk.DestinationTableName = "statement"; 
     bulk.WriteToServer(GetTable()); 
    } 
} 

जैसा कि पहले से ही अमल द्वारा बताया गया है, आपको पहचान कॉलम के कारण कॉलम मैपिंग की आवश्यकता है।

+5

क्या यह "एसक्यूएलकल्क कॉपीऑप्शन। कीपइडेन्टिटी | एसक्यूएलकल्क कॉपीऑप्शन .किपनल्स" नहीं होना चाहिए? – rusty

6

एसक्यूएल दिनांक प्रकार एसक्यूएल डेटटाइम प्रकार से अलग है। मुझे लगता है कि आप जिस तालिका का उपयोग कर रहे हैं उसके आधार पर आपकी तालिका में दिनांक कॉलम डेटटाइम प्रकार की आवश्यकता है।

SQL Date Type
SQL DateTime type

अद्यतन:

मुझे लगता है कि मार्क का जवाब काम करना चाहिए, लेकिन आप शायद अन्यथा यह मानचित्रण गलत हो रही हो सकता है, गंतव्य के लिए अपने स्रोत DataTable से SqlBulkCopyColumnMappings निर्दिष्ट करने की आवश्यकता क्योंकि आपकी इनपुट तालिका की संरचना आउटपुट तालिका से बिल्कुल मेल नहीं खाती है यानी दिनांक और पंक्ति कॉलम का क्रम बदल दिया जाता है।

जैसे

var amount = new SqlBulkCopyColumnMapping("amount", "amount"); 
var date = new SqlBulkCopyColumnMapping("date", "date"); 
bulk.ColumnMappings.Add(amount); 
bulk.ColumnMappings.Add(date); 
+0

हाँ, मैं समझता हूं कि वे अलग हैं। लेकिन मैं वास्तव में DbType.Date का उपयोग कैसे कर सकता हूं अगर केवल DbType.DateTime/SqlDateTime/DateTime हर जगह है ?! – abatishchev

+0

आप अस्थायी तालिका में अधिक व्यापक रूप से उपयोग किए जाने वाले "DATETIME" का उपयोग कर सकते हैं जिसका उपयोग आप थोक लोडिंग के लिए करते हैं, और उसके बाद "असली" डेटा तालिका में वास्तविक "DATE" का उपयोग करें। आप आसानी से एक टी-एसक्यूएल कथन में दिनांक के लिए डेटटाइम असाइन कर सकते हैं। –

2

SqlDateTime मूल datetime प्रकार का प्रतिनिधित्व करता है। क्या आपने DateTime .NET प्रकार का उपयोग DataTable में किया है? मुझे उम्मीद है कि यह इसे टीएसक्यूएल datetime या date प्रकारों में परिवर्तित कर सकता है। SqlDecimal के बजाय decimal पर डाइटो।

+0

यदि मैं टाइपफ़ोफ़ (डबल) का उपयोग करता हूं तो त्रुटि प्राप्त होगी: "डेटा स्रोत से SqlString प्रकार का दिया गया मान निर्दिष्ट लक्ष्य कॉलम के दशमलव प्रकार में परिवर्तित नहीं किया जा सकता है"। टाइपफॉफ़ (डेटटाइम) के साथ एक ही त्रुटि! और मैं टाइपऑफ (दशमलव) का उपयोग नहीं कर सकता क्योंकि उचित कॉलम पैसे का प्रतिनिधित्व करता है और 2 दशमलव अंकों की आवश्यकता होती है .. – abatishchev

संबंधित मुद्दे