0

我有 2 个文本框,在我的 aspx 文件中有一个日期值。我想在我的选择语句中使用后面的代码访问这两个控件,但我收到这样的错误:'必须声明标量变量“@txtStartClosingDate”所以我在后面的代码中缺少什么?谢谢

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            MainGridView.DataSource = GetData("select   GroupCategory, Count(Status1) as TotalCount from  [MasterProject] where Closing_Date >= @txtStartClosingDate and Closing_Date <= @txtEndClosingDate and Status1 is not null group by  GroupCategory");
            MainGridView.DataBind();


        }
    }

这是我要引用的文本框之一:

<asp:TextBox ID="txtStartClosingDate" runat="server" CssClass="datepicker"></asp:TextBox>
4

2 回答 2

2

尽管我强烈建议不要这样做(由于 SQL 注入漏洞),但我认为您要做的是:

if (!IsPostBack)
{
    MainGridView.DataSource = GetData("select   GroupCategory, Count(Status1) as TotalCount from  [MasterProject] where Closing_Date >= '"+ txtStartClosingDate.Text +"' and Closing_Date <= '"+ txtEndClosingDate.Text +"' and Status1 is not null group by  GroupCategory");
    MainGridView.DataBind();
}

GetData 方法是什么样的?它需要任何 SQL 参数吗?

于 2013-01-21T23:46:05.680 回答
1

在 aspx 页面后面的代码中编写 sql 查询是一种不好的做法。有许多解决方案,其中之一是使用 3 层结构的应用程序:GUI 是您的 aspx 页面,业务逻辑层将处理您的应用程序的逻辑和数据访问层,它将通过调用查询或存储过程实际与 DB 对话,这实际上比仅在代码中编写查询要好。为什么?因为存储过程在数据库中编译一次,而不像每次都会编译的内联查询,所以您可以将变量传递给存储的价格,这将帮助您防止 sql 注入。

查看架构示例:

http://shoutingwords.com/creating-3-tier-layered-application-using-c-sharp.html

存储过程:

http://www.codeproject.com/Articles/38682/Overview-of-SQL-Server-Stored-Procedure

于 2013-01-21T23:59:11.043 回答