我正在从代码隐藏为ASP.NET中的SqlDataSource
创建一个查询。
我的代码如下:
Dim SqlDataSource1 As New SqlDataSource()
Dim SQL As String
' If Not IsPostBack Then
SqlDataSource1.ID = "sqlexpsearch"
Me.Page.Controls.Add(SqlDataSource1)
Dim connectionString As String
Dim connection As SqlConnection
connectionString = ConfigurationManager.ConnectionStrings("exam2ndconnection").ToString
connection = New SqlConnection(connectionString)
SqlDataSource1.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("exam2ndconnection").ConnectionString
If opname.Checked = True Then
SQL = "select SRNO,tr_date as Date ,MailMethod,SpeedId,Content,ExYear,Exroll as No,NAME,Address from dispatch where name = '%'+ @srname +'%' OR ADDRESS ='%'+ @srname +'%' order by TR_DAte DESC,NAME "
SqlDataSource1.SelectParameters.Add("@srname", UCase(txtitem.Text))
SqlDataSource1.SelectCommand = SQL
End If
If opchno.Checked Then
SqlDataSource1.SelectCommand = "select SRNO,tr_date as Date ,MailMethod,SpeedId,Content,ExYear,Exroll as No,NAME,Address from dispatch where rtrim(exroll) ='" & txtitem.Text & "' order by tr_Date,exroll desc"
End If
GridView1.DataSource = SqlDataSource1
GridView1.DataBind()
我得到这个错误:
必须声明标量变量"srname";。
在代码行上:
Gridview1.DataBind()
请帮助解决此问题。
我会避免尝试将sql数据源注入(添加(到页面中。(它们无论如何都不会持续——你每次都必须重新注射(。
但是,请记住,任何数据感知控件ALWAYS都会自动为您保留。
因此,上面的信息非常好,从那时起,您甚至不必为sql数据源而烦恼。在你的例子中尤其如此——你想填写一个下拉列表,一个网格视图——不管怎样。在这种情况下?只要把数据表塞进控制区,你就可以参加比赛了。
如前所述,我们中的许多人使用+更喜欢使用代码来代替页面上的数据源——我发现它们相当混乱,无论如何都很难处理。
事实上,我经常做的是说放入列表框,甚至是网格视图。然后,我使用该向导创建新的数据源——非常漂亮和快速地布置网格。然后我进入标记,删除页面中显示的数据源控件。
此外,不要忘记从Gridview标记(或您使用的任何控件(中删除DataSourceID=。
这让我仍然可以使用向导来创建网格视图、列表视图等,但随后我删除了多余的垃圾,最终得到了一个干净的页面,页面中没有所有多余的东西(无论如何,从代码中控制它都很痛苦(。
那么,举个例子吧?
试着这样编码:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid()
End If
End Sub
Sub LoadGrid()
Using conn As New SqlConnection(ConnectionStrings("exam2ndconnection").ConnectionString)
Dim strSQL As String = ""
strSQL = "SELECT SRNO, tr_date as Date, MailMethod, SpeedId, Content, ExYear, Exroll as No, " &
"[Name], Address FROM dispatch "
Dim strWhere As String = ""
Using cmdSQL As New SqlCommand(strSQL, conn)
If opName.Checked Then
strWhere = "([Name] Like '%'+ @srname +'%' OR ADDRESS = '%'+ @srname +'%') "
cmdSQL.Parameters.Add("@srname", SqlDbType.NVarChar).Value = txtitem.Text
End If
If opchno.Checked Then
If strWhere <> "" Then strWhere &= " AND "
strWhere &= "(Rtrim(exroll) = @exroll)"
cmdSQL.Parameters.Add("@exroll", SqlDbType.NVarChar).Value = txtitem.Text
End If
If strWhere <> "" Then
cmdSQL.CommandText &= " WHERE " & strWhere
End If
' add our sorting
cmdSQL.CommandText &= " ORDER BY tr_Date, exroll DESC"
conn.Open()
Dim rstData As New DataTable
rstData.Load(cmdSQL.ExecuteReader)
GridView1.DataSource = rstData
GridView1.DataBind()
End Using
End Using
End Sub
几件事:
YES不要忘记将此类数据加载到PostBack=false中。
将结果加载到数据表中(这有几个原因,但一个主要原因是行数据绑定事件将充分使用该数据行,包括整个数据行,甚至是不属于网格视图的列。
注意上面的小心。
如果你不勾选";opname";,则不添加该标准。
如果你不勾选";opchno";,则不添加该标准。
如果你选择其中一个-该选项的标准是添加
所以,如果你检查无,无条件
如果同时检查这两个,则会得到两个过滤器。因此,这允许您添加更多的选项,它们都是可选的——我们";结块的";可以通过这种方式建立选择标准。