2009-01-27 50 views
26

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

我不想使用内置参数类型(如ControlParemeter,QueryStringParameter等)

我需要通过一个vraiable?

下面的例子不工作

<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> 

回答

21

你总是可以做这样的在后面的代码:

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

编辑

试试这个,取出的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

这是行不通的,因为我的变量类型是GUID 感谢他们没有提到这个变量传递任何方式 – ahmed 2009-01-27 23:32:05

0

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

+0

文章刚解释内置参数 感谢任何方式 – ahmed 2009-01-27 23:37:09

0

看看它是否工作,如果你只是从标记中删除DbType =“Guid”。

4

附加到一个GUID:

SqlDataSource1.SelectParameters.Add("userId", System.Data.DbType.Guid, userID); 
11

,我们不得不经常说我做了什么,我叫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登记后,你应该能够在你背后反正你喜欢落实GetUserID做到这一点

<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> 

然后在代码中。

protected object GetUserID(object sender, EventArgs e) 
{ 
    return userId; 
} 
+0

甜蜜,luved这一个!谢谢! – 2015-05-07 01:09:15

+0

不知道这是因为我使用`AutoEventWireup`或不是,但我得到`Type'MyProject.Controls.DelegateParameter'没有名为'OnEvaluate'`的公共属性` – 2017-10-03 17:18:49

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" /> 
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 
2
SqlDataSource1.SelectCommand = "select * from ta where name like '%'[email protected]+'%'"; 
if (SqlDataSource1.SelectParameters.Count == 0) 
{ 
    SqlDataSource1.SelectParameters.Add("p", DbType.String, TextBox1.Text); 
} 
SqlDataSource1.SelectParameters["p"].DefaultValue = TextBox1.Text; 
4

您可以使用内置的ASP的OnSelecting参数: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"