2013-09-30 35 views
1

我有一个非常简单的Web服务函数,它从数据库中提取数据并将其返回给用户。不过,我最近发现(通过登录数据库端)该呼叫正在执行TWICE。我已经缩小到导致问题的web服务...如果我通过本地主机上的浏览器打开服务,然后直接执行它,SQL日志显示它已在大约1/100秒内运行两次。WebService调用数据库两次

我包括我的指导代码。内置VS2008。

<WebMethod()> _ 
Public Function MY_DATABASE_QUERY() As DataSet 
    Dim DS As New DataSet 
    Dim DA As New SqlDataAdapter 
    Dim Cmd As New SqlCommand 
    With Cmd 
     .Connection = Connection() 
     .CommandType = CommandType.StoredProcedure 
     .CommandText = "SOME_STORED_PROCEDURE" 
     .Connection.Open() 
     .ExecuteReader() 
     .Connection.Close() 
     DA.SelectCommand = Cmd 
     DA.Fill(DS) 
    End With 
    Return DS 
End Function 

的连接()函数简单地从web.config中拉加密的连接字符串,密码进行解密,并返回对象:

Public Function Connection() As SqlConnection 
    Dim R As New Rijndael 
    Return New SqlConnection(R.DecryptString128Bit(System.Configuration.ConfigurationManager.ConnectionStrings("ConnString").ToString, "S0ME_HA$H_C0D3")) 
End Function 

...这基本上它。这很简单,你可以得到。

考虑到这一点,是否有人有任何想法,为什么它的行为如此,以及我将来如何防止这种情况?对于这个查询来说没什么大不了的,但是如果它正在进行购买或付款,这可能是一个非常大的交易。

+0

您是否检查过您的服务是否被调用两次?例如,通过放置一些日志记录? – nvoigt

+0

我的第一个想法是,它被称为它的网页被两次调用,并且我在这个方向上浪费了大量时间进行故障排除。但是,如果您将呼叫网页从等式中移除并手动调用web服务(通过网页浏览到http://localhost/address/to/MyWebService.asmx),它仍会显示它正在执行两次。 –

回答

3

发生这种情况是因为您在填充DataSet之前调用Cmd.ExecuteReader()。删除此通话。试试这个:

Dim DS As New DataSet 
    Dim DA As New SqlDataAdapter 
    Dim Cmd As New SqlCommand 
    With Cmd 
     .Connection = Connection() 
     .CommandType = CommandType.StoredProcedure 
     .CommandText = "SOME_STORED_PROCEDURE" 
     .Connection.Open() 
     DA.SelectCommand = Cmd 
     DA.Fill(DS) 
     .Connection.Close() 
    End With 
    Return DS 
+0

好的,我没有意识到这一点。 –

+0

先生,你是一位圣人和一位学者。这完全解决了这个问题。现在我只需要浏览我的代码的其余部分并修复其他任何类似的实例。谢谢! –

+0

@DonQuixote,谢谢!不要忘记标记我的答案;) –

1

尝试在准备SQLCommand时删除.ExecuteReader()。当您调用数据适配器的Fill方法时,它将再次执行该命令。