2012-10-05 67 views
1

我在ASP.NET中創建一個ListView,並基於CodeProject here給出的示例。我想使SqlDataSource的Select命令成爲動態的,以便從會話提供的值生成一個值。我試過不同的可能性,這裏是我想要的一個例子:如何將值傳遞給SqlDataSource查詢?

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:TestDatabaseConnectionString %>" 
    SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = <%# Eval("value") %> " > 
</asp:SqlDataSource> 

我怎麼會傳遞這樣的值使用ASP?我也嘗試在C#的後臺頁面中創建查詢,並鏈接到它,如SelectCommand = "<%# Eval("Query") %>"以及使用@value語法。既不工作!

回答

0

我有同樣的問題,我的偷懶的辦法解決這是應該做如下:

command.CommandText = item.Query.Replace("@Value", Value); 
command.ExecuteNonQuery(); 

髒,容易,最有可能不是正確的方式來做到這一點。

+0

這是不好的。它打開你的查詢,直到一個SQL注入攻擊。切勿直接替換SQL查詢中的變量,而不要先清理它們。 – user1437891

+0

正如我所說,不是正確的做法,也不會導致問題,如果您已經在更換前已經驗證了值 –

1

替換

SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = @Name" 

,並定義爲@Name參數

<SelectParameters> 
    <asp:Parameter DefaultValue="<%# Eval("Query") %>" Name="Name" DbType="..." /> 
</SelectParameters> 
+0

我現在試圖使用這個,但我怎樣才能得到「<%#」 Eval(「Query」)%>「來自父DataList的項目嗎? – alwaysVBNET

1

這應該做的伎倆。定義SessionParameter如下並確保Name=Sql parameter name and SessionField is same as your session field。 DBType和DefaultValue ...

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    SelectCommandType="Text" 
    ConnectionString="<%$ ConnectionStrings:TestDatabaseConnectionString %>" 
    SelectCommand="SELECT * FROM [Contacts] WHERE [Name] = @ParaName" 

    <SelectParameters> 
     <asp:SessionParameter 
       Name="ParaName" 
       SessionField="YourSessionFieldName" 
       DbType="String" 
       DefaultValue="" /> 
    </SelectParameters> 
</asp:SqlDataSource> 
+0

這是一個體面的解決方法,但我認爲用戶會更好地編程設置數據並將其綁定到控件而不是使用SqlDataSource。 –

1

提供的解決方案非常好。還應該注意的是,試圖將「價值」直接放在查詢中,你會打開自己的SQL注入攻擊。使用選擇參數可防止並保護您免受此影響。

0

我真的建議不要使用SqlDataSource控件。 A SqlDataSource在領域提供的很少是重用。

編程方式使DB調用

如果您在一個單獨的類電話(甚至更好的DAL),你將能夠在多個頁面中安心使用。另外,當你的查詢發生改變時,你只需要在一個地方改變它。

這裏是低於一個示例使用實體框架來訪問數據庫

標記

<asp:DropDownList ID="ddlTest" runat="server"></asp> 

代碼隱藏

public List<Record> GetAllRecordsByUserName(string credentials) 
{ 
    List<Record> recordList; 
    using (CustomEntities context = new CustomEntities()) 
    { 

     IQueryable<Record> recordQuery = from records in context.Records 
               where records.UserName == credentials 
               select records; 
     recordList = recordQuery.ToList<Record>(); 
    } 
    return recordList; 
} 

public void ValidateAndBind(string username) 
{ 
    List<Record> recordList = GetAllRecordsByUserName(username); 

    // Do validation here 

    ddlTest.DataSource = recordList; 
    ddlTest.DataBind(); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ValidateAndBind("test.username"); 
}