我创建了一个数据表并尝试通过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#加载批量数据的最快方法.我有这个脚本可以完成这项工作,但速度很慢.我读了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) 我有一些使用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) 我有以下(简化)代码,我想优化速度:
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) 我正在建立一个批处理系统.批量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) 我们使用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) 我需要通过ADO.NET创建一个临时表,BulkCopy然后Merge在服务器上的临时表和实际表之间执行一个。
问题是使用纯ADO.NET动态创建临时表。模式应该与现有表相同,但是该表是使用ORM(NHibernate或Entity Framework,我们不确定)创建的。这也意味着该架构将来可能会更改。
有什么方法可以使用普通的ADO.NET对象在数据库中创建表?如一个DataTable包含原始表的架构?
任何指向我正确方向的信息都将受到赞赏。
我正在研究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)
是什么导致这个错误?
我们在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) 我正在尝试使用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) sqlbulkcopy ×10
c# ×7
sql-server ×2
.net ×1
ado.net ×1
asp.net ×1
azure ×1
datatable ×1
excel ×1
transactions ×1