女士访问 - 系统的资源超过插入行女士、系统、资源

2023-09-07 08:48:31 作者:回不去的曾经!

我想从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 = @ M​​essageContents
    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(接收,内容,主题)

    结束如果
下一个
 
第123期上海精品课堂 让教练文化为企业注入生命力

然后佣工这是自包含的,经过自己清理:

 专用功能ItemExists(接收作为字符串,
       内容作为字符串)作为布尔
    昏暗的查询作为字符串=SELECT ReceivedDateTime,主题,MessageContents从IncomingAlerts WHERE ReceivedDateTime = @ReceivedDateTime和MessageContents = @ M​​essageContents
    使用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.