我正在从代码隐藏中为 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 数据源注入(添加)到页面中。 (无论如何它们都不会持续存在 - 你每次都必须重新注射)。
但是,请记住,任何数据感知控件始终都会自动为您保留。
上面的信息太棒了,从此你甚至不必费心去关心sql数据源了。在您的示例中尤其如此 - 您想要填写下拉列表,网格视图 - 等等。在那些情况下?只需将数据表推入该控件 - 然后您就可以开始比赛了。
如前所述,我们很多人都使用+更喜欢使用代码来代替页面上的数据源 - 我发现它们相当混乱并且无论如何都很难使用。
事实上,我经常做的就是放入列表框,甚至网格视图中。然后,我使用向导创建新的数据源 - 真正漂亮且快速地布置网格。然后我进入标记,删除页面中显示的数据源控件。
另外,不要忘记从 Gridview 标记(或您使用的任何控件)中删除 DataSourceID =。
这让我仍然可以使用向导来创建 gridview、listview 等,但随后我会删除那些额外的垃圾,并最终得到一个漂亮的干净页面,页面中没有所有额外的内容 - (从代码中控制这是一种痛苦无论如何)。
那么,举个例子?
尝试这样编码:
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
一些事情:
是的,不要忘记将此类数据的负载放入 PostBack = false 中。
将结果加载到数据表中(这样做有几个原因,但一个重要原因是行数据绑定事件将充分利用该数据行 - 包括整个数据行 - 甚至不属于 gridview 的列.
注意上面的注意事项。
如果您不选中“opname”,则不会添加条件。
如果您不选中“opchno”,则不会添加条件。
如果您选中其中一项 - 将添加该选项的标准
所以,如果您不检查,则没有标准
如果您同时选中两者,那么您将获得两个过滤器。因此,这允许您添加更多选项,并且它们都是可选的 - 我们“累积”可以通过这种方式建立选择标准。