2013-09-30 36 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方法時,它將再次執行該命令。