Visual C # отображает вид сетки с использованием строки запроса в качестве параметра - PullRequest
1 голос
/ 19 марта 2011

Я работал над проектом, чтобы пользователи могли выбирать товары для сравнения. Мой подход заключается в том, чтобы отправить строку запроса из пользовательских вариантов (с помощью флажков) на новую страницу, Compare.aspx. Я использую gridview для этого compare.aspx и вот код:

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

Страница без названия

    <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 голосов
/ 19 марта 2011

Это угроза безопасности для составления строки SQL с использованием формы ввода строки HTTP-запроса.Это открывает вам до атак с использованием SQL-инъекций .

Похоже, ваш код будет работать нормально без какого-либо кода.Вы уже добавили параметр в свой источник данных, который будет захватывать требуемое значение из строки запроса.Использование параметра для этой цели защищает вас от внедрения SQL.Возможно, вы захотите добавить значение по умолчанию к параметру в объявлении SQLDataSource.

Я бы определенно удалил весь ваш код и посмотрел, решит ли это вашу проблему.

(Изменить): Комуответьте на исходный вопрос: причина, по которой вы получаете ошибку «Несоответствие типов данных в выражении критериев», заключается в том, что столбец upc в вашей базе данных является строковым типом (вероятно, varchar).Если вы собираетесь создать жестко запрограммированную строку SQL со сравнением со столбцом upc, вы должны поместить одинарные кавычки вокруг значения, которое вы используете для сравнения (подумайте о синтаксисе SQL-запроса).Поскольку вы не включили кавычки, интерпретатор SQL не распознает значение как строку.

Я должен подчеркнуть, что я НЕ рекомендую использовать жестко закодированные значения в вашем SQL.Пожалуйста, помните о риске безопасности SQL-инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...