我想从vb.net datagridview的插入1500行到MS Access数据库。
插入到400行没有问题,但高于400行的示值误差 - 系统的资源超出。
即时通讯使用低于code。错误是突出为:
readinputs = dbup.ExecuteReader(),有时
.ExecuteNonQuery()
昏暗Dbcon作为新的OleDbConnection(connStr)
Dbcon.Open()
昏暗的查询作为字符串
昏暗dbup作为新的OleDbCommand
昏暗readinputs作为OleDbDataReader
如果X为整数= 0要IncomingMailDGV.Rows.Count - 1
DIM收到的String = IncomingMailDGV.Rows(X).Cells(0).value的
昏暗主题的String = IncomingMailDGV.Rows(X).Cells(1).value的
昏暗的内容作为字符串= IncomingMailDGV.Rows(X).Cells(2).value的
查询=选择ReceivedDateTime,主题,MessageContents从IncomingAlerts WHERE ReceivedDateTime = @ReceivedDateTime和MessageContents = @ MessageContents
dbup =新的OleDbCommand(查询,Dbcon)
dbup.Parameters.AddWithValue(ReceivedDateTime,收到)
dbup.Parameters.AddWithValue(MessageContents,内容)
readinputs = dbup.ExecuteReader()
如果readinputs.HasRows = false,那么
昏暗InsertData作为字符串
InsertData =INSERT INTO IncomingAlerts(ReceivedDateTime,主题,MessageContents)值(@ReceivedDateTime,@subject,@MessageContents)
dbup =新的OleDbCommand(InsertData)
dbup.Parameters.AddWithValue(ReceivedDateTime,收到)
dbup.Parameters.AddWithValue(主题,主题)
dbup.Parameters.AddWithValue(MessageContents,内容)
随着dbup
.CommandText = InsertData
■连接= Dbcon
.ExecuteNonQuery()
结束与
结束如果
下一个
解决方案
循环,因为,要创建最多2 的OleDbCommand
每行(一个对象的 SELECT
,也许一个是更新
),但从来没有处置它们。你可以使用 cmd.Parameters.Clear
来重用他们,但我会砍那个东西成一个控制程序,使其更简单。 的东西的是这样的:
'如果AllowUsersToAddRows是真的,这将循环太多了:
如果X为整数= 0要IncomingMailDGV.Rows.Count - 1
DIM收到= IncomingMailDGV.Rows(X).Cells(0).Value.ToString
昏暗的内容= IncomingMailDGV.Rows(X).Cells(2).Value.ToString
昏暗的主题= IncomingMailDGV.Rows(X).Cells(1).Value.ToString
如果ItemExists(接收的内容)= false,那么
InsertItem(接收,内容,主题)
结束如果
下一个
然后佣工这是自包含的,经过自己清理:
专用功能ItemExists(接收作为字符串,
内容作为字符串)作为布尔
昏暗的查询作为字符串=SELECT ReceivedDateTime,主题,MessageContents从IncomingAlerts WHERE ReceivedDateTime = @ReceivedDateTime和MessageContents = @ MessageContents
使用dbcon作为新的OleDbConnection(connstr)
dbcon.Open
使用CMD作为新的OleDbCommand(查询,dbcon)
cmd.Parameters.AddWithValue((ReceivedDateTime,收到)
cmd.Parameters.AddWithValue(MessageContents,内容)
昏暗的RDR作为OleDbDataReader
RDR = cmd.ExecuteReader
'更容易将查询转换为一个SELECT COUNT
返回rdr.HasRows
结束使用
结束使用
端功能
私有函数InsertItem(接收作为字符串,
内容作为字符串,主体作为字符串)作为布尔
昏暗的sql =INSERT INTO IncomingAlerts(ReceivedDateTime,主题,MessageContents)值(@ReceivedDateTime,@subject,@MessageContents)
昏暗的行作为整数
使用dbcon作为新的OleDbConnection(connstr)
使用CMD作为新的OleDbCommand(SQL,dbcon)
dbcon.Open
cmd.Parameters.AddWithValue(@ ReceivedDateTime,收到)
cmd.Parameters.AddWithValue(@主体,主体)
cmd.Parameters.AddWithValue(@ MessageContents,内容)
行= cmd.ExecuteNonQuery
返回行<> 0
结束使用
结束使用
端功能
我也让他们有点短,通过使用构造函数重载。例如,对于OleDbCommand的,我通过SQL并创建而不是单独设置这些属性,当它连接到它。如果你愿意,你可以堆叠命令,并连接到一个使用
:
使用dbcon作为新的OleDbConnection(connstr)
CMD作为新的OleDbCommand(SQL,dbcon)
dbcon.Open
...
结束使用
这降低了自动缩进一个级别,但VS不会喜欢它或者与 dbCon
参数帮助,直到你完成它。
您也可以通过DGV行或行索引的助手,让他们捞出的数据。至于是,它能够完成一次。还有其他的事情可以做,例如只使用SQL 计数
,以确定是否有任何匹配的行等。
在主的点处置连接
和命令
的对象,当您完成它们。
I want to insert 1500 rows to Ms access database from vb.net datagridview.
Inserting up to 400 rows no issue, but above 400 rows its showing error - System resource exceeded.
Im using below code. The error is highlighting to:
readinputs = dbup.ExecuteReader() and sometimes
.ExecuteNonQuery()
Dim Dbcon As New OleDbConnection(connStr)
Dbcon.Open()
Dim query As String
Dim dbup As New OleDbCommand
Dim readinputs As OleDbDataReader
For x As Integer = 0 To IncomingMailDGV.Rows.Count - 1
Dim received As String = IncomingMailDGV.Rows(x).Cells(0).Value
Dim subject As String = IncomingMailDGV.Rows(x).Cells(1).Value
Dim contents As String = IncomingMailDGV.Rows(x).Cells(2).Value
query = "SELECT ReceivedDateTime, Subject, MessageContents FROM IncomingAlerts WHERE ReceivedDateTime = @ReceivedDateTime AND MessageContents =@MessageContents"
dbup = New OleDbCommand(query, Dbcon)
dbup.Parameters.AddWithValue("ReceivedDateTime", received)
dbup.Parameters.AddWithValue("MessageContents", contents)
readinputs = dbup.ExecuteReader()
If readinputs.HasRows = False Then
Dim InsertData As String
InsertData = "INSERT INTO IncomingAlerts(ReceivedDateTime, Subject, MessageContents) Values (@ReceivedDateTime, @Subject, @MessageContents)"
dbup = New OleDbCommand(InsertData)
dbup.Parameters.AddWithValue("ReceivedDateTime", received)
dbup.Parameters.AddWithValue("Subject", subject)
dbup.Parameters.AddWithValue("MessageContents", contents)
With dbup
.CommandText = InsertData
.Connection = Dbcon
.ExecuteNonQuery()
End With
End If
Next
解决方案
Because of the loop, you are creating up to 2 OleDbCommand
objects per row (one for the SELECT
and maybe one for the UPDATE
), but never disposing of them. You could use cmd.Parameters.Clear
to reuse them, but I would chop that thing up into a control procedure to make it simpler. Something like this:
' if AllowUsersToAddRows is true, this will loop one too many:
For x As Integer = 0 To IncomingMailDGV.Rows.Count - 1
Dim received = IncomingMailDGV.Rows(x).Cells(0).Value.ToString
Dim contents = IncomingMailDGV.Rows(x).Cells(2).Value.ToString
Dim subject = IncomingMailDGV.Rows(x).Cells(1).Value.ToString
If ItemExists(received, contents) = False Then
InsertItem(received, contents, subject)
End If
Next
Then helpers which are self contained and clean up after themselves:
Private Function ItemExists(received As String,
contents As String) As Boolean
Dim query As String = "SELECT ReceivedDateTime, Subject, MessageContents FROM IncomingAlerts WHERE ReceivedDateTime = @ReceivedDateTime AND MessageContents =@MessageContents"
Using dbcon As New OleDbConnection(connstr)
dbcon.Open
Using cmd As New OleDbCommand(query, dbcon)
cmd.Parameters.AddWithValue(("ReceivedDateTime", received)
cmd.Parameters.AddWithValue("MessageContents", contents)
Dim rdr As OleDbDataReader
rdr = cmd.ExecuteReader
' easier to convert the query to a SELECT COUNT
Return rdr.HasRows
End Using
End Using
End Function
Private Function InsertItem(received As String,
contents As String, subj As String) As Boolean
Dim sql = "INSERT INTO IncomingAlerts(ReceivedDateTime, Subject, MessageContents) Values (@ReceivedDateTime, @Subject, @MessageContents)"
Dim rows As Integer
Using dbcon As New OleDbConnection(connstr)
Using cmd As New OleDbCommand(sql, dbcon)
dbcon.Open
cmd.Parameters.AddWithValue("@ReceivedDateTime", received)
cmd.Parameters.AddWithValue("@Subject", subj)
cmd.Parameters.AddWithValue("@MessageContents", contents)
rows = cmd.ExecuteNonQuery
Return rows <> 0
End Using
End Using
End Function
I also made them a little shorter by using the constructor overloads. For instance, with OleDbCommand, I pass the SQL and the connection to it when it is created rather than set those properties individually. If you want, you can 'stack' the Command and Connection into one Using
:
Using dbcon As New OleDbConnection(connstr),
cmd As New OleDbCommand(sql, dbcon)
dbcon.Open
...
End Using
This reduces the auto-indentation by one level, but VS wont like it much or help with the dbCon
argument until you complete it.
You could also pass the dgv row or row index to the helpers and let them fish out the data. As is, it gets done only once. There are other things you could do such as just use SQL Count
to determine if the are any matching rows etc.
The main point is disposing of Connection
and Command
objects when you are done with them.
上一篇:Cocos2D:通过 CCCallFuncND 传递一个 CGPointCocos2D、CCCallFuncND、CGPoint
下一篇:在 cocos2d 中如何实现 touch hash code 并在后面引用呢?并在、如何实现、后面、cocos2d