• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

sqlbulkcopy问题

lsjlove 2011-12-19 11:16:31
今天早上做了实验用了用 SQLBulkCopy,代码如下:

using (SqlConnection conn = new SqlConnection(DbHelperSQL.GetConnectionString(ConnectionString.Scm)))
{
conn.Open();
using(SqlTransaction transaction=conn.BeginTransaction())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default, transaction))
{
try
{
bulkCopy.BatchSize = batchsize;
bulkCopy.BulkCopyTimeout = 600;
bulkCopy.ColumnMappings.Add("CardID", "CardID");
bulkCopy.ColumnMappings.Add("UserID", "UserID");
bulkCopy.ColumnMappings.Add("CardPassWord", "CardPassWord");
bulkCopy.ColumnMappings.Add("Note", "Note");
bulkCopy.ColumnMappings.Add("IsUse", "IsUse");
bulkCopy.ColumnMappings.Add("ActivitiesID", "ActivitiesID");
//bulkCopy.NotifyAfter = 2000;
//bulkCopy.SqlRowsCopied += new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
bulkCopy.DestinationTableName = "dbo.card";
bulkCopy.WriteToServer(data);
transaction.Commit();

}
catch (Exception ex)
{
transaction.Rollback();
throw new Exception("导入数据错误");

}
}
}

}

}

数据库中表结构如下示:

[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[UserID] [int] NOT NULL,
[FormCode] [bigint] NULL,
[CardID] [nvarchar](50) NOT NULL,
[CardPassWord] [nvarchar](50) NOT NULL,
[Note] [nvarchar](500) NULL,
[PostDate] [datetime] NULL,
[IsUse] [smallint] NULL,
[MobilePhone] [nvarchar](20) NULL,
[ActivitiesID] [int] NULL,
[ElesID] [int] NULL,
[SendTime] [datetime] NULL,

代码中我是从excel中读入的数据,所以临时添加了一个表格,代码如下:

DataTable data = new DataTable();
data.Columns.Add(new DataColumn("ID", typeof(int)));
data.Columns.Add(new DataColumn("UserID", typeof(int)));
data.Columns.Add(new DataColumn("CardID", typeof(string)));
data.Columns.Add(new DataColumn("CardPassWord", typeof(string)));
data.Columns.Add(new DataColumn("Note", typeof(string)));
data.Columns.Add(new DataColumn("IsUse", typeof(int)));
data.Columns.Add(new DataColumn("ActivitiesID", typeof(int)));


int nCardIndex = 0;
int nRowCounts = dt.Rows.Count;
for (var i = 0; i < nRowCounts; i++)
{
DataRow row = data.NewRow();
row["CardID"] = dt.Rows[i].Field<string>("CardID");
row["CardPassWord"] = dt.Rows[i].Field<string>("CardPassWord");
row["Note"] = this.Note;
row["IsUse"] = 0;
row["ActivitiesID"] = this.ActivityId;
row["UserID"] = 0;
data.Rows.Add(row);
}


我试着插入一条数据或者 20万条数据,去数据库查询的时候 ,的确是插进去了,但是 等执行完成的时候,数据库中插入的数据又没有了。难道自动回滚了?没有报错啊 。请大家给指点指点。
...全文
271 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lsjlove 2011-12-19
[Quote=引用 5 楼 jiangfling 的回复:]

BeginTransaction()
对应的End呢?加上试试

try catch finally 最好这样用
[/Quote]我直插入一行的数据时 ,没有数据错误,源数据列 与目标数据表的列数没必要一一对应吧?^_^
回复
lsjlove 2011-12-19
[Quote=引用 5 楼 jiangfling 的回复:]

BeginTransaction()
对应的End呢?加上试试

try catch finally 最好这样用
[/Quote]呵呵 在第二个 using块里呢
回复
PaulyJiang 2011-12-19
BeginTransaction()
对应的End呢?加上试试

try catch finally 最好这样用
回复
赳赳老陈 2011-12-19
可能是excel表格中有非法的数据吧,导致报错回滚了
建议对每一个字段进行合法性判断,把非法和无法转换的数据过滤掉
回复
阿非 2011-12-19
transaction.Commit();
后面加句 输出到日志的话

应该是错误导致回滚了
回复
lsjlove 2011-12-19
[Quote=引用 1 楼 sdfkfkd 的回复:]


transaction.Rollback();
加一个断点
可能是某些数据有问题,最终导致回滚了
看是哪些数据有问题,再做调整
[/Quote]
我加了 ,但代码根本就没就进入catch块里
回复
特别 2011-12-19

transaction.Rollback();
加一个断点
可能是某些数据有问题,最终导致回滚了
看是哪些数据有问题,再做调整
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2011-12-19 11:16
社区公告

让您成为最强悍的C#开发者