2009-01-27 17 views
26

Chcę przekazać zmiennej z kodu z tyłu do SelectCommand SqlDataSource?Jak przekazać zmienną do SelectCommand SqlDataSource?

nie chcę używać wbudowanych typów parametrów (takich jak ControlParemeter, QueryStringParameter itp)

muszę zdać vraiable?

następujący przykład nie działa

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

Odpowiedz

21

Zawsze możesz zrobić to w ten sposób w kodzie za:

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

EDIT

Spróbuj zamiast tego usunąć SelectCommand właściwość i SelectParameters:

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

Następnie w kodzie za to zrobić:

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" 

ten pracował dla mnie, to działa również:

<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

to nie działa, ponieważ mój typ zmiennej jest GUID dzięki jakikolwiek sposób – ahmed

0

Musisz określić prawidłowy typ SelectParameter. Ten MSDN article opisuje różne rodzaje i sposób ich użycia.

+0

oni nie wspominając zmienne przechodzącą w tym artykuł po prostu wytłumaczyć wbudowany parametr dzięki jakis – ahmed

0

Sprawdź, czy działa po usunięciu DbType = "Guid" ze znaczników.

4

dołączyć do GUID:

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

musieliśmy to robić tak często, że zrobiłem to, co nazywa się klasa 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); 
     } 
    } 
} 

umieścić tę klasę zarówno w App_Code (usuń przestrzeń nazw, jeśli ją tam umieścisz) lub w niestandardowym zespole sterowania. Po kontroli jest zarejestrowany w pliku web.config powinieneś być w stanie to zrobić

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

następnie w kodzie za wdrożyć GetUserID mimo to chcesz.

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

słodki, luved ten! Dziękuję Ci! –

+0

Nie jestem pewien, czy to dlatego, że używam 'AutoEventWireup' czy nie, ale otrzymuję' Type 'MyProject.Controls.DelegateParameter' nie ma publicznej właściwości o nazwie "OnEvaluate'' –

9

Po prostu dodaj niestandardową właściwość do strony, która zwróci zmienną do wyboru. Następnie można użyć wbudowanego parametru "control".

W kodzie za dodać:

Dim MyVariable as Long 


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

W sekcji Wybierz parametry dodatku:

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

Musiałem to zrobić, ale od wewnątrz mojego użytkownika kontrola. __Page nie działa w takim przypadku. Wewnątrz kontrolki użytkownika ControlID jest nazwą klasy kontrolki użytkownika - wtedy działa dobrze. – Jim

0

spróbować z tym.

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

Można użyć wbudowanego w OnSelecting parametru asp: SqlDataSource

Przykład: [aspx plik]

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

Następnie w kodzie za zaimplementować metodę OnSelecting : [.aspx.cs]

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

Można również użyć tego dla innych rodzajów operacji DB tylko zaimplementować własne metody:

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