2012-05-22 38 views
1

請看看下面的模式:SqlDataReader的 - 沒有結果

CREATE TABLE Person (id int not null identity,[index] varchar(30),datecreated datetime) 

insert into Person ([index],datecreated) values ('4,5,6','2011-01-01') 
insert into Person ([index],datecreated) values ('1,2,3','2011-02-02') 
insert into Person ([index],datecreated) values ('7,8','2012-02-02') 

和下面的代碼:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Try 
      Dim _ConString As String = WebConfigurationManager.ConnectionStrings("dbConnection").ConnectionString 
      Dim connection As New SqlConnection(_ConString) 
      Dim objCommand As New SqlCommand 
      Dim objDR As SqlDataReader 
      Dim sqlString As String 

      sqlString = "SELECT * FROM Person WHERE datecreated < '2012-01-01' " 


      objCommand.CommandText = sqlString & " ORDER BY left (substring([index],charindex(',',[index])+1,200), " & _ 
      " charindex(',',substring([index],charindex(',',[index])+1,200))-1)" 
      objCommand.Connection = connection 
      connection.Open() 
      objDR = objCommand.ExecuteReader 
      If objDR.HasRows Then 
       MsgBox("Has Rows") 
      Else 
       MsgBox("No Rows") 
      End If 
      connection.Close() 
     Catch ex As Exception 

     End Try 

    End Sub 

此代碼是在實時系統中的部分功能。每當我用ORDER BY在開發模式(或直播)中運行完整的應用程序; DataReader沒有記錄,出現一個消息框說沒有行(當我單獨運行上面的代碼時,這不會發生)。在ORDER BY子句被註釋掉之後,返回正確的行數。沒有異常拋出。有沒有辦法看到SQLDataReader是否產生了錯誤?

UPDATE 請不要例如張貼關於內存泄漏的答案連接未關閉等,或者異常未處理的事實。我意識到這一點。我生成了上面的代碼以嘗試重新創建問題。

UPDATE2 23/05/2012 19:30 gmt 我已經做了一些進一步的測試,它發現使用參數化查詢時會出現差異,即一行將在SQL Studio Manager中返回,但在命令後不會返回對象被執行。我知道參數化查詢已被緩存。爲什麼參數化執行計劃可能與沒有參數化的執行計劃不同?

+2

如果你只是通過一些其他財產使用[索引]'或'爲了爲了,會發生什麼? –

+0

@Jon Skeet,謝謝。它返回正確的順序兩排(沒問題) – w0051977

+0

@ w0051977:好了 - 所以我懷疑一個行「刪除」如果計算其訂購的「鑰匙」出了毛病,基本上 - 例如因爲你在界限之外取一個子串。 –

回答

1

爲了進一步調查,我會建議使用SQL事件探查器從SQL Management Studio中(或其他),而不是嘗試做到這一點。你不僅能夠看到來自應用程序來精確查詢,但你可以返回可能產生(但不退還)任何錯誤,除了SQL查詢計劃。

+0

謝謝。你知道是否有一個原因可以用不同的方式優化查詢,具體取決於是使用參數化查詢還是無參數化查詢? – w0051977

+0

有很多不同的原因,爲什麼查詢優化方式不同 - 獲取兩者的查詢計劃將有助於調查。 –

+0

+1用於推薦SQL事件探查器。 – w0051977

2

我懷疑ORDER BY省略其中行到關鍵的投影導致失敗的任何行。例如,您在該順序中使用了許多字符串操作,包括子字符串。如果子字符串參數超出字符串範圍,會發生什麼?

我建議你試試:

SELECT [insert order by projection here] FROM Person 

,並看看會發生什麼 - 刪除ORDER BY從方程。我也建議你通過代碼:)

+0

謝謝。查詢在SQL Studio Manager中完美工作。 – w0051977

+0

@ w0051977:有ORDER BY的原件,還是「只選擇訂購鍵」的版本? –

+0

這兩個在SQL Studio管理器中完美工作。 – w0051977