2012-07-10 63 views
2

我必須創建一個存儲過程,它將搜索數據庫中匹配的行並在GridView中顯示它們。用戶可以通過表單搜索選擇多個選項,其中一些選項不是強制性的。Gridview不在aspx頁面正確返回行

我已經創建了一個存儲過程,但僅當我在SQL Server Management Studio控制檯中執行它時才顯示結果。該存儲過程沒有在aspx頁面的gridview中顯示任何記錄。

請幫我看看我在這裏做錯了什麼。

我創建的存儲過程是這樣的:

ALTER PROCEDURE dbo.ProcName  
@abc varchar(50) = null,  
@def varchar(50) = null,  
@ghi Int = null,  
@jkl varchar(50) = null,  
@mno varchar(50) = null  
As  
Begin  
SELECT abc,def,ghi,jkl,mno,rst from TableName  
where(@abc IS NULL OR abc= @abc)  
    AND (@def IS NULL OR def = @def)  
    AND (@ghi IS NULL OR ghi = @ghi)  
    AND (@jkl IS NULL OR jkl = @jkl)  
    AND (@mno IS NULL OR mno = @mno)  
End  
Go  

這裏是代碼我正在使用asp.net頁面顯示在GridView中記錄:

Sub showResult(Source as Object, E as EventArgs) 
Dim oConn As SQLConnection 
Dim oComm As SQLCommand 
Dim da As SqlDataAdapter 
Dim ds As DataSet 

Dim sSQL As String 
Dim sConn As String 
Dim strloc, listtype, roomno, furnishing, spec, forrent, price, area, email 
strloc=List_Location.SelectedItem.Text 
listtype=List_Type.SelectedItem.Text 
roomno=List_RoomNo.SelectedItem.Value 
furnishing=List_Furnishing.SelectedItem.Text 
forrent=List_RentSale.SelectedItem.Value 

sConn = ConfigurationManager.ConnectionStrings("xyz").ConnectionString 
oConn = New SQLConnection(sConn) 
oComm = New SQLCommand("SearchP",oConn) 

oConn.Open() 

oComm.CommandType = CommandType.StoredProcedure 

oComm.Parameters.Add(New SqlParameter("@abc", SqlDbType.VarChar, 50)) 

oComm.Parameters("@abc").Value = strloc 

oComm.Parameters.Add(New SqlParameter("@def", SqlDbType.VarChar, 50)) 
oComm.Parameters("@def").Value = listtype 

oComm.Parameters.Add(New SqlParameter("@ghi", SqlDbType.Int)) 
oComm.Parameters("@ghi").Value = roomno 

oComm.Parameters.Add(New SqlParameter("@jkl", SqlDbType.VarChar, 50)) 
oComm.Parameters("@jkl").Value = furnishing 

oComm.Parameters.Add(New SqlParameter("@mno", SqlDbType.VarChar, 50)) 
oComm.Parameters("@mno").Value = forrent 

da = New SqlDataAdapter(oComm) 
ds = New DataSet() 
Try 
panel1.visible="true" 
da.Fill(ds,"TableName") 
myGridView.DataSource=ds.Tables("TableName").DefaultView 
myGridView.EmptyDataText = "No records found" 
myGridView.DataBind() 
Catch ex As Exception 
lblResults.text = ex.Message 
Finally 
oComm.Dispose() 
oConn.Dispose() 
oConn.Close() 
End Try 
End Sub 
+0

請顯示您運行的查詢來執行sproc – Curt 2012-07-10 09:27:49

+0

我建議您創建一個XML並傳遞給SQL過程 – Zyku 2012-07-10 09:28:14

+0

如果兩個選項有給定的值(比如'@ abc'和'@ ghi') - 您是否期望行哪些條件*有*,哪些條件有* – 2012-07-10 09:36:03

回答

0

你的存儲過程評估板參數爲@abc is null or abc = @abc。這意味着如果用戶不提供自己的值,則必須將null的值綁定到ASPX頁面中的參數。綁定來自ASPX頁面的空白值不會將null傳遞到存儲過程,因此它將始終評估column = [blank value]abc = [blank value]

假設名單在網頁中具有在列表的頂部(在位置「0」),說選擇什麼形成列表中的項目,然後將ASPX代碼應該是這個樣子:

If List_Location.ItemIndex = 0 Then 
    oComm.Parameters.AddWithValue("@abc", DBNull.Value) 
Else 
    oComm.Parameters.AddWithValue("@abc", List_Location.SelectedItem.Text) 

這樣,當用戶沒有選擇一個值時,或者在他們傳遞值時傳遞該值,您就可以通過null。您的存儲過程應能夠正確使用@abc is null or abc = @abc語法。

+0

非常感謝你。現在對我來說很清楚。我會嘗試你所建議的並回來。 – Pushku 2012-07-10 13:55:11

+0

我試過了。我也試過這種方式,_oComm.Parameters(「@ abc」)。Value = DBNull.Value_但是它顯示以下錯誤:System.FormatException:輸入字符串的格式不正確。 [InvalidCastException:從字符串「ABC」轉換爲輸入「Double」無效。] – Pushku 2012-07-10 15:13:07

+0

我的錯誤是,我給參數分配了錯誤的值。它的工作現在完美。非常感謝。 – Pushku 2012-07-11 08:34:07