30

我想将变量从后面的代码传递给 SqlDataSource 的 SelectCommand?

我不想使用内置参数类型(如 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>
4

10 回答 10

28

试试这个,删除 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());
于 2009-01-27T23:28:45.363 回答
12

我们不得不经常这样做,所以我做了一个我称之为 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);
        }
    }
}

将此类放在您的 app_code 中(如果将其放在此处,请删除命名空间)或自定义控件程序集中。在 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;
}
于 2009-01-28T06:29:48.540 回答
10

只需向页面添加一个自定义属性,该属性将返回您选择的变量。然后,您可以使用内置的“控制”参数类型。

在后面的代码中,添加:

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" />
于 2011-06-29T21:35:06.477 回答
5

附加到 GUID:

 SqlDataSource1.SelectParameters.Add("userId",  System.Data.DbType.Guid, userID);
于 2009-01-28T03:38:40.147 回答
4

您可以使用 asp:SqlDataSource 的内置 OnSelecting 参数

示例:[.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"
于 2014-10-01T14:19:26.580 回答
3
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;
于 2013-08-11T02:36:08.807 回答
0

试试这个。

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
于 2012-08-18T18:20:01.043 回答
0

您需要定义一个有效类型的 SelectParameter。这篇MSDN 文章描述了各种类型以及如何使用它们。

于 2009-01-27T23:29:20.667 回答
0

我喜欢Al W的回答。不过有错别字。

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

- - 应该 - -

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

希望这可以节省几分钟。

于 2018-08-01T22:41:15.627 回答
-1

如果您只是从标记中删除 DbType="Guid" ,请查看它是否有效。

于 2009-01-28T01:16:11.293 回答