简单的控制台应用程序SQL更新查询 - 计时

时间:2013-04-16 15:13:36

标签: sql-server vb.net

我有以下VB.Net控制台应用程序子例程,它从表中读取电子邮件并尝试发送它们,如果它成功发送它,它将随时更新发送的数据库。

此代码工作正常,但我现在收到以下错误:

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应。

我尝试在管理工作室中单独运行SQL脚本,它运行正常。

我也尝试过验证服务器空间和数据库大小,两者都很好。

任何人都可以帮忙解决问题吗?

Connection(True)
    Using comSQL As New SqlCommand("SELECT * FROM Seq_Emails_ToSend", conSQL)
        Using dr As SqlDataReader = comSQL.ExecuteReader
            While dr.Read

                Dim madTO As MailAddressCollection = ConvertStringtoMAD(dr("Email_TO").ToString)
                Dim madCC As MailAddressCollection = ConvertStringtoMAD(dr("Email_CC").ToString)
                Dim madBCC As MailAddressCollection = ConvertStringtoMAD(dr("Email_BCC").ToString)
                Dim isHTML As Boolean = CBool(dr("Email_HTML").ToString)
                Dim Priority As MailPriority = CInt(dr("Email_Priority").ToString)
                Dim Subject As String = CStr(dr("Email_Subject").ToString)
                Dim Body As String = CStr(dr("Email_Body").ToString)
                Dim ID As Integer = CInt(dr("Email_ID").ToString)
                Dim Status As String

                If EmailFile(madTO, madCC, madBCC, "", isHTML, Priority, Subject, Body) Then
                    Status = "Sent"
                Else
                    Status = "Failed"
                End If

                Using comSQL2 As New SqlCommand("UPDATE Seq_Emails SET [Status] = @Status, [Date_Sent] = @Date WHERE Email_ID = @ID", conSQL)
                    comSQL2.Parameters.Add("@ID", SqlDbType.Int).Value = ID
                    comSQL2.Parameters.Add("@Status", SqlDbType.NVarChar).Value = Status
                    comSQL2.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Now

                    comSQL2.ExecuteNonQuery()
                End Using

            End While
        End Using
    End Using
    Connection(False)

2 个答案:

答案 0 :(得分:1)

我认为你是在封锁自己。

使用一个SqlDataReader读取所有数据,并将其放入一个简单的DTO对象并收集DTO对象。 完全处理/关闭此SqlDataReader。

然后尝试发送电子邮件,然后发出一个UPDATE命令。

另一种说法是,从comSQL内部尝试UNNEST comSQL2。

这是一个简单的IDataReader到DTO示例。

Why is DataTable faster than DataReader

答案 1 :(得分:0)

如上所述,似乎我必须取消嵌套2平方的场地。

在下面的代码中,根据电子邮件处理的结果,主键已添加到列表中:

                If EmailFile(madTO, madCC, madBCC, "", isHTML, Priority, Subject, Body) Then
                    intSent.Add(CInt(dr("Email_ID").ToString))
                Else
                    intFailed.Add(CInt(dr("Email_ID").ToString))
                End If

然后,一旦发送过程完成,我就会在2个单独的列表或主键上运行更新查询以进行更新。

    Using comSQL2 As New SqlCommand("UPDATE Seq_Emails SET [Status] = @Status, [Date_Sent] = @Date WHERE Email_ID = @ID", conSQL)
        For Each Email_ID As Integer In intSent
            comSQL2.Parameters.Clear()
            comSQL2.Parameters.Add("@ID", SqlDbType.Int).Value = Email_ID
            comSQL2.Parameters.Add("@Status", SqlDbType.NVarChar).Value = "Sent"
            comSQL2.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Now
            comSQL2.ExecuteNonQuery()
        Next
        For Each Email_ID As Integer In intFailed
            comSQL2.Parameters.Clear()
            comSQL2.Parameters.Add("@ID", SqlDbType.Int).Value = Email_ID
            comSQL2.Parameters.Add("@Status", SqlDbType.NVarChar).Value = "Failed"
            comSQL2.Parameters.Add("@Date", SqlDbType.DateTime).Value = DateTime.Now
            comSQL2.ExecuteNonQuery()
        Next
    End Using

我确信有更简单的方法可以做到这一点 - 不过在这种情况下它对我有用。