Visual C#使用查询字符串作为参数显示网格视图

时间:2011-03-19 17:37:38

标签: c# asp.net visual-studio-2008

我一直致力于一个让用户选择项目进行比较的项目。我的方法是从用户的选择(使用复选框)向新页面compare.aspx发送查询字符串。我正在为这个compare.aspx使用gridview,这里是代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="compare.aspx.cs" Inherits="AsiaWebShop.compare" %>

    Untitled Page          

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="item_id" DataSourceID="SqlDataSource1">
        <Columns>
            <asp:BoundField DataField="item_id" HeaderText="item_id" InsertVisible="False" 
                ReadOnly="True" SortExpression="item_id" />
            <asp:BoundField DataField="item_name" HeaderText="item_name" 
                SortExpression="item_name" />
            <asp:BoundField DataField="category" HeaderText="category" 
                SortExpression="category" />
            <asp:BoundField DataField="pic_path" HeaderText="pic_path" 
                SortExpression="pic_path" />
            <asp:BoundField DataField="item_description" HeaderText="item_description" 
                SortExpression="item_description" />
            <asp:BoundField DataField="regular_price" HeaderText="regular_price" 
                SortExpression="regular_price" />
            <asp:BoundField DataField="member_price" HeaderText="member_price" 
                SortExpression="member_price" />
            <asp:BoundField DataField="promo_price" HeaderText="promo_price" 
                SortExpression="promo_price" />
            <asp:BoundField DataField="stock" HeaderText="stock" SortExpression="stock" />
            <asp:BoundField DataField="upc" HeaderText="upc" SortExpression="upc" />
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:awsdbConnectionString %>" 
        ProviderName="<%$ ConnectionStrings:awsdbConnectionString.ProviderName %>" 
        SelectCommand="SELECT * FROM [item] WHERE ([upc] = ?)">
        <SelectParameters>
            <asp:QueryStringParameter Name="upc" QueryStringField="query" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>

</div>
</form>

背后的代码在这里:

namespace AsiaWebShop
{
    public partial class compare : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        SqlDataSource1.SelectCommand = "SELECT * FROM [item] WHERE [upc] = " +Request.QueryString["query"];
        }
    }
}

但是我的“条件表达式中的数据类型不匹配”错误,有人知道为什么吗?对不起,我只是asp.net和C#的新手,所以请放轻松我...

1 个答案:

答案 0 :(得分:0)

使用HTTP查询字符串的输入组成SQL字符串是一种安全风险。这样您就可以使用SQL injection attacks

看起来你的代码在没有任何代码隐藏的情况下工作正常。您已经在数据源中添加了一个参数,该参数将从查询字符串中捕获您想要的值。为此目的使用参数可以防止SQL注入。您可能希望在SQLDataSource声明中为参数添加默认值。

我肯定会删除你背后的所有代码,看看是否能解决你的问题。

(编辑):回答您的原始问题:您收到“条件表达式中的数据类型不匹配”错误的原因是因为数据库中的列upc是字符串类型(可能是{{1 }})。如果要创建一个与upc列进行比较的硬编码SQL字符串,则可以在用于比较的值周围放置单引号(考虑SQL查询语法)。由于您没有包含引号,因此SQL解释器不会将该值重新定义为字符串。

我必须强调,我不建议您在SQL中使用硬编码值。请注意SQL注入的安全风险。