<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>&lt;Jose A. Fernandez /&gt; : Tips/Tricks, LINQ</title><link>http://geeks.ms/blogs/fernandezja/archive/tags/Tips_2F00_Tricks/LINQ/default.aspx</link><description>Etiquetas: Tips/Tricks, LINQ</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>Parámetros null con proveedores de datos en ASP.NET: LinqDataSource utilizando ConvertEmptyStringToNull</title><link>http://geeks.ms/blogs/fernandezja/archive/2009/01/28/par-225-metros-null-con-proveedores-de-datos-en-asp-net-linqdatasource-utilizando-convertemptystringtonull.aspx</link><pubDate>Wed, 28 Jan 2009 21:23:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:141483</guid><dc:creator>José A. Fernández</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fernandezja/rsscomments.aspx?PostID=141483</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/fernandezja/commentapi.aspx?PostID=141483</wfw:comment><comments>http://geeks.ms/blogs/fernandezja/archive/2009/01/28/par-225-metros-null-con-proveedores-de-datos-en-asp-net-linqdatasource-utilizando-convertemptystringtonull.aspx#comments</comments><description>&lt;p&gt;Esto es express&amp;hellip; porque estaba armando unas paginas con Cristina y en una probando con &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.aspx"&gt;LINQDataSource&lt;/a&gt; asociado a un modelo &lt;a href="http://msdn.microsoft.com/es-es/library/bb386976.aspx"&gt;LINQtoSQL&lt;/a&gt; no nos armaba correctamente el update partiendo de los datos de un Formview asociado al proveedor de datos.&lt;/p&gt;
&lt;p&gt;Como lo comenta &lt;a href="http://geeks.ms/blogs/franotero/archive/2009/01/26/hola-mundo.aspx"&gt;Juan Otero en su blog&lt;/a&gt;&amp;hellip; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Es muy recomendable conocer lo que nos depara el futuro inmediato, pero no menos importante son las peque&amp;ntilde;as cosas que forman el d&amp;iacute;a a d&amp;iacute;a actual.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As&amp;iacute; que aqu&amp;iacute; va algo del d&amp;iacute;a a d&amp;iacute;a&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Agregando valores a un combo/dropdownlist que no est&amp;aacute;n en la lista de datos&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;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 &amp;ldquo;Sin datos&amp;rdquo;, &amp;ldquo;&amp;mdash;Seleccione un datos &amp;ndash;&amp;rdquo; pero sin querer validarlo, es decir que si el usuario selecciona guarde null en la DB. &lt;br /&gt;Nos valemos de la propiedad: &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems(VS.80).aspx"&gt;AppendDataBoundItems&lt;/a&gt; y agregando la lista en tiempo de dise&amp;ntilde;o no se borran al enlazarse a datos.&lt;/p&gt;
&lt;div&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:DropDownList&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ddlActividad&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;
     &lt;span style="color:#ff0000;"&gt;AppendDataBoundItems&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt;
     &lt;span style="color:#ff0000;"&gt;DataSourceID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;linqDSActividad&amp;quot;&lt;/span&gt; 
     &lt;span style="color:#ff0000;"&gt;DataTextField&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ActividadDesc&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;DataValueField&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ActividadID&amp;quot;&lt;/span&gt; 
     &lt;span style="color:#ff0000;"&gt;SelectedValue&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;#39;&amp;lt;%# Bind(&amp;quot;ActividadID&amp;quot;) %&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ListItem&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;[Sin Datos]&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:ListItem&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:DropDownList&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Mas informaci&amp;oacute;n en art&amp;iacute;culos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/lruiz/archive/2007/03/05/asp-net-2-0-la-propiedad-appenddatabounditems.aspx"&gt;ASP.NET 2.0: La propiedad AppendDataBoundItems&lt;/a&gt; (por &lt;a href="http://geeks.ms/members/lruiz/default.aspx"&gt;Luis Ruiz Pav&amp;oacute;n&lt;/a&gt;) &lt;/li&gt;
