【问题标题】:Timeout expired VB WebService Method Error超时过期 VB WebService 方法错误
【发布时间】:2015-04-29 16:21:48
【问题描述】:

我正在使用一种将数据库内容显示为 Json 数组的方法。有时它有效但它给了我很多次这个错误:

超时。在获得一个之前的超时时间 来自池的连接。这可能是因为所有汇集的 正在使用连接并且已达到最大池大小

顺便说一句,其他方法可以完美运行,但这个方法是这样的

这是 WebMethod 代码:

<WebMethod>
Public Sub AfterOrdersInsert(JSONString As [String])
    Try
        Dim context As HttpContext = Me.Context
        Dim strJson As String = ""
        Dim OrderItems As JArray = JArray.Parse(JSONString)
        'Dim IncrementalConnection As New SqlConnection()
        Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("MyCString").ConnectionString)
        For Each OrderItem As JObject In OrderItems
            conn.Open()
            Dim SelectQuery As String = "SELECT * FROM Orders WHERE OrderId = @a AND Name = @b"
            Dim SelectCommand As New SqlCommand(SelectQuery, conn)
            SelectCommand.Parameters.AddWithValue("@a", OrderItem.Item("OrderId").ToString())
            SelectCommand.Parameters.AddWithValue("@b", OrderItem.Item("Name").ToString())
            Dim reader = SelectCommand.ExecuteReader()
            Dim isExist = reader.HasRows
            Dim OrderQuantity As Integer = 0
            If isExist Then
                reader.Read()
                OrderQuantity = Convert.ToInt32(reader.GetString(reader.GetOrdinal("ProductQuantity"))) + Convert.ToInt32(OrderItem.Item("ProductQuantity").ToString())
            End If
            conn.Close()
            'Using reader = SelectCommand.ExecuteReader()
            If isExist Then
                'If reader.Read() Then
                conn.Open()
                Dim Price = OrderQuantity * Convert.ToDouble(OrderItem.Item("Price").ToString())
                Dim UpdateQuery As String = "UPDATE Orders SET ProductQuantity = @c, Price = @d WHERE OrderId = @e AND Name = @f"
                Dim UpdateCommand As New SqlCommand(UpdateQuery, conn)
                UpdateCommand.Parameters.AddWithValue("@c", OrderQuantity.ToString())
                UpdateCommand.Parameters.AddWithValue("@d", Price.ToString())
                UpdateCommand.Parameters.AddWithValue("@e", OrderItem.Item("OrderId").ToString())
                UpdateCommand.Parameters.AddWithValue("@f", OrderItem.Item("Name").ToString())
                UpdateCommand.ExecuteNonQuery()
                conn.Close()
            Else
                Dim strSQL As String = "insert into Orders(ProductNumber,Name,Category,Price,OrderId,TableNumber,WaiterName,CashierName,DateAndTime,isActive,isCoocked,isPaid,isYesCanceled,ProductQuantity) values(@x,@y,@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l)"
                conn.Open()
                Dim cmd As New SqlCommand(strSQL, conn)
                cmd.Parameters.AddWithValue("@x", OrderItem.Item("ProductNumber").ToString())
                cmd.Parameters.AddWithValue("@y", OrderItem.Item("Name").ToString())
                cmd.Parameters.AddWithValue("@a", OrderItem.Item("Category").ToString())
                cmd.Parameters.AddWithValue("@b", Convert.ToDouble(OrderItem.Item("Price").ToString()) * Convert.ToInt32(OrderItem.Item("ProductQuantity").ToString()))
                cmd.Parameters.AddWithValue("@c", OrderItem.Item("OrderId").ToString())
                cmd.Parameters.AddWithValue("@d", OrderItem.Item("TableNumber").ToString())
                cmd.Parameters.AddWithValue("@e", OrderItem.Item("WaiterName").ToString())
                cmd.Parameters.AddWithValue("@f", OrderItem.Item("CashierName").ToString())
                cmd.Parameters.AddWithValue("@g", OrderItem.Item("DateAndTime").ToString())
                cmd.Parameters.AddWithValue("@h", OrderItem.Item("isActive").ToString())
                cmd.Parameters.AddWithValue("@i", OrderItem.Item("isCoocked").ToString())
                cmd.Parameters.AddWithValue("@j", OrderItem.Item("isPaid").ToString())
                cmd.Parameters.AddWithValue("@k", OrderItem.Item("isYesCanceled").ToString())
                cmd.Parameters.AddWithValue("@l", OrderItem.Item("ProductQuantity").ToString())
                cmd.ExecuteNonQuery()
                conn.Close()
            End If
            'End Using
        Next
        'ProductNumber As [String], Name As [String], Category As [String], Price As [String], OrderId As [String]'
        'this is the bridge to database\

        strJson = "{" + "" + "contact" + "" + ":" + "[" + "{" + "result" + "" + ":" + serializer.Serialize("1") + "}" + "]" + "}"
        context.Response.Write(strJson)

    Catch ex As Exception
        Dim strJson As String
        strJson = "{" + "" + "contact" + "" + ":" + "[" + "{" + "result" + "" + ":" + serializer.Serialize("0") + ex.Message + "}" + "]" + "}"
        Context.Response.Write(strJson)

    End Try
End Sub

