数据批量入库,如何跳过已经存在的记录?

ynduanlian 2011-03-10 11:04:17
数据库中有一个表Banknotes,其中Code是主键。
在页面上放了一个文本框:txtCodes,用下面的代码多行输入多条记录的Code。
因为数据库中定义了Code为主键,如果输入的批量中有已存在表中的记录,程序就出错。
怎么改写能实现:Insert没有问题的数据后,显示那些因为Code在表中已存在,所以没有Insert的数据?
Dim Cn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("db1.mdb"))
Dim StrCode() As String
StrCode = txtCodes.Text.Replace(vbTab, "").Split(vbCr)

Dim StrParvalue As String
If RbLstParvalue.SelectedValue <> "" Then
StrParvalue = RbLstParvalue.SelectedValue
Else
Exit Sub
End If

Dim Cmd As OleDb.OleDbCommand = New OleDb.OleDbCommand
Cmd.Connection = Cn
Cn.Open()
Dim I As Integer
Dim iC As Integer = 0
Dim bErr As Boolean = False
Try
For I = LBound(StrCode) To UBound(StrCode)
If Len(StrCode(I)) = 10 Then
Cmd.CommandText = "Insert Into [Banknotes]([Code],[ParvalueCode]) Values('" & StrCode(I) & "','" & StrParvalue & "')"
Cmd.ExecuteNonQuery()
iC = iC + 1
End If
Next
Catch
bErr = True
If Len(StrCode(I)) = 10 Then
Response.Write(StrCode(I) & "入库失败,已有相同编号记录存在!")
End If
Finally
Cn.Close()
End Try
Dim StrJsc As String
If Not bErr Then
StrJsc = "<" & "script language=JavaScript>alert('保存成功" & CStr(iC) & "条记录!'); window.location.href='query.aspx';" & vbCrLf & "</" & "script>"
Else
StrJsc = "<" & "script language=JavaScript>alert('保存成功" & CStr(iC) & "条记录!'); " & vbCrLf & "</" & "script>"
End If
ClientScript.RegisterClientScriptBlock(Me.GetType, "alert", StrJsc)

但是如果用上面的代码,第一第记录成功Insert 后,第二条记录表中已有数据,但是bErr仍然是True值,这是怎么回事?
...全文
674 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ynduanlian 2011-03-14
  • 打赏
  • 举报
回复
insert into table1 select * from table2 minus select * from table1 ?
ynduanlian 2011-03-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 harvesthouhao 的回复:]
提供一个思路:把要插入的ID集合与数据库现有数据比较可以拿回不重复的ID,然后将这些ID对应的数据插入数据库
[/Quote]
有理!我想到的办法是建立一个临时表,先把所有纪录写入临时表,然后把临时表和正式表相minus运算后的结果集写入正式表,这样会不会好一些?
begintransaction 2011-03-11
  • 打赏
  • 举报
回复
SqlDataAdapter apr

SqlCommandBuilder blr=new SqlCommandBuilder(apr);

apr.Update(dt);
harvesthouhao 2011-03-11
  • 打赏
  • 举报
回复
提供一个思路:把要插入的ID集合与数据库现有数据比较可以拿回不重复的ID,然后将这些ID对应的数据插入数据库
ChinaXtHuLang 2011-03-11
  • 打赏
  • 举报
回复
vb.net。哎。。不懂。
  • 打赏
  • 举报
回复
一次读进来可以有效防止频繁读数据库(Access这方面是弱一点)
  • 打赏
  • 举报
回复
也可以在插入数据准备好后,把所有的编号(主键)读进来,然后遍历对比,这个也是比较快的
其实在数据库里单独地主键比较是非常快的
  • 打赏
  • 举报
回复
给编号建唯一索引
try
{
//insert
}
catch
{
continue;
}
如果碰到相同的编号,因为有索引约束,所以肯定是插不进去的。不妨一失,目的可以达到,但是要浪费点系统资源
ynduanlian 2011-03-11
  • 打赏
  • 举报
回复
如果插入每条记录之前都去查一次,不是很消耗资源吗?
因为是ACCESS数据库,又没法用存储过程之类的东东……
子夜__ 2011-03-10
  • 打赏
  • 举报
回复
主键要唯一 不唯一肯定要出错

插入之前判断一下。


neng168 2011-03-10
  • 打赏
  • 举报
回复
vb.net的语法,久违了
wanghui0380 2011-03-10
  • 打赏
  • 举报
回复
不多做解释

自己去msdn看
dataTable.merge()
dataTable.select()
adapter.update()

这几个方法的说明和示例

ps:ADO.NET本身实际就是按离线数据模式开发滴,既然是离线,那么自然就应该有在连线的时候同步数据的能力,这是Ado.net本身就应该有的功能
ynduanlian 2011-03-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxr0323 的回复:]
主键要唯一 不唯一肯定要出错

插入之前判断一下。
[/Quote]
如果插入每条记录之前都去查一次,不是很消耗资源吗?

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