&lt;li&gt;&lt;a href="http://geeks.ms/blogs/jalarcon/archive/2008/04/15/el-problema-de-los-valores-por-defecto-en-listas-desplegables-de-asp-net.aspx"&gt;El problema de los valores por defecto en listas desplegables de ASP.NET&lt;/a&gt; (por &lt;a href="http://geeks.ms/members/jalarcon/default.aspx"&gt;Jos&amp;eacute; M. Alarc&amp;oacute;n Agu&amp;iacute;n&lt;/a&gt;) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Esto no es el problema :)&lt;/p&gt;
&lt;p&gt;Sino que cuando queremos hacer un binding entre los valores de este combo/dropdownlist con &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.aspx"&gt;LINQDataSource&lt;/a&gt; y un Formview no detecta que pude ser null y no arma los parametros Update y nos genera &lt;span style="text-decoration:line-through;"&gt;el error&lt;/span&gt; la excepci&amp;oacute;n&lt;/p&gt;
&lt;p&gt;Veamos&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Actualizando/Insertando valores NULL&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;En el LINQDataSource tenemos la propiedad &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.enableupdate.aspx"&gt;EnableUpdate&lt;/a&gt;, que b&amp;aacute;sicamente armar por nosotros las sentencias update teniendo un modelo &lt;a href="http://msdn.microsoft.com/es-es/library/bb386976.aspx"&gt;LINQtoSQL&lt;/a&gt;, que en este ejemplo es mi contexto.&lt;/p&gt;
&lt;p&gt;Si hacemos algo b&amp;aacute;sico para una tabla de ejemplo Empresas arma lo siguiente:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:LinqDataSource&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;linqDSEmpresas&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;ContextTypeName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;PROYECTO.Web.Modelo.MiModeloDataContext&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;EnableUpdate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TableName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Empresas&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;Where&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID == @EmpresaID&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WhereParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:QueryStringParameter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;QueryStringField&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Int32&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;WhereParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;   
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:LinqDataSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;Pero en el momento de actualizaci&amp;oacute;n si algunas de nuestros combos/dropdownlist como el que vimos anteriormente est&amp;aacute;n dentro de mi control Formview, Detailsview, etc generara un error porque no es un valor Int32. &lt;br /&gt;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 &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.boundfield.convertemptystringtonull(VS.80).aspx"&gt;ConvertEmptyStringToNull&lt;/a&gt; establecida en true.&lt;/p&gt;
&lt;div&gt;
&lt;pre style="font-size:8pt;margin:0em;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:LinqDataSource&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;linqDSEmpresas&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;ContextTypeName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;PROYECTO.Web.Modelo.MiModeloDataContext&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;EnableUpdate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TableName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Empresas&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff0000;"&gt;Where&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID == @EmpresaID&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WhereParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:QueryStringParameter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;QueryStringField&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;EmpresaID&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Int32&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;WhereParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;UpdateParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;     
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:Parameter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ActividadID&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Int32&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ConvertEmptyStringToNull&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;UpdateParameters&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;asp:LinqDataSource&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;No es necesario todos los par&amp;aacute;metros sino simplemente el que deseamos establecer la propiedad &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.boundfield.convertemptystringtonull(VS.80).aspx"&gt;ConvertEmptyStringToNull&lt;/a&gt; &lt;br /&gt;Tambi&amp;eacute;n tendr&amp;iacute;amos que hacerlo si necesitamos un DefaultValue.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Lo raro&amp;hellip;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Lo raro! es que como bien me comenta &lt;a href="http://team.desarrollosnea.com.ar/blogs/dmorales"&gt;Diego&lt;/a&gt; el valor por defecto de &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.boundfield.convertemptystringtonull(VS.80).aspx"&gt;ConvertEmptyStringToNull&lt;/a&gt;&amp;nbsp; es true, pero en este caso hay que especificarlo :( &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Notas&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Si estamos utilizando alg&amp;uacute;n proveedor de datos como ObjectDataSource, SQLDataSource, etc&amp;hellip; los par&amp;aacute;metros son explicitados en el dise&amp;ntilde;o y all&amp;iacute; podremos verlos a todos, y agregar estas propiedades. En este caso particular con &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.aspx"&gt;LINQDataSource&lt;/a&gt; que no me detectaba estos nullables :(&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Enlaces&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems(VS.80).aspx"&gt;ListControl.AppendDataBoundItems&lt;/a&gt; &lt;br /&gt;Obtiene o establece un valor que indica si los elementos de la lista se borran antes del enlace de datos. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.boundfield.convertemptystringtonull(VS.80).aspx"&gt;BoundField.ConvertEmptyStringToNull&lt;/a&gt; &lt;br /&gt;Obtiene o establece un valor que indica si los valores de cadena vac&amp;iacute;a (&amp;quot;&amp;quot;) se convierten autom&amp;aacute;ticamente en valores nulos cuando se actualiza el campo de datos en el origen de datos. &lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.enableupdate.aspx"&gt;EnableUpdate&lt;/a&gt; &lt;br /&gt;Obtiene o establece un valor que indica si los registros de datos se pueden actualizar a trav&amp;eacute;s del control &lt;a href="http://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.linqdatasource.aspx"&gt;LinqDataSource&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=141483" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/fernandezja/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://geeks.ms/blogs/fernandezja/archive/tags/Tips_2F00_Tricks/default.aspx">Tips/Tricks</category><category domain="http://geeks.ms/blogs/fernandezja/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>