标签: sqlbulkcopy

Sqlbulkcopy似乎对我不起作用

我创建了一个数据表并尝试通过SqlBulkCopy插入该数据表但不知何故它似乎对我不起作用....

我收到了错误,

The given value of type DateTime from the data source cannot be converted
to type decimal of the specified target column.
Run Code Online (Sandbox Code Playgroud)

我的数据源是,

DataTable dt = new DataTable();
    dt.Columns.Add(new DataColumn("EmpId", typeof(Int64)));
    dt.Columns.Add(new DataColumn("FromDate", typeof(DateTime)));
    dt.Columns.Add(new DataColumn("ToDate", typeof(DateTime)));
    dt.Columns.Add(new DataColumn("DaysPresent", typeof(decimal)));
    dt.Columns.Add(new DataColumn("OpeningAdvance", typeof(double)));
    dt.Columns.Add(new DataColumn("AdvanceDeducted", typeof(double)));
    dt.Columns.Add(new DataColumn("RemainingAdvance", typeof(double)));
    dt.Columns.Add(new DataColumn("SalaryGiven", typeof(double)));
    dt.Columns.Add(new DataColumn("CreatedDate", typeof(DateTime)));

    foreach (GridViewRow row in gridEmployee.Rows) 
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            DataRow dr = dt.NewRow();
            dr["EmpId"] = Convert.ToInt64(((HiddenField)row.Cells[0].FindControl("HiddenId")).Value);
            dr["FromDate"] = Convert.ToDateTime(GetMonthNumberFromAbbreviation(fromdate[1].ToString()) + '/' + …
Run Code Online (Sandbox Code Playgroud)

c# sql-server-2005 sqlbulkcopy

5
推荐指数
1
解决办法
1560
查看次数

SqlBulkCopy像糖蜜一样慢

我正在寻找通过c#加载批量数据的最快方法.我有这个脚本可以完成这项工作,但速度很慢.我读了SqlBulkCopy最快的证词.
1000记录2.5秒.文件包含接近5000条记录到250k的任何内容有哪些可以减慢它的速度?

表格定义:

CREATE TABLE [dbo].[tempDispositions](
    [QuotaGroup] [varchar](100) NULL,
    [Country] [varchar](50) NULL,
    [ServiceGroup] [varchar](50) NULL,
    [Language] [varchar](50) NULL,
    [ContactChannel] [varchar](10) NULL,
    [TrackingID] [varchar](20) NULL,
    [CaseClosedDate] [varchar](25) NULL,
    [MSFTRep] [varchar](50) NULL,
    [CustEmail] [varchar](100) NULL,
    [CustPhone] [varchar](100) NULL,
    [CustomerName] [nvarchar](100) NULL,
    [ProductFamily] [varchar](35) NULL,
    [ProductSubType] [varchar](255) NULL,
    [CandidateReceivedDate] [varchar](25) NULL,
    [SurveyMode] [varchar](1) NULL,
    [SurveyWaveStartDate] [varchar](25) NULL,
    [SurveyInvitationDate] [varchar](25) NULL,
    [SurveyReminderDate] [varchar](25) NULL,
    [SurveyCompleteDate] [varchar](25) NULL,
    [OptOutDate] [varchar](25) NULL,
    [SurveyWaveEndDate] [varchar](25) NULL,
    [DispositionCode] [varchar](5) NULL,
    [SurveyName] [varchar](20) NULL,
    [SurveyVendor] [varchar](20) NULL,
    [BusinessUnitName] [varchar](25) …
Run Code Online (Sandbox Code Playgroud)

c# sqlbulkcopy

5
推荐指数
1
解决办法
9586
查看次数

如何使SqlBulkCopy与MS Enterprise Library一起使用?

我有一些使用SqlBulkCopy的代码.现在我们重构我们的代码以使用Enterprise Library数据库函数而不是标准函数.问题是如何实例化SqlBulkCopy?它接受SqlConnection,我只有DbConnection.

var bulkCopy = new SqlBulkCopy(connection)  // here connection is SqlConnection
{
    BatchSize = Settings.Default.BulkInsertBatchSize,
    NotifyAfter = 200,
    DestinationTableName = "Contacts"
};
Run Code Online (Sandbox Code Playgroud)

enterprise-library sqlbulkcopy

5
推荐指数
1
解决办法
3881
查看次数

C#优化:在数据库中插入2亿行

我有以下(简化)代码,我想优化速度:

long inputLen = 50000000; // 50 million 
DataTable dataTable = new DataTable();
DataRow dataRow;
object[] objectRow;
while (inputLen--)
{
    objectRow[0] = ...
    objectRow[1] = ...
    objectRow[2] = ...

    // Generate output for this input
    output = ...

    for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000
    {
         objectRow[3] = output[i];
         dataRow = dataTable.NewRow();
         dataRow.ItemArray = objectRow;
         dataTable.Rows.Add(dataRow);
    }
}

// Bulk copy
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null);
bulkTask.DestinationTableName = …
Run Code Online (Sandbox Code Playgroud)

c# datatable sqlbulkcopy

5
推荐指数
1
解决办法
4941
查看次数

EF Competing SaveChanges()调用

我正在建立一个批处理系统.批量Units从20到1000个.每个Unit基本上都是模型的层次结构(一个主模型和许多子模型).我的任务涉及将每个模型层次结构作为单个事务保存到数据库(每个层次结构提交或回滚).遗憾的EF是,由于它们可能包含数千条记录,因此无法处理模型层次结构的两个部分.

我为解决这个问题所做的工作是设置SqlBulkCopy为处理这两个可能很高的计数模型,并让我们EF处理其余的插入(和参照完整性).

批量循环:

foreach (var unitDetails in BatchUnits)
{
  var unitOfWork = new Unit(unitDetails);
  Task.Factory.StartNew(() =>
    {
      unitOfWork.ProcessX(); // data preparation
      unitOfWork.ProcessY(); // data preparation
      unitOfWork.PersistCase();
    });
}
Run Code Online (Sandbox Code Playgroud)

单元:

class Unit
{
  public PersistCase()
  {
    using (var dbContext = new CustomDbContext())
    {
      // Need an explicit transaction so that 
      // EF + SqlBulkCopy act as a single block
      using (var scope = new TransactionScope(TransactionScopeOption.Required,
        new TransactionOptions() {
          IsolationLevel = System.Transaction.IsolationLevel.ReadCommitted …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework transactions sqlbulkcopy

5
推荐指数
1
解决办法
1625
查看次数

SQL批量复制中的异常和内存问题

我们使用SQL批量复制将近1000万行插入到SQL Server表中.

我们在7400000次插入后收到此例外:

链接服务器'(null)'的OLE DB提供程序'STREAM'返回列'[!BulkInsert] .Amount'的无效数据.

如果可以解决,请告诉我们.

还有内存泄漏问题.

以下是我们的代码:

try
{
            using (SqlConnection SQlConn = new SqlConnection(Common.SQLConnectionString))
            {                   
                DataTable dt1 = FillEmptyDateFields(dtDestination);

                //SqlTableCreator ObjTbl = new SqlTableCreator(SQlConn);

                //ObjTbl.DestinationTableName = DestinationTable;

                using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn,SqlBulkCopyOptions.TableLock,null))
                {

                    //bulkCopy = new System.Data.SqlClient.SqlBulkCopy(SQlConn);
                    bulkCopy.DestinationTableName = DestinationTable;
                    bulkCopy.BulkCopyTimeout = 0;
                    bulkCopy.BatchSize = dt1.Rows.Count; // Batch Size Added.
                    Logger.Log("DATATABLE FINAL :" + dt1.Rows.Count.ToString(), Logger.LogType.Info);
                    if (SQlConn.State == ConnectionState.Closed || SQlConn.State == ConnectionState.Broken)
                        SQlConn.Open();
                    bulkCopy.WriteToServer(dt1);
                    SQlConn.Close();
                    SQlConn.Dispose();
                    bulkCopy.Close();
                    if (bulkCopy != null)
                    {
                        ((IDisposable)bulkCopy).Dispose();
                    } …
Run Code Online (Sandbox Code Playgroud)

sql-server sqlbulkcopy

5
推荐指数
1
解决办法
2549
查看次数

在ADO.NET中使用动态创建的临时表进行批量复制

我需要通过ADO.NET创建一个临时表,BulkCopy然后Merge在服务器上的临时表和实际表之间执行一个。

问题是使用纯ADO.NET动态创建临时表。模式应该与现有表相同,但是该表是使用ORM(NHibernate或Entity Framework,我们不确定)创建的。这也意味着该架构将来可能会更改。

有什么方法可以使用普通的ADO.NET对象在数据库中创建表?如一个DataTable包含原始表的架构?

任何指向我正确方向的信息都将受到赞赏。

ado.net sqlbulkcopy

5
推荐指数
1
解决办法
1万
查看次数

SQL批量复制"使用ASP.NET无法将数据源中String类型的给定值转换为指定目标列的类型日期时间"

我正在研究ASP.NET MVC4项目,我正在尝试使用SQL批量复制将数据从xlsx文件(Excel 2010文件)导出到我的数据库.我的Excel文件只包含2列:第一列包含数字(从1到25),第二列包含字符(连续系列"a,b,c")

这是我尝试导出数据的方法,但是我收到错误"数据源中String类型的给定值无法转换为指定目标列的int类型" :

public ActionResult Bulk()
{    
    string xConnStr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\maarab\Documents\BulkCopy.xlsx;Extended Properties=Excel 12.0;";
    using (OleDbConnection connection = new OleDbConnection(xConnStr))
    {
        OleDbCommand command = new OleDbCommand("Select * FROM [Sheet1$]", connection);
        connection.Open();    
        string dbConnection = ((EntityConnection)db.Connection).StoreConnection.ConnectionString;

        // Create DbDataReader to Data Worksheet
        using (DbDataReader dr = command.ExecuteReader())
        {
            using (var bulkCopy = new SqlBulkCopy(dbConnection))
            {    
                bulkCopy.DestinationTableName = "bm_test" 
                bulkCopy.WriteToServer(dr); //here I got the error    
            }
        }

        return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)

是什么导致这个错误?

c# asp.net excel sqlbulkcopy

5
推荐指数
2
解决办法
2万
查看次数

Azure中的SqlBulkCopy超时

我们在Azure中遇到了SqlBulkCopy的问题.

上下文如下:我们有一个大约有1000万行的表.每行有大约15列.

我们正在将这些数据迁移到我们的新模型中,这需要拆分数据,因此包含15列的1行变为15行.

它在一开始就很完美.目标表现在包含17 767 235行,并且速度非常快.

此时,它开始抛出异常.

我做了一些修改以增加超时并使用批处理,但似乎它完全被阻止了.

这是最初的例外:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.; TraceSource 'WaWorkerHost.exe' event Services.DataMigration.Edmi_IN_0   5/9/2014 2:44 PM    2   1508    280

      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) …
Run Code Online (Sandbox Code Playgroud)

c# sqlbulkcopy azure azure-worker-roles azure-sql-database

5
推荐指数
1
解决办法
1934
查看次数

SqlBulkCopy - 给定的ColumnName与源或目标中的任何列都不匹配

我正在尝试使用SqlBulkCopy将数据复制到SQL数据库表中,但它(错误地)说列不匹配.他们匹配.如果我使用断点来查看要映射的列的名称,它们是正确的.错误消息显示列的名称,并且它是正确的.

这是我的方法.我有一个相同的方法工作,唯一的区别是哪里得到的列名.但是,包含列名的字符串完全相同.

    public static bool ManualMapImport(DataTable dataTable, string table)
    {
        if(dataTable != null)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            SqlBulkCopy import = new SqlBulkCopy(connection);
            import.DestinationTableName = "[" + table + "]";
            foreach (string s in Global.SelectedColumns)
            {                    
            /* The s string variable here is the EXACT same as
               the c.ToString() in the other method below */

                if (ColumnExists(table, s))
                    import.ColumnMappings.Add(s, s); 
                else
                    return false;
            }

            connection.Open();
            import.WriteToServer(dataTable); //Error happens on this line
            connection.Close();

            return true;
        }
        else
        { …
Run Code Online (Sandbox Code Playgroud)

c# sql-server sqlbulkcopy

5
推荐指数
1
解决办法
8449
查看次数