Parámetros null con proveedores de datos en ASP.NET: LinqDataSource utilizando ConvertEmptyStringToNull

Esto es express… porque estaba armando unas paginas con Cristina y en una probando con LINQDataSource asociado a un modelo LINQtoSQL no nos armaba correctamente el update partiendo de los datos de un Formview asociado al proveedor de datos.

Como lo comenta Juan Otero en su blog

“Es muy recomendable conocer lo que nos depara el futuro inmediato, pero no menos importante son las pequeñas cosas que forman el día a día actual.”

Así que aquí va algo del día a día…

 

Agregando valores a un combo/dropdownlist que no están en la lista de datos

Si tienes un combo (dropdownlist) enlazado a un datasource y quieres agregar un item que no se encuentra en la lista de datos, el popular “Sin datos”, “—Seleccione un datos –” pero sin querer validarlo, es decir que si el usuario selecciona guarde null en la DB.
Nos valemos de la propiedad: AppendDataBoundItems y agregando la lista en tiempo de diseño no se borran al enlazarse a datos.

<asp:DropDownList ID="ddlActividad" runat="server"
     AppendDataBoundItems="True"
     DataSourceID="linqDSActividad" 
     DataTextField="ActividadDesc" DataValueField="ActividadID" 
     SelectedValue='<%# Bind("ActividadID") %>'>
        <asp:ListItem Value="">[Sin Datos]</asp:ListItem>
</asp:DropDownList>

Mas información en artículos:

 

Esto no es el problema :)

Sino que cuando queremos hacer un binding entre los valores de este combo/dropdownlist con LINQDataSource y un Formview no detecta que pude ser null y no arma los parametros Update y nos genera el error la excepción

Veamos…

 

Actualizando/Insertando valores NULL

En el LINQDataSource tenemos la propiedad EnableUpdate, que básicamente armar por nosotros las sentencias update teniendo un modelo LINQtoSQL, que en este ejemplo es mi contexto.

Si hacemos algo básico para una tabla de ejemplo Empresas arma lo siguiente:

<asp:LinqDataSource ID="linqDSEmpresas" runat="server" 
    ContextTypeName="PROYECTO.Web.Modelo.MiModeloDataContext" 
    EnableUpdate="True" TableName="Empresas" 
    Where="EmpresaID == @EmpresaID">
    <WhereParameters>
        <asp:QueryStringParameter Name="EmpresaID" QueryStringField="EmpresaID" Type="Int32" />
    </WhereParameters>   
</asp:LinqDataSource>


Pero en el momento de actualización si algunas de nuestros combos/dropdownlist como el que vimos anteriormente están dentro de mi control Formview, Detailsview, etc generara un error porque no es un valor Int32.
Es decir con los items que viene de la DB y el que agregamos no pude definir el ID que corresponde al valor NULL, hay que explicitarlo escribiendo el UpdateParameters con la propiedad ConvertEmptyStringToNull establecida en true.

<asp:LinqDataSource ID="linqDSEmpresas" runat="server" 
    ContextTypeName="PROYECTO.Web.Modelo.MiModeloDataContext" 
    EnableUpdate="True" TableName="Empresas" 
    Where="EmpresaID == @EmpresaID">
    <WhereParameters>
        <asp:QueryStringParameter Name="EmpresaID" QueryStringField="EmpresaID" Type="Int32" />
    </WhereParameters>
    <UpdateParameters>     
        <asp:Parameter Name="ActividadID" Type="Int32" ConvertEmptyStringToNull="true" />
    </UpdateParameters>
</asp:LinqDataSource>

No es necesario todos los parámetros sino simplemente el que deseamos establecer la propiedad ConvertEmptyStringToNull
También tendríamos que hacerlo si necesitamos un DefaultValue.

Lo raro…

Lo raro! es que como bien me comenta Diego el valor por defecto de ConvertEmptyStringToNull  es true, pero en este caso hay que especificarlo :(
 

Notas

Si estamos utilizando algún proveedor de datos como ObjectDataSource, SQLDataSource, etc… los parámetros son explicitados en el diseño y allí podremos verlos a todos, y agregar estas propiedades. En este caso particular con LINQDataSource que no me detectaba estos nullables :(

 

Enlaces

  • ListControl.AppendDataBoundItems
    Obtiene o establece un valor que indica si los elementos de la lista se borran antes del enlace de datos.
  • BoundField.ConvertEmptyStringToNull
    Obtiene o establece un valor que indica si los valores de cadena vacía ("") se convierten automáticamente en valores nulos cuando se actualiza el campo de datos en el origen de datos.
  • EnableUpdate
    Obtiene o establece un valor que indica si los registros de datos se pueden actualizar a través del control LinqDataSource.
Crossposting desde mi blog en Geeks.ms

Published 01-28-2009 18:23 por Jose A. Fernandez

Archivado en: ,,