2009-01-27 9 views
26

Ich möchte Variable aus dem Code hinter SelectCommand von SqlDataSource übergeben?Wie übergibt man SelectCommand von SqlDataSource?

Ich mag nicht integrierte Parametertypen verwenden (wie ControlParemeter, Querystringparameter, etc.)

Ich brauche eine vraiable passieren?

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

EDIT

Versuchen Sie stattdessen, entfernen Sie die Select

:

das folgende Beispiel funktioniert nicht

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

Antwort

21

Sie immer hinter im Code wie dies tun könnte Eigenschaft und SelectParameters:

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

Dann im Code hinter dies zu tun:

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" 

Das ist für mich gearbeitet, das auch funktioniert:

<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

es funktioniert nicht, weil meine Variablentyp GUID ist durch jede mögliche Weise – ahmed

0

Sie benötigen eine gültige Art von SelectParameter zu definieren. Diese MSDN article beschreibt die verschiedenen Arten und wie man sie benutzt.

+0

sie nicht Weitergabe Variablen in diesem erwähnt haben article die nur erklären, eingebaute Parameter danke irgendwie – ahmed

0

Sehen Sie, ob es funktioniert, wenn Sie nur den DbType = "Guid" aus dem Markup entfernen.

4

auf eine GUID anbringt:

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

wir dies so zu tun hatte oft, dass ich gemacht, was ich eine DelegateParameter Klasse

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); 
     } 
    } 
} 

diese Klasse setzen genannt entweder in Ihrem app_code (Entfernen der Namespace, wenn Sie es dort eingeben) oder in Ihrer benutzerdefinierten Steuerbaugruppe. Nachdem die Steuerung in der web.config registriert ist, sollten Sie in der Lage sein, diesen

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

dann im Code zu tun, hinter Sie die GetUserID implementieren ohnehin wie Sie.

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

süß, luved dieser! Danke! –

+0

Nicht sicher, ob dies ist, weil ich 'AutoEventWireup' verwende oder nicht, aber ich bekomme' Type 'MyProject.Controls.DelegateParameter' hat keine öffentliche Eigenschaft mit dem Namen 'OnEvaluate'' –

9

Fügen Sie einfach eine benutzerdefinierte Eigenschaft zu der Seite hinzu, die die Variable Ihrer Wahl zurückgibt. Sie können dann den integrierten Parametertyp "control" verwenden.

hinter Im Code hinzufügen:

Dim MyVariable as Long 


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

Im Auswahl Abschnitt hinzufügen Parameter:

<asp:ControlParameter ControlID="__Page" Name="MyParameter" 
PropertyName="MyCustomProperty" Type="Int32" /> 
+0

Ich musste dies auch tun, aber von innerhalb meines Benutzers Steuerung. __Page funktioniert in diesem Fall nicht. Innerhalb eines Benutzersteuerelements ControlID ist der Klassenname des Benutzersteuerelements - dann funktioniert es einwandfrei. – Jim

0

mit diesem versuchen.

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

Sie können die in OnSelecting Parameter von asp gebaut verwenden: SqlDataSource

Beispiel: [ASPX-Datei]

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

Dann im Code hinter OnSelecting Methode implementieren : [.aspx.cs]

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

Sie können dies auch für die anderen Arten von DB-Operationen verwenden Sie einfach Ihre eigenen Methoden implementieren:

OnInserting="SqldsExample_Inserting" 
OnUpdating="SqldsExample_Updating" 
OnDeleting="SqldsExample_Deleting"