我想将变量从后面的代码传递给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>
答案 0 :(得分:27)
请尝试使用此选项,删除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());
答案 1 :(得分: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;
}
答案 2 :(得分:9)
只需向页面添加自定义属性即可返回您选择的变量。然后,您可以使用内置的“控制”参数类型。
在后面的代码中,添加:
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" />
答案 3 :(得分:5)
附加到GUID:
SqlDataSource1.SelectParameters.Add("userId", System.Data.DbType.Guid, userID);
答案 4 :(得分: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"
答案 5 :(得分:2)
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;
答案 6 :(得分:0)
您需要定义一个有效的SelectParameter类型。这个MSDN article描述了各种类型以及如何使用它们。
答案 7 :(得分: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
答案 8 :(得分:0)
我喜欢Al W的回答。不过有错字。
<asp:DelegateParameter Name="userId" DbType="Guid" OnEvaluate="GetUserID" />
---应该是---
<asp:DelegateParameter Name="userId" DbType="Guid" OnEvaluateParameter="GetUserID" />
希望这可以节省一些时间。
答案 9 :(得分:-1)
如果您只是从标记中删除DbType =“Guid”,请查看它是否有效。