ASP.NET - 在 ASP.NET 代码中对 SqlDataSource 进行参数化查询 - VB.NET / Visual Studio 2010

问题描述 投票:0回答:1

我正在从代码隐藏中为 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()

请帮忙解决这个问题。

asp.net sql-server vb.net parameters sqldatasource
1个回答
0
投票

我会避免尝试将 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”,则不会添加条件。

如果您选中其中一项 - 将添加该选项的标准

所以,如果您不检查,则没有标准

如果您同时选中两者,那么您将获得两个过滤器。因此,这允许您添加更多选项,并且它们都是可选的 - 我们“累积”可以通过这种方式建立选择标准。

© www.soinside.com 2019 - 2024. All rights reserved.