【问题讨论】:

  • 欢迎来到 Stack Overflow! ASMX 是一项遗留技术,不应用于新开发。 WCF 或 ASP.NET Web API 应用于 Web 服务客户端和服务器的所有新开发。一个提示:微软已经在 MSDN 上停用了ASMX Forum

标签: json database vb.net web-services asmx


【解决方案1】:

你的问题是:

  1. 你没有处理你的连接(你不是在所有情况下都关闭它们)。您应该使用 Using 块包装此代码,以便您知道连接和其他资源(例如命令)已被释放。
  2. 您在循环中反复打开和关闭连接:
    对于每个 OrderItem 作为 OrderItems 中的 JObject
        conn.Open()
    

将您的代码更改为:

<WebMethod>
Public Sub AfterOrdersInsert(JSONString As [String])
    Try
        Dim context As HttpContext = Me.Context
        Dim strJson As String = ""
        Dim OrderItems As JArray = JArray.Parse(JSONString)
        'Dim IncrementalConnection As New SqlConnection()
        Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("MyCString").ConnectionString)

            conn.Open() ' Don't repeatedly open & close the connection.

            For Each OrderItem As JObject In OrderItems
                Dim OrderQuantity As Integer = 0
                Dim isExist As Boolean = False
                Dim SelectQuery As String = "SELECT * FROM Orders WHERE OrderId = @a AND Name = @b"
                Using SelectCommand As New SqlCommand(SelectQuery, conn)
                    SelectCommand.Parameters.AddWithValue("@a", OrderItem.Item("OrderId").ToString())
                    SelectCommand.Parameters.AddWithValue("@b", OrderItem.Item("Name").ToString())
                    Using reader = SelectCommand.ExecuteReader()
                        isExist = reader.HasRows
                        If isExist Then
                            reader.Read()
                            OrderQuantity = Convert.ToInt32(reader.GetString(reader.GetOrdinal("ProductQuantity"))) + Convert.ToInt32(OrderItem.Item("ProductQuantity").ToString())
                        End If
                    End Using
                End Using 

                If isExist Then
                    Dim Price = OrderQuantity * Convert.ToDouble(OrderItem.Item("Price").ToString())
                    Dim UpdateQuery As String = "UPDATE Orders SET ProductQuantity = @c, Price = @d WHERE OrderId = @e AND Name = @f"
                    Using UpdateCommand As New SqlCommand(UpdateQuery, conn)
                        UpdateCommand.Parameters.AddWithValue("@c", OrderQuantity.ToString())
                        UpdateCommand.Parameters.AddWithValue("@d", Price.ToString())
                        UpdateCommand.Parameters.AddWithValue("@e", OrderItem.Item("OrderId").ToString())
                        UpdateCommand.Parameters.AddWithValue("@f", OrderItem.Item("Name").ToString())
                        UpdateCommand.ExecuteNonQuery()
                    End Using
                Else
                    Dim strSQL As String = "insert into Orders(ProductNumber,Name,Category,Price,OrderId,TableNumber,WaiterName,CashierName,DateAndTime,isActive,isCoocked,isPaid,isYesCanceled,ProductQuantity) values(@x,@y,@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l)"
                    Using cmd As New SqlCommand(strSQL, conn)
                        cmd.Parameters.AddWithValue("@x", OrderItem.Item("ProductNumber").ToString())
                        cmd.Parameters.AddWithValue("@y", OrderItem.Item("Name").ToString())
                        cmd.Parameters.AddWithValue("@a", OrderItem.Item("Category").ToString())
                        cmd.Parameters.AddWithValue("@b", Convert.ToDouble(OrderItem.Item("Price").ToString()) * Convert.ToInt32(OrderItem.Item("ProductQuantity").ToString()))
                        cmd.Parameters.AddWithValue("@c", OrderItem.Item("OrderId").ToString())
                        cmd.Parameters.AddWithValue("@d", OrderItem.Item("TableNumber").ToString())
                        cmd.Parameters.AddWithValue("@e", OrderItem.Item("WaiterName").ToString())
                        cmd.Parameters.AddWithValue("@f", OrderItem.Item("CashierName").ToString())
                        cmd.Parameters.AddWithValue("@g", OrderItem.Item("DateAndTime").ToString())
                        cmd.Parameters.AddWithValue("@h", OrderItem.Item("isActive").ToString())
                        cmd.Parameters.AddWithValue("@i", OrderItem.Item("isCoocked").ToString())
                        cmd.Parameters.AddWithValue("@j", OrderItem.Item("isPaid").ToString())
                        cmd.Parameters.AddWithValue("@k", OrderItem.Item("isYesCanceled").ToString())
                        cmd.Parameters.AddWithValue("@l", OrderItem.Item("ProductQuantity").ToString())
                        cmd.ExecuteNonQuery()
                    End Using
                End If
            Next
        End Using ' this will close the connection

        'ProductNumber As [String], Name As [String], Category As [String], Price As [String], OrderId As [String]'
        'this is the bridge to database\

         strJson = "{" + "" + "contact" + "" + ":" + "[" + "{" + "result" + "" + ":" + serializer.Serialize("1") + "}" + "]" + "}"
         context.Response.Write(strJson)

    Catch ex As Exception
        Dim strJson As String
        strJson = "{" + "" + "contact" + "" + ":" + "[" + "{" + "result" + "" + ":" + serializer.Serialize("0") + ex.Message + "}" + "]" + "}"
        Context.Response.Write(strJson)

    End Try
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2012-02-20
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    相关资源
    最近更新 更多