Как передать переменную в SelectCommand SqlDataSource? - PullRequest
28 голосов
/ 28 января 2009

Я хочу передать переменную из кода в SelectCommand SqlDataSource?

Я не хочу использовать встроенные типы параметров (например, ControlParameter, QueryStringParameter и т. Д.)

Мне нужно передать переменную, но следующий пример не работает:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:itematConnectionString %>" SelectCommand = "SELECT items.name, items.id FROM items INNER JOIN users_items ON items.id = users_items.id WHERE (users_items.user_id = @userId) ORDER BY users_items.date DESC" >
    <SelectParameters>
        <asp:Parameter  DefaultValue="<%= userId %>" Name="userId"  DbType="Guid" />
    </SelectParameters>
</asp:SqlDataSource>

Ответы [ 10 ]

27 голосов
/ 28 января 2009

Попробуйте вместо этого, удалите свойство SelectCommand и SelectParameters:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:itematConnectionString %>">

Затем в коде сделайте это:

SqlDataSource1.SelectParameters.Add("userId", userId.ToString());

SqlDataSource1.SelectCommand = "SELECT items.name, items.id FROM items INNER JOIN users_items ON items.id = users_items.id WHERE (users_items.user_id = @userId) ORDER BY users_items.date DESC"

Хотя это работает для меня, следующий код также работает:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:itematConnectionString %>"
    SelectCommand = "SELECT items.name, items.id FROM items INNER JOIN users_items ON items.id = users_items.id WHERE (users_items.user_id = @userId) ORDER BY users_items.date DESC"></asp:SqlDataSource>


SqlDataSource1.SelectParameters.Add("userid", DbType.Guid, userId.ToString());
12 голосов
/ 28 января 2009

мы должны были делать это так часто, что я сделал то, что я назвал класс DelegateParameter

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Reflection;

namespace MyControls
{
    public delegate object EvaluateParameterEventHandler(object sender, EventArgs e);

    public class DelegateParameter : Parameter
    {
        private System.Web.UI.Control _parent;
        public System.Web.UI.Control Parent
        {
            get { return _parent; }
            set { _parent = value; }
        }

        private event EvaluateParameterEventHandler _evaluateParameter;
        public event EvaluateParameterEventHandler EvaluateParameter
        {
            add { _evaluateParameter += value; }
            remove { _evaluateParameter -= value; }
        }

        protected override object Evaluate(System.Web.HttpContext context, System.Web.UI.Control control)
        {
            return _evaluateParameter(this, EventArgs.Empty);
        }
    }
}

поместите этот класс либо в ваш код приложения (удалите пространство имен, если вы его там поместили), либо в свою сборку пользовательского элемента управления. После регистрации элемента управления в файле web.config вы сможете сделать это

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:itematConnectionString %>"
    SelectCommand = "SELECT items.name, items.id FROM items INNER JOIN users_items ON items.id = users_items.id WHERE (users_items.user_id = @userId) ORDER BY users_items.date DESC">
    <SelectParameters>
    <asp:DelegateParameter Name="userId"  DbType="Guid" OnEvaluate="GetUserID" />
    </SelectParameters>
</asp:SqlDataSource>

затем в коде позади вы реализуете GetUserID в любом случае.

protected object GetUserID(object sender, EventArgs e)
{
  return userId;
}
9 голосов
/ 30 июня 2011

Просто добавьте пользовательское свойство на страницу, которое будет возвращать переменную по вашему выбору. Затем вы можете использовать встроенный тип параметра «control».

В приведенном ниже коде добавьте:

Dim MyVariable as Long


ReadOnly Property MyCustomProperty As Long
    Get
        Return MyVariable
    End Get
End Property

В разделе выбора параметров добавьте:

<asp:ControlParameter ControlID="__Page" Name="MyParameter" 
PropertyName="MyCustomProperty" Type="Int32" />
5 голосов
/ 28 января 2009

для привязки к GUID:

 SqlDataSource1.SelectParameters.Add("userId",  System.Data.DbType.Guid, userID);
4 голосов
/ 01 октября 2014

Вы можете использовать встроенный параметр OnSelecting asp: SqlDataSource

Пример: [.aspx файл]

<asp:SqlDataSource ID="SqldsExample" runat="server"
SelectCommand="SELECT [SomeColumn], [AnotherColumn] 
               FROM [SomeTable]
               WHERE [Dynamic_Variable_Column] = @DynamicVariable"
OnSelecting="SqldsExample_Selecting">
<SelectParameters>
    <asp:Parameter Name="DynamicVariable" Type="String"/>
</SelectParameters>

Тогда в вашем коде позади реализуйте свой метод OnSelecting: [.Aspx.cs]

protected void SqldsExample_Selecting(object sender, SqlDataSourceCommandEventArgs e)
{
     e.Command.Parameters["@DynamicVariable"].Value = (whatever value you want);
}

Вы также можете использовать это для других типов операций с БД, просто реализуйте свои собственные методы:

OnInserting="SqldsExample_Inserting"
OnUpdating="SqldsExample_Updating"
OnDeleting="SqldsExample_Deleting"
2 голосов
/ 11 августа 2013
SqlDataSource1.SelectCommand = "select * from ta where name like '%'+@p+'%'";
if (SqlDataSource1.SelectParameters.Count == 0)
{
   SqlDataSource1.SelectParameters.Add("p", DbType.String, TextBox1.Text);
}
SqlDataSource1.SelectParameters["p"].DefaultValue = TextBox1.Text;
0 голосов
/ 02 августа 2018

Мне нравится ответ Эла В. Хотя есть опечатка.

<asp:DelegateParameter Name="userId"  DbType="Guid" OnEvaluate="GetUserID" />

--- Должно быть ---

<asp:DelegateParameter Name="userId"  DbType="Guid" OnEvaluateParameter="GetUserID" />

Надеюсь, это сэкономит кому-то несколько минут.

0 голосов
/ 18 августа 2012

попробуйте с этим.

Protected Sub SqlDataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SqlDataSource.Selecting

    e.Command.CommandText = "SELECT [ImageID],[ImagePath] FROM [TblImage] where IsActive = 1"

    End Sub
0 голосов
/ 28 января 2009

Посмотрите, работает ли оно, если вы просто удалите DbType = "Guid" из разметки.

0 голосов
/ 28 января 2009

Вам необходимо определить действительный тип SelectParameter. В этой статье MSDN описаны различные типы и способы их использования.

...