.net - ¿Cómo pasar variable a SelectCommand de SqlDataSource?
asp.net variables (10)
Quiero pasar variable desde el código de atrás a SelectCommand de SqlDataSource?
No quiero usar tipos de parámetros integrados (como ControlParemeter, QueryStringParameter, etc.)
Necesito pasar un vraiable?
el siguiente ejemplo no funciona
<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>
Me encanta la respuesta de Al W. Aunque hay un error tipográfico.
<asp:DelegateParameter Name="userId" DbType="Guid" OnEvaluate="GetUserID" />
--- Debiera ser ---
<asp:DelegateParameter Name="userId" DbType="Guid" OnEvaluateParameter="GetUserID" />
Con suerte, esto le ahorra a alguien unos minutos.
Necesita definir un tipo válido de SelectParameter. Este artículo de MSDN describe los distintos tipos y cómo usarlos.
Puede usar el parámetro integrado OnSelecting de asp: SqlDataSource
Ejemplo: [archivo .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>
Luego, en su código detrás de implementar su método OnSelecting: [.aspx.cs]
protected void SqldsExample_Selecting(object sender, SqlDataSourceCommandEventArgs e)
{
e.Command.Parameters["@DynamicVariable"].Value = (whatever value you want);
}
También puede usar esto para los otros tipos de operaciones DB, simplemente implemente sus propios métodos:
OnInserting="SqldsExample_Inserting"
OnUpdating="SqldsExample_Updating"
OnDeleting="SqldsExample_Deleting"
Siempre puedes hacerlo así en el código detrás:
SqlDataSource1.SelectParameters.Add("@userId", userId);
EDITAR
Pruebe esto en su lugar, elimine la propiedad SelectCommand y SelectParameters:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:itematConnectionString %>">
Luego en el código detrás haz esto:
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"
Esto funcionó para mí, esto también funciona:
<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());
Simplemente agregue una propiedad personalizada a la página que le devolverá la variable que elija. Luego puede usar el tipo de parámetro de "control" incorporado.
En el código detrás, agregue:
Dim MyVariable as Long
ReadOnly Property MyCustomProperty As Long
Get
Return MyVariable
End Get
End Property
En la sección de parámetros de selección, agregue:
<asp:ControlParameter ControlID="__Page" Name="MyParameter"
PropertyName="MyCustomProperty" Type="Int32" />
Vea si funciona si solo elimina el DbType = "Guid" del marcado.
para adjuntar a un GUID:
SqlDataSource1.SelectParameters.Add("userId", System.Data.DbType.Guid, userID);
prueba con esto
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
tuvimos que hacer esto tan a menudo que hice lo que llamé una clase 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);
}
}
}
ponga esta clase en su app_code (elimine el espacio de nombres si lo coloca allí) o en su ensamblaje de control personalizado. Después de que el control se haya registrado en web.config, debe poder hacer esto
<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>
Luego, en el código subyacente, implemente el GetUserID de la forma que desee.
protected object GetUserID(object sender, EventArgs e)
{
return userId;
}
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;