我一直致力于一个让用户选择项目进行比较的项目。我的方法是从用户的选择(使用复选框)向新页面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#的新手,所以请放轻松我...
答案 0 :(得分:0)
使用HTTP查询字符串的输入组成SQL字符串是一种安全风险。这样您就可以使用SQL injection attacks。
看起来你的代码在没有任何代码隐藏的情况下工作正常。您已经在数据源中添加了一个参数,该参数将从查询字符串中捕获您想要的值。为此目的使用参数可以防止SQL注入。您可能希望在SQLDataSource声明中为参数添加默认值。
我肯定会删除你背后的所有代码,看看是否能解决你的问题。
(编辑):回答您的原始问题:您收到“条件表达式中的数据类型不匹配”错误的原因是因为数据库中的列upc
是字符串类型(可能是{{1 }})。如果要创建一个与upc列进行比较的硬编码SQL字符串,则可以在用于比较的值周围放置单引号(考虑SQL查询语法)。由于您没有包含引号,因此SQL解释器不会将该值重新定义为字符串。
我必须强调,我不建议您在SQL中使用硬编码值。请注意SQL注入的安全风险。