Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用BulkCopy(C#,SQL)插入对象或更新(如果已存在)_C#_Sql Server_Sqlbulkcopy - Fatal编程技术网

使用BulkCopy(C#,SQL)插入对象或更新(如果已存在)

使用BulkCopy(C#,SQL)插入对象或更新(如果已存在),c#,sql-server,sqlbulkcopy,C#,Sql Server,Sqlbulkcopy,我正在尝试使用列表更新表。我创建了一个EnumExtension类,并创建了一个将我的可枚举项转换为DataTable的方法: public static DataTable AsDataTable<T>(this IEnumerable<T> data)... 公共静态数据表AsDataTable(此IEnumerable数据)。。。 然后我开始创建一个方法,该方法应该使用BulkCopy插入或更新我的表,使用可枚举项。现在,它是这样写的: public void

我正在尝试使用
列表更新表。我创建了一个EnumExtension类,并创建了一个将我的可枚举项转换为DataTable的方法:

public static DataTable AsDataTable<T>(this IEnumerable<T> data)...
公共静态数据表AsDataTable(此IEnumerable数据)。。。
然后我开始创建一个方法,该方法应该使用BulkCopy插入或更新我的表,使用可枚举项。现在,它是这样写的:

public void BulkInsertOrUpdate(DatabaseEnum database, IEnumerable<Object> enumerable, string TableName)
    {
        var connection = this.GetSqlConnection(database);

        var transaction = connection.BeginTransaction();

        using (var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
        {
            bulkCopy.BatchSize = 100;
            bulkCopy.DestinationTableName = TableName;
            try
            {
                bulkCopy.WriteToServer(enumerable.AsDataTable());
            }
            catch (Exception)
            {
                transaction.Rollback();
                connection.Close();
            }
        }
        transaction.Commit();
    }
public void BulkInsertOrUpdate(DatabaseEnum数据库,IEnumerable可枚举,string TableName)
{
var connection=this.GetSqlConnection(数据库);
var transaction=connection.BeginTransaction();
使用(var bulkCopy=new SqlBulkCopy(连接,SqlBulkCopyOptions.Default,事务))
{
bulkCopy.BatchSize=100;
bulkCopy.DestinationTableName=表名;
尝试
{
bulkCopy.WriteToServer(enumerable.AsDataTable());
}
捕获(例外)
{
transaction.Rollback();
connection.Close();
}
}
Commit();
}
(OBS:GetSqlConnection方法使用适当的连接字符串创建并打开我的连接。)

但我不知道如何创建更新功能。有没有一个简单的方法,用一个高效的代码?我喜欢大容量复制,但我可以尝试另一种方法,希望不会损害我的架构(最终,如果找不到方法,我将不得不做出牺牲)

谢谢你的关注,我已经准备好回答关于我处境的疑问。

所以我解决了我的问题(谢谢J-D)。 我基本上是使用一个临时表并在其中插入数据。首先,每次使用时我都会截断它:

connection.Query(database_name, sql_truncate_query);
然后,我使用之前创建的方法插入数据:

connection.BulkInsert(database_name, ienumerable, table_name);
OBS:将方法名称从BulkInsertOrUpdate更改为BulkInsert

稍后,我将使用简单的合并sql查询更新日志表:

INSERT [database].[table]  (col1, col2)
SELECT col1, col2
FROM [database].[table2] t2 
WHERE NOT EXISTS (SELECT col1 FROM [database].[table] t1 WHERE t1.col1= t2.col1);
OBS:我的问题在开发过程中发生了变化,所以我不再使用“更新”功能,我只需要检查行的存在。当然,您可以编写一段代码,如果WHERE子句捕获了该值,则可以在其中更新该值


我不知道这是不是解决这个问题的最佳方法,但这肯定比一次插入或更新每一行要好。

通过谷歌搜索,了解如何使用xml将批量记录插入数据库。如果数据库上未启用批量插入,则通过xml插入所有记录仍然有效。通过xml将xml文件传递到数据库上的存储过程这可能会回答您的问题。但从我个人的角度来看,@Locke给出的答案更合适。你也可以在你的案例中利用MERGE语句。感谢Guindess J-D。我正在使用临时表批量插入我的数据。之后,我将使用WHERE子句将此表合并到日志表中。