我在尝试使用 SQL Server Bulk Copy API 和SQLServerBulkCSVFileRecord. 仅出于测试目的,我制作了一个仅包含nvarchar(500)列的表,并添加了元数据,如下所示:
fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);
for(int i=1; i<=colCount; i++) {
fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 500, 0);
}
Run Code Online (Sandbox Code Playgroud)
在使用带有 JDBC 的 Microsoft SQL 批量复制 API 后,我得到以下堆栈跟踪,但我找不到任何有关SQLServerBulkCSVFileRecord. 我不知道参数代表什么addColumnMetaData:我只是假设看这个例子,第一个参数代表列索引,然后显然第三个参数代表数据类型,第四个参数代表列的字节数(?)。
com.microsoft.sqlserver.jdbc.SQLServerException: Unicode data is odd byte size for column 1. Should be even byte size.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)
at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:251)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:81)
at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:36)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.doInsertBulk(SQLServerBulkCopy.java:1433)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.access$200(SQLServerBulkCopy.java:41)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy$1InsertBulk.doExecute(SQLServerBulkCopy.java:666)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.sendBulkLoadBCP(SQLServerBulkCopy.java:699)
at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:1516) …Run Code Online (Sandbox Code Playgroud) 我正在使用 EFCore.BulkExtensions 将具有 GUID / UniqueIdentifier 主键的实体插入到我的数据库中,但当我调用此行时,我收到以下异常:
System.InvalidOperationException HResult=0x80131509 Message=来自数据源的 String 类型的给定值无法转换为指定目标列的 uniqueidentifier 类型。
源 = EFCore.BulkExtensions StackTrace:在 EFCore.BulkExtensions.SqlBulkOperation.Insert[T](DbContext 上下文,IList1 entities, TableInfo tableInfo, Action1 进度)在 EFCore.BulkExtensions.DbContextBulkExtensions.BulkInsert[T](DbContext 上下文,IList1 entities, BulkConfig bulkConfig, Action1 进度)
在 MyCompany.Abp。D:\Projects\MySystem\Modules\s\s.SearchServices.Infrastruct.UnscConsolidatedList\Infrastruct\s\MonitoringBatch\MonitoringBatchSearchJob 中的EfCore.BulkExtensions.BulkInsert[TEntity、TPrimaryKey](IRepository2 repository, IList1 实体、BulkConfigbulkConfig、操作1 记录)。1 progress) in D:\Projects\MySystem\Utilities\MyCompany.Abp.EfCore\BulkExtensions.BulkInsert.cs:line 21 at s.SearchServices.Infrastructure.UnscConsolidatedList.Infrastructure.s.MonitoringBatch.MonitoringBatchSearchJob.PerformScreening(Guid sourceId, IListcs:第 96 行位于 D:\Projects\MySystem\Modules\s\s.SearchServices.Infrastruct.UnscConsolidatedList\Infrastruct\s\ 中的 s.SearchServices.Infrastruct.UnscConsolidatedList.Infrastruct.s.MonitoringBatch.MonitoringBatchSearchJob.ExecuteJob(MonitoringBatchSearhJobArgs args) MonitoringBatch\MonitoringBatchSearchJob.cs:第 82 行位于 s.SearchServices.Infrastruct.UnscConsolidatedList.Core.BatchSearchJobBase`1.Execute(TBatchSearhJobArgs args),位于 D:\Projects\MySystem\Modules\s\s.SearchServices.Infrastruct.UnscConsolidatedList\Core\ BatchSearchJobBase.cs:第 28 行内部异常 1:InvalidCastException:无法将参数值从字符串转换为 Guid。
内部异常 2:InvalidCastException:从“System.String”到“System.Guid”的转换无效。
抛出异常的代码:
public static void BulkInsert<TEntity, …Run Code Online (Sandbox Code Playgroud) 有人可以详细说明何时在 azure datafactory 中使用 Polybase 与批量插入吗?这两种复制方法有什么区别?
我正在使用SqlBulkCopy将一些表中的一些记录批量插入到另一个表中.该查询使用SqlDataReader来获取数据.表之间的一个重要区别(除了在映射中处理的列顺序之外)是目标表具有日期列,需要在该日期列中添加当前日期.此日期不在源表中.如何将此添加到当前正常工作的流程中减去此项?
当前的工作代码如下所示:
SqlCommand cmd = new SqlCommand("SELECT * from dbo.source", cn);
SqlDataReader rdr = cmd.ExecuteReader();
using (SqlBulkCopy copy = new SqlBulkCopy(cn))
{
copy.ColumnMappings.Add(0, 0);
copy.ColumnMappings.Add(1, 2);
copy.ColumnMappings.Add(3, 3);
copy.ColumnMappings.Add(2, 4);
copy.ColumnMappings.Add(5, 5);
copy.ColumnMappings.Add(14, 6);
copy.DestinationTableName = "destination";
copy.WriteToServer(rdr);
}
Run Code Online (Sandbox Code Playgroud)
DB是sql 2008 ENT.
与下面提到的其他问题类似,我有两个表格结构:
create table parent (
recno int identity(1,1) primary key not null,
groupCode int,
parentdata varchar(80)
);
create table child (
parentrecno int not null,
childdata varchar(80)
)
Run Code Online (Sandbox Code Playgroud)
我需要在这些表中快速插入几十万个记录 - 这些表包含数百万个与此插入无关的其他记录,并且永远不会安静.由于父/子的性质,它似乎不是一个好的候选人(似乎)SqlBulkCopy.
在C#中使用SqlCommand,INSERT我得到大约400-500条记录/秒插入,这有点太慢了.伪代码:
foreach(Record r in parentRecords)
{
Insert Fields from r into SqlCommand Parameters but not "recno"
Call ExecuteScalar to insert and fetch the inserted identity value (recno)
foreach(ChildRecord cr in parentRecords.Children)
{
Insert Fields from cr into SqlCommand Parameters
Insert the identity value …Run Code Online (Sandbox Code Playgroud) 我需要从表中删除一些记录,然后将一些记录插入到同一个表中.此删除和插入过程应该在事务中.
以下是我的所作所为.
using (SqlConnection sqlConn = new SqlConnection(connectionString))
{
sqlConn.Open();
using (SqlTransaction sqlTran = sqlConn.BeginTransaction())
{
string deleteQuery = "delete from dbo.MyTable where Col1 =" + colValue;
SqlCommand sqlComm = new SqlCommand(deleteQuery, sqlConn,sqlTran);
sqlComm.ExecuteNonQuery();
using (SqlBulkCopy sqlcopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTran))
{
sqlcopy.BatchSize = 10;
sqlcopy.DestinationTableName = "MyTable";
try
{
sqlcopy.WriteToServer(dsDataSet.Tables[0]);
sqlTran.Commit();
}
catch (Exception ex)
{
sqlTran.Rollback();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想因为删除操作没有在插入之前执行,我得到重复的键错误.有人可以帮忙.
我已经在SQL Server中有一些表,我正在编写一个C#程序来填充一些平面文件中的表.我打算用来SQLBulkCopy加载表格.
为SQLBulkCopy定义每个DataTable的所有列可能需要做很多工作.是否可以从现有SQL Server表的定义中轻松地在C#中生成这些DataTable?
我无法使用Bulk insert或bcp因为平面文件处于不同的奇怪布局,并且在插入之前必须通过一些C#代码进行解析.
我有一个ssis包,我使用sql作业运行,用于将数据从一个数据库批量复制到另一个数据库.目的地是我们的集成服务器,我们有足够的空间存放数据库.但是,当我运行这个工作(即包).它在localsettings/temp文件夹中创建了大量的临时文件,按1GB mdf文件的顺序创建了大约20GB的临时文件.我手动创建了这个包,并没有使用导入导出向导.任何人都可以帮助我在执行时如何避免这种巨大的临时文件吗?如果需要进一步的细节,请提及.
注意:很多人说如果我们使用导入导出向导创建一个包并为许多表设置优化,则会发生这种情况.但是在这个包中我只查询一个表并且手动创建而不使用导入导出向导.
我正在使用以下代码将Excel文件更新为SQL Server。代码正在运行,但是无法将第一行插入表中。
OleDbConnection OleDb = new OleDbConnection(ConnectionString);
OleDbCommand OleDbCmm = new OleDbCommand(Query,OleDb);
OleDbDataReader OleDbdr;
OleDb.Open();
if (OleDb.State == ConnectionState.Open)
{
OleDbdr = OleDbCmm.ExecuteReader();
SqlBulkCopy BulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["connstring"].ToString());
BulkCopy.DestinationTableName = "TempTable";
if (OleDbdr.Read())
{
BulkCopy.WriteToServer(OleDbdr);
}
}
OleDb.Close();
Run Code Online (Sandbox Code Playgroud) 我正在使用SqlBulkCopy类在表中一次插入50k行tbl_records
我After Insert在此表上设置了一个触发器并使用以下代码
SqlBulkCopy SqlBc1 = new SqlBulkCopy(strConnString, SqlBulkCopyOptions.FireTriggers);
// Set DataReader For SqlBulkCopy
sqlComm = new SqlCommand(strQuery, sqlTemCon);
sqlComm.CommandTimeout = 3600000;
sqlComm.CommandType = System.Data.CommandType.Text;
SqlDataReader dReader = sqlComm.ExecuteReader();
SqlBc1.WriteToServer(dReader);
Run Code Online (Sandbox Code Playgroud)
但执行前后.它只触发First 50k插入的行
我想它应该为每一行开火.我怎样才能做到这一点??
sqlbulkcopy ×10
c# ×5
sql-server ×2
.net ×1
ado.net ×1
asp.net ×1
bulkinsert ×1
datatable ×1
ef-core-2.2 ×1
java ×1
jdbc ×1
sql ×1
ssis ×1
transactions ×1
triggers ×1
winforms ×1