2011-03-19 86 views
1

我一直在做一個項目,讓用戶選擇比較項目一個gridview。我的做法是從用戶的選擇(使用複選框)發送查詢字符串到新頁面compare.aspx。我使用一個GridView這個compare.aspx這裏是代碼:Visual C#中使用顯示作爲查詢字符串參數

<%@ 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#,所以請去容易對我...

回答

0

這是一個安全隱患組成形式使用HTTP查詢字符串輸入SQL字符串。這會打開你達到SQL injection attacks

它看起來像你的代碼將正常工作,而無需任何代碼隱藏。您已經向數據源添加了一個參數,該參數將從查詢字符串中捕獲所需的值。爲此目的使用參數可以讓您免受SQL注入的影響。您可能想要將默認值添加到SQLDataSource聲明中的參數。

我肯定會刪除所有的代碼後面,看看是否能解決您的問題。 (編輯):回答你原來的問題:你得到「標準表達式中的數據類型不匹配」錯誤的原因是因爲數據庫中的列upc是字符串類型(可能是varchar)。如果您打算創建一個硬編碼的SQL字符串並與upc列進行比較,那麼您會將單引號放在您用於比較的值的周圍(請參考SQL查詢語法)。由於您沒有包含引號,因此SQL解釋器不會將該值識別爲字符串。

我必須強調,我不建議您在SQL中使用硬編碼值。請注意SQL注入的安全風險。

+0

回覆:「這是一個安全隱患撰寫使用查詢參數的SQL字符串,」 - 什麼你想要說的是正確的,但措辭是混亂的。 SQL參數也是查詢參數。 – 2011-03-19 21:17:09

+0

非常感謝你提醒我有關的安全風險,但由於這僅僅是一個學校的項目,我認爲這將是罰款暫且:) – rexcfnghk 2011-03-20 06:35:46

+0

你介意具體報價,我應該包括在我的代碼的單引號? ASP.net中是否有單引號的特定語法?我是全新的asp.net,並且非常感謝你的幫助。 – rexcfnghk 2011-03-20 06:41:47

相關問題