[POSTGRESQL के लिए नई समाधान] अरे, मुझे पता है कि यह काफी पुरानी पोस्ट है, लेकिन मैं हाल ही में इसी तरह की समस्या में चला गया हूं, लेकिन हम Postgresql का उपयोग कर रहे थे। मैं प्रभावी bulkinsert का उपयोग करना चाहता था, जो कि बहुत कठिन निकला। मुझे इस डीबी पर ऐसा करने के लिए कोई उचित मुफ्त पुस्तकालय नहीं मिला है। मुझे केवल यह सहायक मिला है:
https://bytefish.de/blog/postgresql_bulk_insert/
जो नुगेट पर भी है। मैंने एक छोटा सा मैपर लिखा है, जो ऑटो ने एंटिटी फ्रेमवर्क के तरीके को मैप किया:
public static PostgreSQLCopyHelper<T> CreateHelper<T>(string schemaName, string tableName)
{
var helper = new PostgreSQLCopyHelper<T>("dbo", "\"" + tableName + "\"");
var properties = typeof(T).GetProperties();
foreach(var prop in properties)
{
var type = prop.PropertyType;
if (Attribute.IsDefined(prop, typeof(KeyAttribute)) || Attribute.IsDefined(prop, typeof(ForeignKeyAttribute)))
continue;
switch (type)
{
case Type intType when intType == typeof(int) || intType == typeof(int?):
{
helper = helper.MapInteger("\"" + prop.Name + "\"", x => (int?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type stringType when stringType == typeof(string):
{
helper = helper.MapText("\"" + prop.Name + "\"", x => (string)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type dateType when dateType == typeof(DateTime) || dateType == typeof(DateTime?):
{
helper = helper.MapTimeStamp("\"" + prop.Name + "\"", x => (DateTime?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type decimalType when decimalType == typeof(decimal) || decimalType == typeof(decimal?):
{
helper = helper.MapMoney("\"" + prop.Name + "\"", x => (decimal?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type doubleType when doubleType == typeof(double) || doubleType == typeof(double?):
{
helper = helper.MapDouble("\"" + prop.Name + "\"", x => (double?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type floatType when floatType == typeof(float) || floatType == typeof(float?):
{
helper = helper.MapReal("\"" + prop.Name + "\"", x => (float?)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
case Type guidType when guidType == typeof(Guid):
{
helper = helper.MapUUID("\"" + prop.Name + "\"", x => (Guid)typeof(T).GetProperty(prop.Name).GetValue(x, null));
break;
}
}
}
return helper;
}
मैं इसे निम्नलिखित तरीके से उपयोग करता हूं (मेरे पास अंडरटेकिंग नाम की संस्था थी):
var undertakingHelper = BulkMapper.CreateHelper<Model.Undertaking>("dbo", nameof(Model.Undertaking));
undertakingHelper.SaveAll(transaction.UnderlyingTransaction.Connection as Npgsql.NpgsqlConnection, undertakingsToAdd));
मैंने लेन-देन के साथ एक उदाहरण दिखाया, लेकिन यह संदर्भ से प्राप्त सामान्य कनेक्शन के साथ भी किया जा सकता है। undertakingsToAdd सामान्य इकाई रिकॉर्ड्स के योग्य है, जिसे मैं DB में थोक करना चाहता हूं।
यह समाधान, जिसे मैंने कुछ घंटों के शोध और कोशिश के बाद प्राप्त किया है, जैसा कि आप बहुत तेजी से और अंत में उपयोग करने और मुक्त होने की उम्मीद कर सकते हैं! मैं वास्तव में आपको इस समाधान का उपयोग करने की सलाह देता हूं, न केवल ऊपर बताए गए कारणों के लिए, बल्कि इसलिए भी कि यह एकमात्र ऐसा है जिसके साथ मुझे पोस्टग्रैसेकल के साथ कोई समस्या नहीं थी, कई अन्य समाधान SqlServer के साथ उदाहरण के लिए निर्दोष रूप से काम करते हैं।