<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2088102121773217265</id><updated>2011-12-13T10:22:19.508+01:00</updated><category term='WP7'/><category term='XNA'/><title type='text'>El Blog de RCastro</title><subtitle type='html'>Que el diseño inicial no te hipoteque</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-8418562172537885253</id><published>2011-12-02T11:35:00.000+01:00</published><updated>2011-12-09T11:30:45.074+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='WP7'/><title type='text'>Ha nacido GLYPY The Hero</title><content type='html'>Hoy he recibido la notificación de que mi primera aplicación para Windows Phone 7 ha pasado el proceso de certificación y está disponible desde hoy en el marketplace de Microsoft.&lt;br /&gt;
&lt;br /&gt;
Todo empezó como una simple prueba con XNA y C# pero al cabo de algún tiempo se ha convertido en&amp;nbsp; un juego completo, de principio a fin.&lt;br /&gt;
&lt;br /&gt;
No creo que me haga rico con esto de los juegos pero me estoy divirtiendo mucho en el camino. :-)&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;GLYPY The Hero&lt;/strong&gt; es un típico juego de plataformas en el que se “aplastan” bicharracos y se recogen cosas. Aquí os dejo una captura de pantalla para que os&amp;nbsp;hagáis&amp;nbsp;una idea.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="image" border="0" height="269" src="http://lh6.ggpht.com/-69lnCFN_dZY/Tt9GQZE5QyI/AAAAAAAAAKs/bJoqWAjxdOo/image%25255B11%25255D.png?imgmax=800" style="border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; margin-right: auto;" title="image" width="547" /&gt; &lt;br /&gt;
&lt;br /&gt;
Aquí dejo el enlace por si&amp;nbsp;queréis&amp;nbsp;probarlo.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&lt;a href="http://windowsphone.com/s?appid=e3f9b097-33dc-41bb-9627-df9ff26cfb70"&gt;&lt;img alt="wp7_152x50_green" border="0" height="54" src="http://lh4.ggpht.com/-3nKuUhtKnNM/Tt9Bdyc5uFI/AAAAAAAAAKc/GjkuX86drQw/wp7_English_152x50_green_thumb.png?imgmax=800" style="border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline;" title="wp7_152x50_green" width="156" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-8418562172537885253?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/8418562172537885253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=8418562172537885253&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/8418562172537885253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/8418562172537885253'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2011/12/ha-nacido-glypy-hero.html' title='Ha nacido GLYPY The Hero'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/-69lnCFN_dZY/Tt9GQZE5QyI/AAAAAAAAAKs/bJoqWAjxdOo/s72-c/image%25255B11%25255D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-2911351388284274253</id><published>2009-01-12T13:50:00.001+01:00</published><updated>2009-01-12T13:52:39.506+01:00</updated><title type='text'>Un ejemplo práctico y III</title><content type='html'>&lt;p&gt;En esta tercera y última entrega del ejemplo práctico pretendo: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Teorizar sobre los diferentes enfoques al problema de carga de entidades en un diseño orientado a objetos. &lt;/li&gt;    &lt;li&gt;Profundizar en el diseño de la clase DataLoader y en sus mecanismos de expansión. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;En el día a día de un desarrollador es habitual la utilización de tablas de Código-Descripción. Con ellas se ahorra espacio ya que no se duplica la información, se normalizan los datos, etc. Lo que todos ya sabemos. Los problemas con el manejo de estas entidades comienzan cuando en nuestro sistema existen entidades con muchos &amp;quot;códigos&amp;quot; de &amp;quot;tablas maestras&amp;quot;, claves externas vamos.&lt;/p&gt;  &lt;p&gt;¿Cómo obtenemos estos valores relativos a estas claves?. ¿Utilizamos sentencias INNER JOIN?. ¿Realmente y vamos a necesitar cargar todos estos valores en todos los escenarios?. Abordar estas preguntas, a mi modo de ver, es crucial a la hora de diseñar un sistema para que sea AGIL y TOLERANTE a los cambios. Esto último es importantísimo en proyectos grandes en los que, como todos sabemos, los cambios son constantes y no hay que romper lo que ya funciona. &lt;/p&gt;  &lt;p&gt;Voy a intentar poner un ejemplo sencillo: supongamos que tenemos la típica entidad &lt;strong&gt;Empleado&lt;/strong&gt;, que tiene, además de los campos habituales, un &lt;strong&gt;código de departamento&lt;/strong&gt;, un &lt;strong&gt;código de categoría&lt;/strong&gt;, un &lt;strong&gt;código de Responsable&lt;/strong&gt; y una &lt;strong&gt;lista de Proyectos&lt;/strong&gt; en los que participa. A la hora de cargar un objeto &lt;strong&gt;Empleado&lt;/strong&gt; la implementación más habitual es la de lanzar una sentencia SQL con un INNER JOIN de las diferentes tablas. Es obvio, que si un caso de uso concreto dice que solo tengo que listar el &lt;em&gt;Nombre&lt;/em&gt; y el &lt;em&gt;Departamento&lt;/em&gt;, estaremos solicitando y transmitiendo más datos de los que realmente necesitamos. &lt;/p&gt;  &lt;p&gt;Con este modelo &lt;strong&gt;&amp;quot;INNER JOIN&amp;quot;&lt;/strong&gt; si posteriormente se añade otra clave externa, por ejemplo &lt;strong&gt;TipoDeHorario&lt;/strong&gt;, habrá que modificar la sentencia SQL para que el método &lt;strong&gt;Carga()&lt;/strong&gt; llene TODAS las propiedades. Este cambio en el modelo implicará una penalización en el rendimiento de otros métodos ya implementados que funcionaban correctamente.&lt;/p&gt;  &lt;p&gt;Si cada cambio que se realice en el modelo afecta al rendimiento de lo ya existente nuestro sistema &lt;strong&gt;NO ES AGIL&lt;/strong&gt; ni &lt;strong&gt;TOLERANTE&lt;/strong&gt; a cambios. Con unos cuantos cambios como estos, a posteriori, y con este enfoque, el sistema dejará rápidamente de comportarse como venía haciéndolo y lo que es peor: de como el usuario ya está acostumbrado. &lt;/p&gt;  &lt;p&gt;Por lo tanto y como ya he escrito en otra entrada: &lt;/p&gt;  &lt;p&gt;“Siempre que se pueda, y aquí entran cuestiones de rendimiento, el primer enfoque que doy a la carga de entidades relacionada es la &lt;strong&gt;Lazy Load&lt;/strong&gt; o Carga Perezosa con algún mecanismo de cacheo. De esta manera los objetos no pierden “su integridad” y siguen funcionando como se espera tras implementar diferentes modos de carga: en un escenario haciendo un &lt;strong&gt;INNER JOIN&lt;/strong&gt; con la tabla Provincias, en otro escenario con la tabla Facturas donde no interesa en absoluto la información de las anteriores.”&lt;/p&gt;  &lt;p&gt;No estoy en contra de la utilización del método &lt;strong&gt;INNER JOIN&lt;/strong&gt;, al contrario, muchas veces es el que hay que utilizar. Lo que planteo es que, antes de nada, es necesario un análisis exhaustivo de donde se&amp;#160; donde se va a utilizar y de como afectará&amp;#160; esto a a posibles futuras modificaciones. &lt;/p&gt;  &lt;p&gt;Otra decisión importante que tenemos que tomar a la hora de cargar un objeto, es &amp;quot;&lt;strong&gt;Cuando&lt;/strong&gt;&amp;quot; se cargarán las entidades relacionadas y las descripciones de las propiedades de las que solo tenemos su clave externa. En nuestro ejemplo, simple el, solamente existe una:&amp;#160; La lista de Proyectos. En una aplicación del mundo real podría haber, además, una lista de direcciones, una lista de teléfonos, etc. ¿Cómo abordamos este problema? ¿Cargamos todas las entidades en el método &lt;strong&gt;carga()&lt;/strong&gt;?. De este modo estaríamos en disposición de obtener cualquier valor inmediatamente después de su invocación, pero de nuevo en la implementación del caso de uso &lt;em&gt;&lt;strong&gt;Listar Nombre y Departamento&lt;/strong&gt;&lt;/em&gt; estaríamos haciendo más cosas de las estrictamente necesarias. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Nota importante&lt;/strong&gt;: Existen escenarios en que este enfoque es el correcto ya que &lt;strong&gt;SIEMPRE&lt;/strong&gt; que se carga una entidad se van a utilizar/consultar sus entidades relacionadas. De no ser así es mas aconsejable utilizar mecanismos de Carga Perezosa (Lazy Load). De esta forma las cosas se cargan cuando realmente se necesitan. &lt;/p&gt;  &lt;p&gt;A continuación intentaré mostrar como realizar la carga de objetos para evitar, de algún modo, los problemas expuestos anteriormente.&lt;/p&gt;  &lt;h3&gt;Carga de un valor desde una tabla maestra. &lt;/h3&gt;  &lt;p&gt;En ocasiones es necesario mostrar la descripción de una propiedad en lugar del código o clave externa. Por ejemplo, supongamos que ahora necesitamos especificar un &lt;strong&gt;Tipo&lt;/strong&gt; para la entidad &lt;strong&gt;Envio&lt;/strong&gt; que ya conocemos de otras entradas del blog. Los tipos pueden ser: Local = 0, Nacional = 1 e Internacional = 2. Podríamos implementarlo de la siguiente forma: &lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _idTipo &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; IdTipo() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _idTipo 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
  &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) 
    _idTipo = value 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; 

&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _TipoDeEnvio &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = &lt;span style="color: #006080"&gt;&amp;quot;&amp;quot;&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TipoDeEnvio() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _TipoDeEnvio 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Con un enfoque tradicional del problema primero realizaríamos un &lt;strong&gt;INNER JOIN&lt;/strong&gt; en la sentencia &lt;strong&gt;SQL&lt;/strong&gt;, cambiaríamos el cargador del objeto y lo tendríamos. Lo MALO de este enfoque es que penalizamos el código ya existente que no necesita el tipo de envio. Por lo tanto es necesario hacernos las siguientes preguntas: ¿Es en todos los escenarios estrictamente necesaria la carga del Tipo de envio? ¿Lo será en futuros escenarios o casos de uso?. Lo más normal es dar un NO como respuesta estas dos preguntas. &lt;/p&gt;

&lt;p&gt;Tendremos, por tanto, que mejorar el mecanismo de carga de este tipo de propiedades. Una primera aproximación puede ser la de cachear el valor. Lo vemos con el siguiente código: &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TipoDeEnvio() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _TipoDeEnvio.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; 
      _TipoDeEnvio = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; TipoDeEnvio().Carga(_idTipo).Descripcion 
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _TipoDeEnvio 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Si observamos con detenimiento esta nueva implementación nos daremos cuenta de que no interfiere con la anterior y de que en el caso de seguir cargando el objeto con INNER JOIN la creación y carga de un objeto TipoDeEnvio no será necesaria. Es muy importante, repito, que las modificaciones no rompan ni incidan en el rendimiento de lo que ya funciona. &lt;/p&gt;

&lt;p&gt;Esta patrón puede ser interesante para la implementación de algunos casos de uso sencillos. Por ejemplo, si queremos abrir un solo &lt;strong&gt;envio&lt;/strong&gt; y conocer su tipo. Necesitaremos, entonces, 2 accesos a la capa de Datos. &lt;/p&gt;

&lt;p&gt;En el caso de que queramos, por el contrario, listar todos los envios de un mes cualquiera y mostrar su tipo, el patrón anterior no será el más adecuado, realizará una consulta a la base de datos por cada envio. No es del todo malo, ya que en una etapa inicial del desarrollo puede interesar más mostrar la futura funcionalidad, que el RENDIMIENTO. &lt;/p&gt;

&lt;p&gt;Una versión mejorada puede hacer uso de mecanismos de cacheo globales o incrementales. &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TipoDeEnvio() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _TipoDeEnvio.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; 
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; Helper.CacheDeTipos &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; 
        _TipoDeEnvio = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; TipoDeEnvio().Carga(_idTipo).Descripcion 
      &lt;span style="color: #0000ff"&gt;Else&lt;/span&gt; 
        _TipoDeEnvio = Helper.CacheDeTipos.Item(_idTipo).Descripcion 
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _TipoDeEnvio 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Se puede apreciar como esta última implementación “permitirá” el correcto funcionamiento del objeto independientemente del contexto en el que se utilice y de como se haya inicializado.&lt;/p&gt;

&lt;h3&gt;Carga de Entidades relacionadas&lt;/h3&gt;

&lt;p&gt;En ocasiones me he encontrado con código heredado en el que los objetos del tipo &lt;strong&gt;Cliente&lt;/strong&gt; se cargaban en el constructor junto con una colección de &lt;strong&gt;TODAS&lt;/strong&gt; las facturas del mismo, para finalmente mostrar por pantalla sencillamente la &lt;strong&gt;Localidad&lt;/strong&gt; y la &lt;strong&gt;Provincia&lt;/strong&gt;. Inadmisible.&lt;/p&gt;

&lt;p&gt;Hemos de preguntarnos, como hicimos anteriormente, si es estrictamente necesario cargar todas, algunas o ninguna de las entidades relacionadas. Existirán casos en los que no haya más remedio que cargar todas las entidades y otros en los que habrá que dotar al objeto de mecanismos que le permitan ser usado de una forma &lt;strong&gt;Flexible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como norma general en el diseño de los objetos se establece que los métodos de carga recuperarán solamente los valores comunes a todos los casos de uso, es decir, los de la Tabla de la Base de Datos correspondiente a la entidad. Los demás valores o entidades relacionadas deberían ser cargadas bajo petición.&lt;/p&gt;

&lt;p&gt;Un patrón de implementación de la propiedad Documentos es la siguiente: &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Documentos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Anexos = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Documentos() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Anexos 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Documentos &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; 
      _Documentos = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Anexos().Carga(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.IdEnvio) 
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Documentos 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Property&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;podremos utilizar el objeto de la siguiente forma: &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;. 
. 
&lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Envio().Carga(350) 
  Debug.WriteLine(.this.IdEnvio) 
  &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; a &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Anexo &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; .this.Documentos 
    Debug.WriteLine(a.FileName) 
  &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; 
. 
.&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;De esta forma no existirá penalización en el rendimiento cuando solamente queramos cambiar, por ejemplo la fecha de un envio ya&amp;#160; que los Documentos &lt;strong&gt;SOLO&lt;/strong&gt; son cargados cuando se solicitan.&lt;/p&gt;

&lt;p&gt;Si requisitos posteriores indican, por ejemplo, la necesidad de incluir una lista de Destinatarios del envio, bastará con realizar la implementación de la propiedad Destinatarios de la misma forma que antes: &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Destinatarios &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Destinatarios 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Destinatarios() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Destinatarios 
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Destinatarios &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; 
      _Destinatarios = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Destinatarios().Carga(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.IdEnvio) 
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; 
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Destinatarios 
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Property&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;La ejecución de la nueva funcionalidad no interfiere en absoluto con la funcionalidad anterior consistente en listar los nombres de los documentos anexos. &lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Envio().Carga(350) 
  Debug.WriteLine(.this.IdEnvio)        
  &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; a &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Destinatario &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; .this.Destinatario 
    Debug.WriteLine(a.Nombre) 
  &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt; 
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Lo que perseguimos con patrones como estos es que los objetos se comporten como se espera que lo hagan y sobre todo, mantener está coherencia y efectividad aun cuando los requisitos cambien (Que cambiarán).&lt;/p&gt;

&lt;p&gt;Al principio y cuando estamos acostumbrados a la carga &lt;strong&gt;INNER JOIN&lt;/strong&gt; todo lo anterior nos parece que es complicar las cosas, porque, si me puedo traer toda la información de una sola vez, ¿Para qué montar tanto lio?. La respuesta es: Porque no sabemos cuales serán los requisitos en el en futuro, porque no queremos &amp;quot;Que el diseño inicial nos hipoteque el sistema&amp;quot;, porque queremos desarrollos ágiles y porque queremos a toda costa evitar sentencias SLQ de más de 30 líneas que difícilmente entenderemos pasados cinco minutos. &lt;/p&gt;

&lt;p&gt;Pensemos en que los grandes sistemas existentes, incluso los vivos, están compuestos por la agregación de pequeñas partes: bloques, ladrillos, células ... Lo complejo aquí es el sistema no sus componentes. Diseñemos, púes, componentes pequeños, sencillos, pensados para su expansión futura y, sobre todo, fácilmente comprensibles tanto en su funcionamiento individual como cuando interactúan con otros para formar el TODO. &lt;/p&gt;

&lt;h3&gt;El DataLoader y sus mecanismos de expansión.&lt;/h3&gt;

&lt;p&gt;Como hemos visto anteriormente los objetos de un sistema deben ser cargados de forma efectiva y coherente en sus todos y cada uno de los escenarios en donde son utilizados. Para ello debemos disponer de unos mecanismos de carga lo &lt;strong&gt;suficientemente&lt;/strong&gt; &lt;strong&gt;flexibles&lt;/strong&gt; para realizar con éxito esta tarea.&lt;/p&gt;

&lt;p&gt;En el Modelo que propongo esta responsabilidad se le ha asignado a los propios objetos. No obstante se podría, por ejemplo, crear una clase&amp;#160; “BindingManager” que realizara la tarea de gestionar los “cargadores” de los objetos. &lt;/p&gt;

&lt;p&gt;Los objeto de la capa de negocio, heredando y sobrescribiendo, implementan el siguiente interfaz:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Interface&lt;/span&gt; ILoader
  &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetObjectLoader() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader
  &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate
  &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; transactionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate
&lt;span style="color: #0000ff"&gt;End Interface&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Como ya he dicho anteriormente los objetos inicialmente son cargados con sus valores mas “usados” y a la vez los mas “fácilmente” accesibles. Por lo tanto para este escenario el objeto proporciona a través de la interfaz ILoader su “cargador genérico”. Este cargador, normalmente, traspasa los valores de la base de datos (DataReader) a las variables privadas de las propiedades del objeto. El siguiente código muestra el cargador generico de la clase Envio:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Envio : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; ObjetoBase
  .
  .
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; InitDataBinder()
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _DataBinder &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
      _DataBinder = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.ObjectLoader()
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; _DataBinder 
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, 0, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)))
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;idEnvio&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;IdEnvio&amp;quot;&lt;/span&gt;, 1, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;observaciones&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Observaciones&amp;quot;&lt;/span&gt;, 2, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;numeroDeRegistro&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;NumeroDeRegistro&amp;quot;&lt;/span&gt;, 3, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;fechaDeRegistro&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;FechaDeRegistro&amp;quot;&lt;/span&gt;, 4, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)))
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;fecha&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Fecha&amp;quot;&lt;/span&gt;, 5, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)))          
        .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;usuario&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;, 6, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))          
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;with&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; _DataBinder &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetBinder() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader
    InitDataBinder()
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _DataBinder
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
  .
  .
&lt;span style="color: #0000ff"&gt;End Class&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Este cargador está diseñado para trabajar con un DataReader con 6 campos que son los que actualmente devuelve el siguiente método de la capa de Datos:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetItem(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
  Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()   
    cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;Select * from [Envio] where Id={0}&amp;quot;&lt;/span&gt;, id)
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
  &lt;span style="color: #0000ff"&gt;End Using&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;El responsable de la carga es el método &lt;strong&gt;LoadObject&lt;/strong&gt; de la clase &lt;strong&gt;DataLoader&lt;/strong&gt; que devuelve el objeto cargado con los valores de un DataReader:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Envio : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; ObjetoBase
  .
  .
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Carga(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envio
    Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
      Dal.Loader.LoadObject(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItem(id))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
  .
  .&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Hasta aquí hemos visto cual es la forma, genérica, en la que los objetos son cargados. Creo que es el momento de aclarar que en la actual implementación de los métodos de carga se generan dinámicamente funciones de carga de acuerdo a la información especificada en los ObjectLoader de los objetos. Esta &lt;strong&gt;generación dinámica de código intermedio&lt;/strong&gt; se realiza una sola vez por tipo de cargador y almacenada como un delegado en el mismo ObjectLoader. El mecanismo de generación supone que existe una variable privada por cada bindItem cuyo nombre va precedido de “_”. Esta variable recibirá el valor del campo del DataReader cuyo índice se indica en el BindItem. Veamos una ejemplo de lo que digo:&lt;/p&gt;

&lt;p&gt;en el cargador del objeto&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;.Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, 0, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)))&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;en la propiedad&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;.
.
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Id() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
.
.&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Nota: El segundo parámetro del constructor de BindItem actualmente no se usa. Es el nombre del campo en la tabla de la base de datos. Por rendimiento el acceso es por el indice de columna, el tercer parámetro.&lt;/p&gt;

&lt;p&gt;A partir de ahora veremos como el &lt;strong&gt;Modelo&lt;/strong&gt; nos permite especificar que valores cargar. &lt;/p&gt;

&lt;p&gt;Supongamos que en un determinado caso de uso necesitamos conocer el &lt;strong&gt;Id&lt;/strong&gt;, el &lt;strong&gt;Id del envio&lt;/strong&gt; y el &lt;strong&gt;usuario&lt;/strong&gt; que lo realizó. A la vista del código que ya tenemos utilizamos el método genérico de carga para implementar dicho caso de uso. Bueno, funciona, y en un primer estadío del desarrollo nos sirve para mostrar la funcionalidad del sistema al cliente pero sin entrar en cuestiones de rendimiento. El cliente, sin que sirva de precedente, nos indica que “Que si, que le gusta la funcionalidad” pero que estima que “el tiempo de respuesta debe ser bastante menor”. En este momento, o una vez que detectamos un punto en el que el rendimiento es importante, pasaríamos a la optimización del código de carga para este caso particular.&lt;/p&gt;

&lt;p&gt;La primera optimización que podemos hacer es la creación en la capa de datos de un método que nos devuelva un DataReader únicamente con los columnas necesarias:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetItemsExt() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
  Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()
    cmd.CommandText = &lt;span style="color: #006080"&gt;&amp;quot;Select Id,IdEnvio,Usuario from [Envio]&amp;quot;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
&lt;span style="color: #0000ff"&gt;End Funtion&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;A continuación deberemos crear un método que pueda ser usado para implementar el exigente &lt;strong&gt;Caso de Uso&lt;/strong&gt;. Este método debe especificar cuales son las propiedades que se van a cargar. Hasta ahora hemos visto que el cargador de objetos necesita un objeto y un DataReader con los valores de las propiedades para realizar su trabajo. Lo que no vemos tan fácilmente es que necesita también un cargador del objeto ya que este es solicitado al objeto si no se proporciona. De todas formas, y este es un típico mecanismo de expansión del diseño, existen versiones sobrecargadas de los métodos de carga: LoadObject y LoadObjects que aceptan un &lt;strong&gt;Cargador Personalizado&lt;/strong&gt;:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;p&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; LoadObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Loader_ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; LoadObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader)

&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; LoadObjects(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T), &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T) 
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; LoadObjects(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T), &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Loader_ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T)
&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;En el siguiente ejemplo el cargador se crearía en cada llamada, no obstante vemos claramente que este es un punto en el que se podrían aplicar mecanismos de cacheo de cargadores específicos. No lo hago aquí por simplicidad.&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CargaExt() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envios
  Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
    &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; customLoader &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.ObjectLoader
    &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; customLoader
      .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, 0, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)))
      .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;idEnvio&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;IdEnvio&amp;quot;&lt;/span&gt;, 1, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
      .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;&amp;quot;usuario&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Usuario&amp;quot;&lt;/span&gt;, 2, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Dal.Loader.LoadObjects(Of Envio)(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItemsExt(), customLoader)
  &lt;span style="color: #0000ff"&gt;End Using&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End Function&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Bueno pues esto es todo por hoy. Hemos visto la forma generica de cargar los objetos y como, en casos específicos, es necesaria una carga especifica&amp;#160; y optimizada de valores para obtener unos rendimientos altos. &lt;/p&gt;

&lt;p&gt;Espero que todo esto sirva, al menos, para daros algunas ideas.&lt;/p&gt;

&lt;p&gt;Saludos y hasta la próxima.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-2911351388284274253?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/2911351388284274253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=2911351388284274253&amp;isPopup=true' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2911351388284274253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2911351388284274253'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2009/01/un-ejemplo-prctico-y-iii.html' title='Un ejemplo práctico y III'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-6007340108318456744</id><published>2008-12-18T12:12:00.001+01:00</published><updated>2008-12-18T16:24:13.170+01:00</updated><title type='text'>Un ejemplo práctico II Bis.</title><content type='html'>&lt;p&gt;Todo modelo que se precie debe implementar mecanismos que permitan tanto su expansión como su trazabilidad. Es &lt;strong&gt;muy conveniente&lt;/strong&gt; poder saber, por ejemplo, por qué esta fallando nuestra aplicación al intentar realizar una operación en la base de datos en un entorno de producción. Para conseguir este objetivo &lt;strong&gt;es requisito indispensable&lt;/strong&gt; que cualquier operación de acceso a base de datos se realice desde un punto común. De esta forma, por tanto, podremos &lt;em&gt;trazar&lt;/em&gt; dichas operaciones e informar de los posibles errores que estas puedan producir.&lt;/p&gt;  &lt;p&gt;En el modelo esto es responsabilidad de la clase Dal.DataServer. A continuación el fragmento de código que lo realiza:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;.
.
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteReader(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of IDataReader)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteReader)
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteNonQuery(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteNonQuery)
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteScalar(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of T)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteScalar)
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #008000"&gt;' Para centralizar los mensajes de error de la Capa de Acceso a Datos&lt;/span&gt;
&lt;span style="color: #008000"&gt;' de forma que se puedan: Escribir la sentencia SQL, escribir en un log, tratar el texto de error, etc&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteCommand(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; handler &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; CommandHandler(Of T)) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
  &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Trazas.Enabled &lt;span style="color: #0000ff"&gt;And&lt;/span&gt; DisableLog = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
      Trace.WriteLine(IIf(cmd.Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Dal --&amp;gt; Transaction.&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;DAL.&amp;quot;&lt;/span&gt;) &amp;amp; &lt;span style="color: #006080"&gt;&amp;quot;ExecuteCommand : &amp;quot;&lt;/span&gt; &amp;amp; cmd.CommandText)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    DisableLog = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; handler(cmd)
  &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
    &lt;span style="color: #008000"&gt;' Trace the exception into the same log.&lt;/span&gt;
    Trace.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;--- Exception : &amp;quot;&lt;/span&gt; &amp;amp; e.Message)
    &lt;span style="color: #008000"&gt;' Aqui se podría inntentar controlar los mensajes de error de clave duplicada, etc...&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Data Access Layer Exception &amp;quot;&lt;/span&gt;, e)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteReader(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Cmd.ExecuteReader()
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteNonQuery(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; Res &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = Cmd.ExecuteNonQuery()
  &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Trazas.Enabled &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
    Trace.WriteLine(IIf(Cmd.Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;Dal --&amp;gt; Transaction &amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;DAL &amp;quot;&lt;/span&gt;) &amp;amp; Res &amp;amp; &lt;span style="color: #006080"&gt;&amp;quot; Filas&amp;quot;&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Res
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteScalar(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Cmd.ExecuteScalar
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
.
.
.&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Es una traducción-adaptación a vb, allá por febrero del 2006, de un articulo lo publicado en &lt;a href="http://www.codeproject.com"&gt;www.codeproject.com&lt;/a&gt; titulado: “&lt;strong&gt;&lt;em&gt;Templating via Generics and delegates&lt;/em&gt;&lt;/strong&gt;” de&lt;b&gt; &lt;a href="http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=2662658"&gt;Oren Ellenbogen&lt;/a&gt;.&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;Configuración del Debug.&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_YppF1PaTjNE/SUowCSNSMhI/AAAAAAAAACY/KaOFdhQodi0/s1600-h/Image1%5B6%5D.jpg"&gt;&lt;img title="Image1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="184" alt="Image1" src="http://lh5.ggpht.com/_YppF1PaTjNE/SUowC_DjqqI/AAAAAAAAACc/ZtfQ9-sd3A0/Image1_thumb%5B4%5D.jpg?imgmax=800" width="408" align="right" border="0" /&gt;&lt;/a&gt;Vamos a modificar el formulario del proyecto de pruebas añadiéndole algunos botones de comando, cambiaremos el control de texto por un RichTextBox y adecentamos un poco el formulario.&lt;/p&gt;

&lt;p&gt;Además vamos a necesitar una clase que nos permita visualizar las trazas que nuestro modelo va dejando. Esta clase va a heredar de TraceListener y enviará todo mensaje que escribamos en el objeto Trace al control RichTextBox dándole un aspecto más vistoso. Una buena presentación siempre es de&amp;#160; agradecer.&lt;/p&gt;

&lt;p&gt;Este es el código de nuestro, bueno mío,&lt;em&gt; TraceLister&lt;/em&gt;:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Friend&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; MyListener : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; TraceListener
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _theRichTextBox &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; RichTextBox
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _theSetValueDelegate &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; SetValueDelegate

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; control &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; RichTextBox)
    &lt;span style="color: #0000ff"&gt;MyBase&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;()
    _theRichTextBox = control
    _theRichTextBox.Multiline = &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;
    _theSetValueDelegate = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SetValueDelegate(&lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; SetValueProc)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Write(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; message &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
    _theRichTextBox.BeginInvoke(_theSetValueDelegate, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;() {message})
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; WriteLine(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; message &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
    _theRichTextBox.BeginInvoke(_theSetValueDelegate, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;() {message &amp;amp; Environment.NewLine})
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; SetValueDelegate(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; SetValueProc(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
    _theRichTextBox.SelectionColor = Color.Blue
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; value.IndexOf(&lt;span style="color: #006080"&gt;&amp;quot;Objetos/Segundo&amp;quot;&lt;/span&gt;) &amp;gt; -1 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; _theRichTextBox.SelectionColor = Color.Gray
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; System.Text.RegularExpressions.Regex.Match(value, _
                    &lt;span style="color: #006080"&gt;&amp;quot;(Commit)|(Rollback)|(BeginTransaction)|(Transaction.)&amp;quot;&lt;/span&gt;).Success &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; _theRichTextBox.SelectionColor = Color.Green    
    _theRichTextBox.AppendText(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;(&lt;span style="color: #006080"&gt;&amp;quot; &amp;quot;&lt;/span&gt;c, 2 * Trace.IndentLevel) &amp;amp; value)
    _theRichTextBox.ScrollToCaret()
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Class&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;El siguiente paso es inicializar el mecanismo de notificación de carga de objetos que nos ofrece el Dal y agregar nuestro listener a la lista para que reciba los mensajes de depuración&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Form1_Load(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.Load
  .
  &lt;span style="color: #008000"&gt;' Resto del código omitido intencionadamente&lt;/span&gt;
  .       
  Dal.Loader.OnBeginLoad = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BeginLoadDelegate(&lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; OnBeginLoad)
  Dal.Loader.OnEndLoad = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.EndLoadDelegate(&lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; OnEndLoad)
  Dal.DXTimer.Init()
    
  &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Trace.Listeners
    .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; MyListener(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.TextBox1))
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; OnBeginLoad()
  DAL.DXTimer.GetElapsedMilliseconds()
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; OnEndLoad(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Properties &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Objects &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; time &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Double&lt;/span&gt; = DAL.DXTimer.GetElapsedMilliseconds
  Trace.WriteLine( _
    &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;{0}s para {1} objetos con {2} campos.{3} Objetos/Segundo&amp;quot;&lt;/span&gt;, _
                    &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;() {(time / 1000.0).ToString(&lt;span style="color: #006080"&gt;&amp;quot;0.###0&amp;quot;&lt;/span&gt;), _
                                   Objects, _
                                   Properties, _
                                   (Objects / (time / 1000.0)).ToString(&lt;span style="color: #006080"&gt;&amp;quot;0.###0&amp;quot;&lt;/span&gt;) _
                                   }))
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;
A partir de este momento tendremos completa información sobre las sentencias SQL ejecutadas así como del tiempo empleado en crear y cargar los objetos con los valores obtenidos.&lt;/div&gt;

&lt;h3&gt;Carga de objetos&lt;/h3&gt;

&lt;div&gt;&lt;img title="Image2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="232" alt="Image2" src="http://lh4.ggpht.com/_YppF1PaTjNE/SUowEAdl8oI/AAAAAAAAACg/RwKFQ-8aQYU/Image2%5B8%5D.jpg?imgmax=800" width="564" align="right" border="0" /&gt;&lt;/div&gt;

&lt;div&gt;Una vez que hemos realizado los cambios anteriores la pulsación del botón &lt;strong&gt;Cargar&lt;/strong&gt;, como ya hacía antes, llenará lista con los ids de los envíos recuperados. Pero esta vez tenemos más cosas. Tenemos INFORMACIÓN y la información es poder.&lt;/div&gt;

&lt;div&gt;Vemos como se van creando conexiones, como se van cerrando, que sentencias se ejecutan y cual es el tiempo que el sistema tarda en crear y cargar los objetos de la capa de Negocio.&lt;/div&gt;

&lt;div&gt;Aquí, y seguro que alguno ya se ha dado cuenta, los datos nos muestran diferentes valores en lo referente al tiempo de carga de objetos: 0,2881 s y 0,004s. Estos valores corresponden a dos ejecuciones consecutivas y, aunque no reflejan fielmente la velocidad de carga ya que sólo son dos los registros de la tabal, si nos indican que la primera vez tarda más.&lt;/div&gt;

&lt;div&gt;Esta tardanza es debida a la generación del delegado de carga de ese tipo de objeto. Esta generación solo se produce una vez en la “vida” del proceso que hospeda nuestros objetos. Las siguientes llamadas ejecutan código intermedio generado dinámicamente con la información de del DataBinder del objeto. Las pruebas están hechas con VS2008 en un Pentium II, no os digo más. Si es el que tengo en casa, ¡¡¡que pasa!!!!.&lt;/div&gt;

&lt;div&gt;Entraré a fondo en este tema otro día. En &lt;a href="http://www.codeproject.com"&gt;www.codeproject.com&lt;/a&gt;&amp;#160; estaba la inspiración “A General Fast Method Invoker” por &lt;b&gt;&lt;a href="http://www.codeproject.com/script/Articles/MemberArticles.aspx?amid=3143103"&gt;Luyan&lt;/a&gt;.&lt;/b&gt;&lt;/div&gt;

&lt;h3&gt;Las transacciones en el Modelo&lt;/h3&gt;

&lt;div&gt;Para probar el funcionamiento de las transacciones hemos añadido un botón con el título &lt;em&gt;Insertar&lt;/em&gt; y establecido un manejador para el mimo. Este procedimiento simplemente insertará dos registro en la base de datos. En una primera ejecución vamos a olvidar un campo requerido por la tabla para observar que es lo que ocurre.&lt;/div&gt;

&lt;div&gt;Este es el código del procedimiento:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; btnInsertar_Click(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt; btnInsertar.Click    
    &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; TH &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.TransactionHelper(Dal.DataServer.GetNewConection())
    &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      TH.BeginTransaction()
      &lt;span style="color: #008000"&gt;' Insertar el primer elemento (sintaxis 1)&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.Envio()
        .ConnectionProvider = TH.ConnectionProvider
        .TransactionProvider = TH.TransactionProvider
        .Id = 0 &lt;span style="color: #008000"&gt;' Segun nuestro diseño esto provocará una inserción.&lt;/span&gt;
        .IdEnvio = &lt;span style="color: #006080"&gt;&amp;quot;Envio_02&amp;quot;&lt;/span&gt;
        .NumeroDeRegistro = &lt;span style="color: #006080"&gt;&amp;quot;REG002&amp;quot;&lt;/span&gt;
        .FechaDeRegistro = &lt;span style="color: #006080"&gt;&amp;quot;17/12/2008&amp;quot;&lt;/span&gt;
        .Observaciones = &lt;span style="color: #006080"&gt;&amp;quot;Con método 2&amp;quot;&lt;/span&gt;
        .Usuario = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;
        .Save()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #008000"&gt;' Insertar el segundo elemento (Sintaxis 2)&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Negocio.Factory.Crear(Of Negocio.Envio)(TH)
        .Id = 0
        .IdEnvio = &lt;span style="color: #006080"&gt;&amp;quot;Envio_03&amp;quot;&lt;/span&gt;
        &lt;span style="color: #008000"&gt;'.NumeroDeRegistro = &amp;quot;REG003&amp;quot;&lt;/span&gt;
        .FechaDeRegistro = &lt;span style="color: #006080"&gt;&amp;quot;17/12/2008&amp;quot;&lt;/span&gt;
        .Observaciones = &lt;span style="color: #006080"&gt;&amp;quot;Con la sintaxis 2 ahorramos lineas&amp;quot;&lt;/span&gt;
        .Usuario = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;
        .Save()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      TH.Commit()
      Trace.WriteLine(&lt;span style="color: #006080"&gt;&amp;quot;Inserción realizada&amp;quot;&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
      TH.RollBack()
      Trace.WriteLine(ex.Message)
      MsgBox(ex.Message)
    &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
      TH.Dispose()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;En la imagen se puede ver cual ha sido el resultado de esta ejecución accidentada. &lt;/div&gt;

&lt;p&gt;&lt;img title="Image3" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="227" alt="Image3" src="http://lh5.ggpht.com/_YppF1PaTjNE/SUpKfEQuzyI/AAAAAAAAACo/fcqG-GKP-zY/Image3%5B11%5D.jpg?imgmax=800" width="683" border="0" /&gt;&lt;/p&gt;

&lt;p&gt;Gracias a nuestro mecanismo centralizado de consultas y trazas podemos fácilmente ver como el error que se ha producido en la segunda inserción es debido a la omisión de un valor requerido. Además observamos como: se abre y cierra correctamente la conexión; las operaciones se ejecutaban dentro de una transacción y que esta ha sido cancelada.&lt;/p&gt;

&lt;div&gt;La siguiente imagen muestra una ejecución correcta una vez quitado el comentario del NumeroDeRegistro.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&lt;img title="Image4" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="232" alt="Image4" src="http://lh6.ggpht.com/_YppF1PaTjNE/SUpOhxnMBiI/AAAAAAAAACs/hDKkW-do1lQ/Image4%5B7%5D.jpg?imgmax=800" width="513" border="0" /&gt;&lt;/div&gt;

&lt;p&gt;El código superior nos muestra las dos formas de especificar que conexión y que transacción usan los objetos. En la primera se establecen explícitamente, en la segunda se hace a través de un artilugio software (una clase vamos) que nos crea el objeto y establece estos valores obteniéndolos de TranscationHelper, pero, y esto es lo importante, con una sola línea de código. “Menos líneas menos errores”&lt;/p&gt;

&lt;h3&gt;Trabajar con conexiones&lt;/h3&gt;

&lt;p&gt;La forma en que el modelo hace uso de las conexiones es muy ¿simpe?: Si el objeto de la capa de datos tiene una conexión asignada la usa, si no y si tiene un ConnectionProvider lo invocará almacenando el resultado. En el caso de que las dos anteriores condiciones no se cumplan buscará primero una conexión compartida que usar. Si no la encuentra creará una nueva conexión y la almacenará por si el objeto la necesitara posteriormente. Es muy importante llamas al metodo Dispose de los objetos del DAL y que de no hacerlo las conexiones siguen abiertas. por lo tanto es “obligatorio” utilizar el patrón Using que implicitamente llamará a Dispose por nosotros:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Carga() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Negocio.Envios
  Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Dal.Loader.LoadObjects(Of Envio)(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItems())
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;En el formulario de pruebas hemos agregado un nuevo botón y un manejador para realizar, ahora, unas pruebas de modificación de objetos.&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; btnModificar_Click(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt; btnModificar.Click
    &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; TH &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.TransactionHelper(Dal.DataServer.GetNewConection())
    &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Negocio.Factory.Crear(Of Negocio.Envios)(TH).Carga()
        &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; env &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; .this.Where(&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;(envio) envio.Usuario = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;)
          env.Usuario = &lt;span style="color: #006080"&gt;&amp;quot;OldTest&amp;quot;&lt;/span&gt;
          env.Save()
        &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
      Trace.WriteLine(ex.Message)
      MsgBox(ex.Message)
    &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
      TH.Dispose()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;Este es su aspecto después de ejecutar el código superior&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&lt;img title="Image5" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="232" alt="Image5" src="http://lh6.ggpht.com/_YppF1PaTjNE/SUpTh_y0kpI/AAAAAAAAACw/An19jmFC_U0/Image5%5B7%5D.jpg?imgmax=800" width="625" border="0" /&gt;&lt;/div&gt;

&lt;p&gt;Aquí podemos ver como creamos un objeto TransactionHelper para pasárselo al “Creador de objetos” Factory e inmediatamente llamar al método Carga() del objeto devuelto. Con este método, y aprovechando la sentecia &lt;strong&gt;With&lt;/strong&gt;, nos ahorramos la posible variable local, creamos y cargamos en la misma línea. Después vemos la utilidad de la propiedad &lt;strong&gt;This&lt;/strong&gt; de “nuestros” objetos al permitirnos referenciar la colección dentro de un With y utilizando LINQ obtener solo los envios hechos por “Test”.&lt;/p&gt;

&lt;p&gt;Cambiamos el valor de alguna propiedad y grabamos. ESTO SON OBJETOS. Creo que este tipo de flexibilidad es la que hay que ir buscando a la hora de diseñar los objeto ya que, con la actual capacidad de proceso de las maquinas con las que nos encontramos hoy en día, el recuperar 30 objetos con una simple sentencia “Select * from tabla” filtrarlos con LINQ y actualizar finalmente 4 es preferible a aplicaciones con decenas de “Optimizadas” y&amp;#160; “es un solo sitio usadas” operaciones de actualizacion y/o borrado. Por otro lado el utilizar estructuras simples y poco acopladas unas con otras reduce sustancialmente los tiempos de desarrollo. Posteriormente siempre es posible “Optimizar” el procedimiento que hemos detectado problemático.&lt;/p&gt;

&lt;p&gt;En resumén si lo que quiero es realizar “una sola” operación de carga no es necesario especificar la conexión a utilizar bastaría lo siguiente:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.Envios().Carga()
  &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; env &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; .this.Where(&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;(envio) envio.Usuario = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;)
    Trace.WriteLine(env.Id)
  &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; With&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;&amp;#160;&amp;#160; Si lo que queremos es realizar varias operaciones, por ejemplo: cargar un grupo de clientes y sus facturas sería conveniente aprovechar la misma conexión con el fin de evitar una constante creación de conexiones. Utilizaríamos el siguiente patrón:&lt;/div&gt;

&lt;div&gt;&amp;#160;&lt;/div&gt;

&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; TH &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.TransactionHelper(Dal.DataServer.GetNewConection())
&lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Negocio.Factory.Crear(Of Negocio.Envios)(TH).Carga()
  &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; env &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; .this.Where(&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;(envio) envio.Usuario = &lt;span style="color: #006080"&gt;&amp;quot;Test&amp;quot;&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Negocio.Factory.Crear(Of Negocio.Anexo)(TH).Carga(env.Id)
        .
        .  
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Negocio.Factory.Crear(Of Negocio.Historico)(TH).Carga(env.Id)
        .
        .
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; with&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Saludos a todos.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-6007340108318456744?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/6007340108318456744/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=6007340108318456744&amp;isPopup=true' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6007340108318456744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6007340108318456744'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/un-ejemplo-prctico-ii-bis.html' title='Un ejemplo práctico II Bis.'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YppF1PaTjNE/SUowC_DjqqI/AAAAAAAAACc/ZtfQ9-sd3A0/s72-c/Image1_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-7409746463219731875</id><published>2008-12-18T10:13:00.001+01:00</published><updated>2008-12-18T10:21:38.471+01:00</updated><title type='text'>Un ejemplo práctico II.</title><content type='html'>&lt;p&gt;En esta segunda entrega del ejemplo práctico pretendo mostrar: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Las posibilidades de obtener las trazas de toda consulta realizada en la capa DAL.&lt;/li&gt;    &lt;li&gt;Las diferentes formas de inicialización, carga y utilización de los objetos.&lt;/li&gt;    &lt;li&gt;La implementación de transacciones en el modelo.&lt;/li&gt;    &lt;li&gt;Utilización de las conexiones.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Como es interesante conocer en todo momento los tiempos de carga de los objetos, el modelo dispone de un mecanismo de notificación de comienzo y fin de carga (OnBeginLoad y OnEndLoad). Pero esto lo veremos más adelante. Ahora solo agregar el código para un Timer mas preciso. &lt;/p&gt;  &lt;p&gt;No recuerdo muy bien dónde encontré el código en C# pero creo que fue en &lt;a title="copy paste source. :-)" href="http://www.kalme.de" target="_blank"&gt;www.kalme.de&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Este el código de &lt;strong&gt;Dal.Core.DXTimer.vb&lt;/strong&gt;, archivo que hay que añadir al proyecto DAL aunque, ahora tras algún tiempo, estoy empezando a cuestionarme si no debiera estar en otra Capa. No obstante el cambio de localización de esta clase no compromete en nada el modelo.&lt;/p&gt;  &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt; System
&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt; System.Runtime.InteropServices

&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; DXTimer

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot; imported functions &amp;quot;&lt;/span&gt;
    &amp;lt;System.Security.SuppressUnmanagedCodeSecurity()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Declare&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; QueryPerformanceFrequency &lt;span style="color: #0000ff"&gt;Lib&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;kernel32&amp;quot;&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;ByRef&lt;/span&gt; PerformanceFrequency &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;
    &amp;lt;System.Security.SuppressUnmanagedCodeSecurity()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Declare&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; QueryPerformanceCounter _
    &lt;span style="color: #0000ff"&gt;Lib&lt;/span&gt; &lt;span style="color: #006080"&gt;&amp;quot;kernel32&amp;quot;&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;ByRef&lt;/span&gt; PerformanceCount &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' The last number of ticks.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; lLastTime &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt; = 0
    &lt;span style="color: #008000"&gt;' The current number of ticks.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; lCurrentTime &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt; = 0
    &lt;span style="color: #008000"&gt;' The number of ticks per second for this system.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' This will be a constant value.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; lTicksPerSecond &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt; = 0
    &lt;span style="color: #008000"&gt;' Indicates if the Timer is initialized&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; bInitialized &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' The elapsed seconds since the last GetElapsedSeconds() call.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; dElapsedSeconds &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Double&lt;/span&gt; = 0.0
    &lt;span style="color: #008000"&gt;' The elapsed milliseconds since the last   GetElapsedMilliseconds() call.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; dElapsedMilliseconds &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Double&lt;/span&gt; = 0.0

    &lt;span style="color: #008000"&gt;' Property to query the ticks per second  for this system (Timer has to be initialized).&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TicksPerSecond() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Long&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; lTicksPerSecond
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' The initialization of the timer. Tries to query&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' performance frequency and determines if performance&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' counters are supported by this system.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Init()
      &lt;span style="color: #008000"&gt;' Try to read frequency. &lt;/span&gt;
      &lt;span style="color: #008000"&gt;' If this fails, performance counters are not supported.&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; QueryPerformanceFrequency(lTicksPerSecond) = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Performance Counter not supported on this system!&amp;quot;&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
      &lt;span style="color: #008000"&gt;' Initialization successful&lt;/span&gt;
      bInitialized = &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Starts the Timer. This set the initial time value.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' Timer has to be initialized for this.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Start()
      &lt;span style="color: #008000"&gt;' Check if initialized&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; bInitialized = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Timer no initializado!&amp;quot;&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;

      &lt;span style="color: #008000"&gt;' Initialize time value&lt;/span&gt;
      QueryPerformanceCounter(lLastTime)

    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;


    &lt;span style="color: #008000"&gt;' Gets the elapsed milliseconds since the last&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' call to this function. Timer has to be initialized&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' for this.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' Returns The number of milliseconds.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetElapsedMilliseconds() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;

      &lt;span style="color: #008000"&gt;' Check if initialized&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; bInitialized = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Timer no initializado!&amp;quot;&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;

      &lt;span style="color: #008000"&gt;' Get current number of ticks&lt;/span&gt;
      QueryPerformanceCounter(lCurrentTime)

      &lt;span style="color: #008000"&gt;' Calculate number of milliseconds since last call&lt;/span&gt;
      dElapsedMilliseconds = (Convert.ToDouble(lCurrentTime - lLastTime) / Convert.ToDouble(lTicksPerSecond)) * 1000.0

      &lt;span style="color: #008000"&gt;' Store current number of ticks for next call&lt;/span&gt;
      lLastTime = lCurrentTime

      &lt;span style="color: #008000"&gt;' Return milliseconds&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; dElapsedMilliseconds
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


    &lt;span style="color: #008000"&gt;' Gets the elapsed seconds since the last call&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' to this function. Timer has to be initialized for this.&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Returns The number of seconds.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetElapsedSeconds() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;
      &lt;span style="color: #008000"&gt;' Check if initialized&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; bInitialized = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;&amp;quot;Timer no initializedo!&amp;quot;&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
      &lt;span style="color: #008000"&gt;' Get current number of ticks&lt;/span&gt;
      QueryPerformanceCounter(lCurrentTime)

      &lt;span style="color: #008000"&gt;' Calculate elapsed seconds&lt;/span&gt;
      dElapsedSeconds = Convert.ToDouble(lCurrentTime - lLastTime) / Convert.ToDouble(lTicksPerSecond)

      &lt;span style="color: #008000"&gt;' Store current number of ticks for next call&lt;/span&gt;
      lLastTime = lCurrentTime

      &lt;span style="color: #008000"&gt;' Return number of seconds&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; dElapsedSeconds
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; Rnd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Random(DateTime.Now.Millisecond)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-7409746463219731875?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/7409746463219731875/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=7409746463219731875&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/7409746463219731875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/7409746463219731875'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/ejemplo-prctico-ii-dalcoredxtimervb.html' title='Un ejemplo práctico II.'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-6965570782546293435</id><published>2008-12-17T10:04:00.001+01:00</published><updated>2008-12-18T09:23:04.948+01:00</updated><title type='text'>Un ejemplo práctico</title><content type='html'>&lt;div&gt;&lt;img title="image" height="531" alt="image" src="http://lh5.ggpht.com/_YppF1PaTjNE/SUjBc2-ZLsI/AAAAAAAAABM/S9TeYmc8smk/image%5B13%5D.png?imgmax=800" width="301" align="right" border="0" /&gt;&lt;/div&gt; &lt;p&gt;Con esta entrada pretendo dar una visión generar del modelo y mostrar algunos ejemplos de su utilización.&lt;/p&gt; &lt;p&gt;Quiero hacer hincapié en que lo que se pretende es acortar el tiempo de desarrollo, homogeneizar el código fuente y ALGO MUY IMPORTANTE: reducirlo . Ya lo dijo el sabio “menos líneas menos errores”.&lt;/p&gt; &lt;p&gt;Lo primero que tenemos que hacer es configurar una solución con el aspecto de la imagen de la derecha.&lt;/p&gt; &lt;p&gt;Todos los ficheros están como antiguas entradas. La tabla que vamos a utilizar tiene el siguiente definición:&lt;/p&gt; &lt;div&gt;   &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 60.93%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; height: 208px; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TABLE&lt;/span&gt; [dbo].[T_Envio](
    [Id] [&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;] &lt;span style="color: #0000ff"&gt;IDENTITY&lt;/span&gt;(1,1) &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
    [IdEnvio] [nvarchar](250) &lt;span style="color: #0000ff"&gt;COLLATE&lt;/span&gt; Modern_Spanish_CI_AS &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
    [Observaciones] [nvarchar](200) &lt;span style="color: #0000ff"&gt;COLLATE&lt;/span&gt; Modern_Spanish_CI_AS &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
    [NumeroDeRegistro] [nvarchar](250) &lt;span style="color: #0000ff"&gt;COLLATE&lt;/span&gt; Modern_Spanish_CI_AS &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
    [FechaDeRegistro] [datetime] &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
    [Fecha] [datetime] &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CONSTRAINT&lt;/span&gt; [DF_T_Envio_Fecha]  &lt;span style="color: #0000ff"&gt;DEFAULT&lt;/span&gt; (getdate()),
    [Usuario] [nvarchar](250) &lt;span style="color: #0000ff"&gt;COLLATE&lt;/span&gt; Modern_Spanish_CI_AS &lt;span style="color: #0000ff"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NULL&lt;/span&gt;,
 &lt;span style="color: #0000ff"&gt;CONSTRAINT&lt;/span&gt; [PK_T_Envio] &lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;KEY&lt;/span&gt; &lt;span style="color: #0000ff"&gt;CLUSTERED&lt;/span&gt; 
(
    [Id] &lt;span style="color: #0000ff"&gt;ASC&lt;/span&gt;
)&lt;span style="color: #0000ff"&gt;WITH&lt;/span&gt; (IGNORE_DUP_KEY = &lt;span style="color: #0000ff"&gt;OFF&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]
) &lt;span style="color: #0000ff"&gt;ON&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;PRIMARY&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;A continuación deberemos crear un nuevo proyecto para la capa que nos queda, la capa de presentación. En este proyecto es en el que veremos las distintas formas de utilizar los objetos.&lt;/p&gt;
&lt;h3&gt;De dónde se obtienen los datos.&lt;/h3&gt;&lt;p&gt;Una de las primeras cosas que, cuando empecé en esto, me sorprendía, es que en todos los ejemplos de acceso a datos que encontraba por ahí, las conexiones con la base de datos se establecían al ladito de donde se cargaban los objetos de la capa de negocio. Esto, a mi modo de ver, no encaja en un enfoque orientado a objetos donde estos TIENEN que tener la posibilidad de no conocer cual es origen de los datos, pero también TIENEN que tener la posibilidad de especificarlo.&lt;/p&gt;
&lt;p&gt;¿Como se resuelve esta aparente paradoja? Pues dotándoles de dos propiedades que son delegados que retornaran, si están establecidos, la conexión y la transacción asignados a ese objeto. En el caso que no establezcamos dichos valores será la capa de acceso a datos la que tenga que decidir que conexión utilizar. Esta decisión se basa en si el proyecto es &lt;strong&gt;WEB&lt;/strong&gt; o &lt;strong&gt;WindowsForm&lt;/strong&gt; (supongo que la conexión está abierta durante la ejecución de la aplicación). &lt;/p&gt;
&lt;p&gt;Para simplificar las cosas aquí van dos ejemplos:&lt;/p&gt;
&lt;p&gt;Aplicación ASP.NET&lt;/p&gt;
&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;  &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Application_Start(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; EventArgs)
    &lt;span style="color: #008000"&gt;'Dal.DataServer.SetWebConnection(System.Configuration.ConfigurationManager.AppSettings(&amp;quot;ConnectionString&amp;quot;))&lt;/span&gt;
    Dal.DataServer.SetWebConnection(&amp;quot;server=.;database=TEST;uid=user;pwd=xxx&amp;quot;)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Sub&lt;/pre&gt;
&lt;p&gt;Aplicación WindowsForm:&lt;/p&gt;
&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;Dal.DataServer.Open(&lt;span style="color: #006080"&gt;&amp;quot;server=.;database=TEST;uid=user;pwd=xxx&amp;quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;La diferencia entre los dos “Modelos” es que en la primera se especifica la cadena de conexión y en la otra se abre realmente y queda a disposición de la aplicación.&lt;/p&gt;
&lt;p&gt;Veamos cual es el camino que sigue una petición de carga:&lt;/p&gt;
&lt;p&gt;1. Se solicita la carga de un objeto:&lt;/p&gt;
&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt; &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; __Envios &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Negocio.Envios = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.Envios().Carga()&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;2. La capa de negocio pasa la petición a la de Datos y le informa de lo que sabe (sus “provider”)&lt;/p&gt;
&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Carga(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envio
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
        Dal.Loader.LoadObject(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItem(id))
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt; &lt;span style="color: #008000"&gt;' El que los métodos devuelvan la instancia permite muuuuchas cosas.&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;En este &lt;a title="http://my.safaribooksonline.com/9780596517748/cascade?portal=oreilly" href="http://my.safaribooksonline.com/9780596517748/cascade?portal=oreilly" target="_blank"&gt;enlace&lt;/a&gt; se puede ver algún ejemplo de lo que se puede conseguir con la implementación de funciones que devuelven la instancia en lugar de la implementación de simples métodos. El que lo dice no es un cualquiera.&lt;/p&gt;
&lt;p&gt;3. El DAL realiza una serie de comprobaciones para determinar los parámetros( conexión y transacción) que debe utilizar:&lt;/p&gt;
&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CreateCommand() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.Data.IDbCommand
  &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = ConexionEnUso.CreateCommand()
  cmd.Connection = ConexionEnUso
  cmd.Transaction = TransaccionEnUso
  &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; cmd
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _ConexionActual &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConexionEnUso() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
  &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' Primero se intenta usar la conexion asignada al objeto&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _ConexionActual IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
    &lt;span style="color: #008000"&gt;' Luego se intenta usar el proveedor de conexion&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ConnectionProvider IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
      _ConexionActual = ConnectionProvider.Invoke()
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' Si la conexion compartida no existe se crea una nueva (normalmente para uso con WebForm)&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; DataServer.Connection &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
      _ConexionActual = DataServer.GetNewConection()
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.Connection() &lt;span style="color: #008000"&gt;' Se devuelve la connexion compartida (Esta ser� la usada normalmente por WindowsForm)&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Property&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetItem(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
  Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()   
    cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;&amp;quot;Select * from [TELMA_Envio] where Id={0}&amp;quot;&lt;/span&gt;, id)
    &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Function&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Otro día entraré a fondo en la clase DataServer y sus métodos y como nos permite controlar, trazar TODAS las consultas que hacemos a la base de datos. También debería volver a buscar las páginas de las que aprendí todo lo que estoy poniendo aquí y enlazarlas. Prometo hacerlo.&lt;/p&gt;
&lt;h3&gt;Cómo deben comportarse los objetos&lt;/h3&gt;&lt;p&gt;Los objetos deben comportarse bieen y ser bueeeeeeeeenos. Además, y algo muy importante, TODOS deben comportarse de forma parecida a fin de que el conocimiento por parte de un componente del equipo del código de un objeto u objetos, le haga sentirse a gusto con el código desarrollado por los otros componentes.&lt;/p&gt;
&lt;p&gt;Yo propongo que:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Los elementos (no colecciones) deben poder grabarse, borrarse y cargarse. &lt;/li&gt;
  &lt;li&gt;La grabación: Inserciones y actualizaciones se facilita si adoptamos Id únicos por registro. Yo siempre que puedo uso auto numéricos. &lt;/li&gt;
  &lt;li&gt;Con autonumericos el establecimiento de &lt;strong&gt;objeto.Id=0&lt;/strong&gt; implica una inserción en la base de datos al llamar a objeto.Save(). Posteriores llamadas as Save() provocan la actualización. &lt;/li&gt;
  &lt;li&gt;Los constructores de objetos NUNCA cargan el objeto. Utilizo New Negocio.Envio().Carga(25). &lt;/li&gt;
  &lt;li&gt;Los Elementos No cargan colecciones, eso lo dejo para las coleccionesDeObjetos &lt;/li&gt;
  &lt;li&gt;Las Colecciones de objetos SON LAS RESPONSABLES de cargar grupos de objetos. Para ello deberán tener metodos con nombres significativos como: CargaPorId(codigo), CargaPendientes(), etc.&amp;#160; Por favor evitar esto: CarIElePend(), No hay quien se entere luego. &lt;/li&gt;
  &lt;li&gt;Siempre que se pueda, y aquí entran cuestiones de rendimiento, el primer enfoque que doy a la carga de entidades relacionada es la Lazy Load o Carga Perezosa con algun mecanismo de caheo. De esta manera los objetos no pierden “su integridad” y siguen funcionando como se espera tras implementar diferentes modos de carga: en un escenario haciendo un inner join con Provincias y en otro escenario con Facturas donde no interesa en absoluto la información de las anteriores. Esto también es tema de grandes discusiones y de otro posible post. &lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;El ejemplo&lt;/h3&gt;&lt;p&gt;Bueno todo esto empezó con que iba a poner un ejemplo. Al final me he liado.&lt;/p&gt;
&lt;p&gt;Una vez que tenemos una ventana de prueba en un proyecto de prueba en el que hemos referenciado Dal.dll y Negocio.dll&lt;/p&gt;
&lt;p&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="380" alt="image" src="http://lh6.ggpht.com/_YppF1PaTjNE/SUjlAQE8K_I/AAAAAAAAABQ/kpXbjxs9tEs/image%5B5%5D.png?imgmax=800" width="673" border="0" /&gt; &lt;/p&gt;
&lt;p&gt;escribimos es siguiente código en el formulario:&lt;/p&gt;&lt;div&gt;
  &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Form1
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Form1_Load(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.Load
    &lt;span style="color: #008000"&gt;' Si quisieramos una sola conexión por aplicación descomentariar la linea siguiente&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'Dal.DataServer.Open(&amp;quot;server=.;database=TRACTORES;uid=xxx;pwd=xxx&amp;quot;)&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' Para simular un entorno WEB donde las conexiones se deben crear y cerrar mu rapido :-)&lt;/span&gt;
    Dal.DataServer.SetWebConnection(&lt;span style="color: #006080"&gt;&amp;quot;server=.;database=TRACTORES;uid=xx;pwd=xx&amp;quot;&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; btnEjecutar_Click(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.EventArgs) &lt;span style="color: #0000ff"&gt;Handles&lt;/span&gt; btnEjecutar.Click
    &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ListBox1.DataSource = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Negocio.Envios().Carga()
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ListBox1.DisplayMember = &lt;span style="color: #006080"&gt;&amp;quot;IdEnvio&amp;quot;&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ListBox1.DataSource = .this
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Class&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Nuestra ventana se ve así&lt;/p&gt;&lt;p&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="241" alt="image" src="http://lh3.ggpht.com/_YppF1PaTjNE/SUjpqw5zFmI/AAAAAAAAABc/138EndkI_jk/image%5B11%5D.png?imgmax=800" width="395" border="0" /&gt; &lt;/p&gt;
&lt;p&gt;Bueno pues esto es todo por hoy.
  &lt;br /&gt;No he pensado nunca en hacer esto, y mira lo he hecho he escrito un articulo en un blog.

  &lt;br /&gt;CONTINUARÁ 

  &lt;br /&gt;Saludos.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-6965570782546293435?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/6965570782546293435/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=6965570782546293435&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6965570782546293435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6965570782546293435'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/copa.html' title='Un ejemplo práctico'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_YppF1PaTjNE/SUjBc2-ZLsI/AAAAAAAAABM/S9TeYmc8smk/s72-c/image%5B13%5D.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-4704932533655837918</id><published>2008-12-16T17:33:00.001+01:00</published><updated>2008-12-16T17:42:40.078+01:00</updated><title type='text'>Explicación del Proyecto Base</title><content type='html'>&lt;p&gt;Todos estos archivos forman parte del “Proyecto base”. Exceptuando los que hacen referencia a Envíos que es una entidad de ejemplo para que se pueda ver como interactúan las dos “Capas”.&lt;/p&gt; &lt;p&gt;La idea es generar el código de estas dos capas: la de Negocio y la de Acceso a Datos que se repite en todas las entidades. Para esto he creado una herramienta de uso interno. Le he mandado el código tanto del generador como del proyecto base a &lt;a href="http://geeks.ms/blogs/erodriguez/default.aspx" target="_blank"&gt;El blog de Quique&lt;/a&gt;. No se si lo pondrá en geeks&amp;nbsp; no obstante existen multitud de generadores que se podrían utilizar.&lt;/p&gt; &lt;p&gt;Es necesario decir que muchas de las cosas que este modelo tiene(buenas se entiende) no se me han ocurrido a mi solo. Lo que he hecho es solo coger algo de aquí y algo de allí y unirlo. Muchas de las ideas y de la información están en CodeProject.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-4704932533655837918?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/4704932533655837918/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=4704932533655837918&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4704932533655837918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4704932533655837918'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/explicacin-del-proyecto-base.html' title='Explicación del Proyecto Base'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-4495659180988793329</id><published>2008-12-16T14:02:00.001+01:00</published><updated>2008-12-16T14:02:11.916+01:00</updated><title type='text'>Negocio.EnviosCollection.vb</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;' Fichero generado con PolCodeGen&lt;/span&gt;
&lt;span style="color: #008000"&gt;'        __          __               _     ___             _                   ___  &lt;/span&gt;
&lt;span style="color: #008000"&gt;'       /__\  __ _  / _|  __ _   ___ | |   / __\ __ _  ___ | |_  _ __  ___     / _ \ ___   _ __ ___    ___  ____&lt;/span&gt;
&lt;span style="color: #008000"&gt;'      / \// / _` || |_  / _` | / _ \| |  / /   / _` |/ __|| __|| '__|/ _ \   / /_\// _ \ | '_ ` _ \  / _ \|_  /&lt;/span&gt;
&lt;span style="color: #008000"&gt;'     / _  \| (_| ||  _|| (_| ||  __/| | / /___| (_| |\__ \| |_ | |  | (_) | / /_\\| (_) || | | | | ||  __/ / / &lt;/span&gt;
&lt;span style="color: #008000"&gt;'     \/ \_/ \__,_||_|   \__,_| \___||_| \____/ \__,_||___/ \__||_|   \___/  \____/ \___/ |_| |_| |_| \___|/___|                                                                   &lt;/span&gt;
&lt;span style="color: #008000"&gt;'&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio
  &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' Envios es una slase de contiene elementos del tipo Envio&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
  &amp;lt;Xml.Serialization.XmlRoot(&lt;span style="color: #006080"&gt;"Envios"&lt;/span&gt;)&amp;gt; _ 
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Envios : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; ColeccionBase(Of Envio)
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Const&lt;/span&gt; ClassName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = &lt;span style="color: #006080"&gt;"Coleccion de Envios"&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Referencia a la instancia.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''&amp;lt;example&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;c&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' With New Envios()&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''   DoSomething(.this())&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''   .DoPrint()&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' End With&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/c&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/example&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; this() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envios
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Values(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fieldName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; th &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; TransactionHelper) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;()    
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; DAL.Envios()
        D__.ConnectionProvider = th.ConnectionProvider
        D__.TransactionProvider = th.TransactionProvider      
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; D__.GetDistinctItem(fieldName)
          &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; Cadenas__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Generic.List(Of &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
          &lt;span style="color: #0000ff"&gt;Do&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Until&lt;/span&gt; .Read() = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Not&lt;/span&gt; &lt;span style="color: #0000ff"&gt;TypeOf&lt;/span&gt; (.GetValue(0)) &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; System.DBNull &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; Cadenas__.Add(.GetValue(0))
          &lt;span style="color: #0000ff"&gt;Loop&lt;/span&gt;
          .Close()
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Cadenas__.ToArray()
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;        
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using      
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Recuperación desde la Base de Datos "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Carga todos los elementos del tipo Envio desde la base de datos en la colección&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Carga() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envios
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Dal.Loader.LoadObjects(Of Envio)(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItems())
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'Public Function CargaByXXX(ByVal IdXXX As Integer) As Envios&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'  Using D__ As New DAL.Envios(ConnectionProvider, TransactionProvider)&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'    Return DAL.Loader.LoadObjects(Of Envio)(Me, D__.GetItemsByXXX(IdXXX))&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'  End Using      &lt;/span&gt;
    &lt;span style="color: #008000"&gt;'End Function    &lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;
  

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-4495659180988793329?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/4495659180988793329/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=4495659180988793329&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4495659180988793329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4495659180988793329'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negocioenvioscollectionvb.html' title='Negocio.EnviosCollection.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-1615550133507145854</id><published>2008-12-16T14:01:00.001+01:00</published><updated>2008-12-16T14:01:01.199+01:00</updated><title type='text'>Negocio.Envio.vb</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;' Fichero autogenerado con PolCodeGen&lt;/span&gt;
&lt;span style="color: #008000"&gt;'        __          __               _     ___             _                   ___  &lt;/span&gt;
&lt;span style="color: #008000"&gt;'       /__\  __ _  / _|  __ _   ___ | |   / __\ __ _  ___ | |_  _ __  ___     / _ \ ___   _ __ ___    ___  ____&lt;/span&gt;
&lt;span style="color: #008000"&gt;'      / \// / _` || |_  / _` | / _ \| |  / /   / _` |/ __|| __|| '__|/ _ \   / /_\// _ \ | '_ ` _ \  / _ \|_  /&lt;/span&gt;
&lt;span style="color: #008000"&gt;'     / _  \| (_| ||  _|| (_| ||  __/| | / /___| (_| |\__ \| |_ | |  | (_) | / /_\\| (_) || | | | | ||  __/ / / &lt;/span&gt;
&lt;span style="color: #008000"&gt;'     \/ \_/ \__,_||_|   \__,_| \___||_| \____/ \__,_||___/ \__||_|   \___/  \____/ \___/ |_| |_| |_| \___|/___|                                                                   &lt;/span&gt;

&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio
  &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' Clase de Envio&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
  &amp;lt;Serializable()&amp;gt; _
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Envio : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; ObjetoBase
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Const&lt;/span&gt; ClassName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = &lt;span style="color: #006080"&gt;"Envio"&lt;/span&gt;
    
&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Recuperación desde la Base de Datos "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Carga el objeto con los valores del registro de la base de datos con el id especificado.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Carga(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envio
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
        Dal.Loader.LoadObject(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;, D__.GetItem(id))
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt; 

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Grabar y Borrar "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Save() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envio
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)        
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _id = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
          _id = D__.Insert(IdEnvio, Observaciones, NumeroDeRegistro, FechaDeRegistro, Usuario)
        &lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;
          D__.Update(Id, IdEnvio, Observaciones, NumeroDeRegistro, FechaDeRegistro, Usuario)
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; DeleteString() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"Confirma la eliminación del Envio: {0}"&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Delete()
      Using D__ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.Envios(ConnectionProvider, TransactionProvider)
        D__.Delete(_id)        
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using  
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;   
  


&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Propiedades enlazadas a Datos "&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el Id del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad Id obtiene o establece el valor de la variable privada _id.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Id() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _id
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)      
        _id = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _idEnvio &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el IdEnvio del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad IdEnvio obtiene o establece el valor de la variable privada _idEnvio.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; IdEnvio() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _idEnvio
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        _idEnvio = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _observaciones &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el Observaciones del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad Observaciones obtiene o establece el valor de la variable privada _observaciones.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Observaciones() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _observaciones
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        _observaciones = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _numeroDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el NumeroDeRegistro del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad NumeroDeRegistro obtiene o establece el valor de la variable privada _numeroDeRegistro.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; NumeroDeRegistro() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _numeroDeRegistro
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        _numeroDeRegistro = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _fechaDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el FechaDeRegistro del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad FechaDeRegistro obtiene o establece el valor de la variable privada _fechaDeRegistro.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; FechaDeRegistro() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _fechaDeRegistro
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      _fechaDeRegistro = DateTime.Parse(value).ToString(&lt;span style="color: #006080"&gt;"dd/MM/yyyy"&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
      _fechaDeRegistro = &lt;span style="color: #006080"&gt;""&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _fecha &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el Fecha del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad Fecha obtiene o establece el valor de la variable privada _fecha.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Fecha() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _fecha
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      _fecha = DateTime.Parse(value).ToString(&lt;span style="color: #006080"&gt;"dd/MM/yyyy"&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
      _fecha = &lt;span style="color: #006080"&gt;""&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Obtiene o establece el Usuario del Envio&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' La propiedad Usuario obtiene o establece el valor de la variable privada _usuario.&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Usuario() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _usuario
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)      
        _usuario = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;    

    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Devuelve una cadena que representa al objeto&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToString() &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; id.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; idEnvio.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; observaciones.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; numeroDeRegistro.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; fechaDeRegistro.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; fecha.ToString() &amp;amp; &lt;span style="color: #006080"&gt;" "&lt;/span&gt; &amp;amp; usuario.ToString()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Devuelve una cadena que representa al objeto&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="customFormat"&amp;gt; Indica se se realizará el formato personalizado &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToString(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; customFormat &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;      
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ToString()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''&amp;lt;example&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;c&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' With New Envio()&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''   DoSomething(.this())&lt;/span&gt;
    &lt;span style="color: #008000"&gt;'''   .DoPrint()&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' End With&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/c&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/example&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shadows&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; this() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Envio
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Cargador del objeto "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; InitDataBinder()
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _DataBinder &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.ObjectLoader()
          _DataBinder = .this
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"id"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Id"&lt;/span&gt;, 0,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"idEnvio"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"IdEnvio"&lt;/span&gt;, 1,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"observaciones"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Observaciones"&lt;/span&gt;, 2,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"numeroDeRegistro"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"NumeroDeRegistro"&lt;/span&gt;, 3,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"fechaDeRegistro"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"FechaDeRegistro"&lt;/span&gt;, 4,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"fecha"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Fecha"&lt;/span&gt;, 5,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)))
          .Add(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Dal.BindItem(&lt;span style="color: #006080"&gt;"usuario"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Usuario"&lt;/span&gt;, 6,&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)))       
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;with&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; _DataBinder &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetBinder() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader
      InitDataBinder()
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _DataBinder
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;
  
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-1615550133507145854?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/1615550133507145854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=1615550133507145854&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/1615550133507145854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/1615550133507145854'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negocioenviovb.html' title='Negocio.Envio.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-6530409897201275652</id><published>2008-12-16T13:59:00.003+01:00</published><updated>2008-12-16T13:59:43.418+01:00</updated><title type='text'>Negocio.Core.TransactionHelper.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; TransactionHelper : &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IDisposable

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; connection &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection)
      _Connection = connection
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; BeginTransaction()
      _Transaction = Dal.DataServer.CreateTransaction(_Connection)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Commit()
      Dal.DataServer.Commit(_Transaction)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; RollBack()
      Dal.DataServer.Rollback(_Transaction)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Connection &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Connection() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Connection
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Transaction &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Transaction() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Transaction
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; Connection
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TransactionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; Transaction
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" IDisposable "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _disposedValue &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Dispose(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; disposing &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Not&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;._disposedValue &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; disposing &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;

        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        Connection.Close()
        Connection.Dispose()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;._disposedValue = &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Dispose() &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IDisposable.Dispose
      Dispose(&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)
      GC.SuppressFinalize(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;


  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-6530409897201275652?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/6530409897201275652/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=6530409897201275652&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6530409897201275652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6530409897201275652'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negociocoretransactionhelpervb.html' title='Negocio.Core.TransactionHelper.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-3331720499749673054</id><published>2008-12-16T13:59:00.001+01:00</published><updated>2008-12-16T13:59:09.072+01:00</updated><title type='text'>Negocio.Core.ObjetoBase.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio

  &amp;lt;Serializable()&amp;gt; _
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; ObjetoBase : &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IExportable : &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;MustOverride&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Id() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;MustOverride&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToString(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; CustomFormat &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; DeleteString() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"Confirma la eliminacion del elemento: {0}"&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Interface ILoader "&lt;/span&gt;
    &amp;lt;NonSerialized()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _ConnectionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.ConnectionProvider
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConnectionProvider
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate)
        _ConnectionProvider = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &amp;lt;NonSerialized()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _TransactionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TransactionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.transactionProvider
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _TransactionProvider
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate)
        _TransactionProvider = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetBinder() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.GetObjectLoader
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToXml() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IExportable.FormatoXml
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; _SWriter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.StringWriter()
        .Serialize(_SWriter, &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; xml &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = _SWriter.ToString()
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Xml.XmlDocument()
          .LoadXml(xml)
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; .DocumentElement.InnerXml
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToCSV(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; separador &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IExportable.FormatoCsv
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; _SWriter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.StringWriter()
        .Serialize(_SWriter, &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Xml.XmlDocument()
          .LoadXml(_SWriter.ToString())
          &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; s &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Text.StringBuilder
          &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color: #0000ff"&gt;To&lt;/span&gt; .ChildNodes(1).ChildNodes.Count - 1
            s.Append(.ChildNodes(1).ChildNodes(i).InnerText.Replace(separador, &lt;span style="color: #006080"&gt;"."&lt;/span&gt;) &amp;amp; separador)
          &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
          s.Remove(s.Length - 1, 1)
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; s.ToString
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; HeaderCSV(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; separador &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IExportable.HeaderCsv
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(&lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; _SWriter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.StringWriter()
        .Serialize(_SWriter, &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;)
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Xml.XmlDocument()
          .LoadXml(_SWriter.ToString())
          &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; s &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Text.StringBuilder
          &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = 0 &lt;span style="color: #0000ff"&gt;To&lt;/span&gt; .ChildNodes(1).ChildNodes.Count - 1
            s.Append(.ChildNodes(1).ChildNodes(i).Name &amp;amp; separador)
          &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
          s.Remove(s.Length - 1, 1)
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; s.ToString
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; this() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjetoBase
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &amp;lt;NonSerialized()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Tag &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Tag() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Tag
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;)
        _Tag = Value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToBase64XmlString(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; writer &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream()
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; formatter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Xml.Serialization.XmlSerializer = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(input.&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;)
      formatter.Serialize(writer, input)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Convert.ToBase64String(writer.ToArray)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FromBase64XmlString(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; input.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; formatter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Xml.Serialization.XmlSerializer = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T))
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; formatter.Deserialize(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream(Convert.FromBase64String(input)))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Compresion "&lt;/span&gt;


    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToBase64XmlStringCompress(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; writer &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream()
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; formatter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Xml.Serialization.XmlSerializer = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(input.&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;)
      &lt;span style="color: #008000"&gt;'Dim formatter As Runtime.Serialization.Formatters.Binary.BinaryFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter()&lt;/span&gt;
      formatter.Serialize(writer, input)
      writer.Position = 0
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Convert.ToBase64String(Compress(writer))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FromBase64XmlStringCompress(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; input &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; input.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; formatter &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Xml.Serialization.XmlSerializer = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Xml.Serialization.XmlSerializer(&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T))
      &lt;span style="color: #008000"&gt;'Dim formatter As Runtime.Serialization.Formatters.Binary.BinaryFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter()&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; formatter.Deserialize(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream(Decompress(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream(Convert.FromBase64String(input)))))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Compress(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; stream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Stream) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;()
      Using resultStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.MemoryStream = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream()
        Using writeStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Compression.GZipStream = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.Compression.GZipStream(resultStream, IO.Compression.CompressionMode.Compress, &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)
          CopyBuffered(stream, writeStream)
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; resultStream.ToArray()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; bufferSize &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = 10000
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; CopyBuffered(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; readStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Stream, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; writeStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Stream)
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; bytes(bufferSize) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; byteCount &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = readStream.Read(bytes, 0, bytes.Length)
      &lt;span style="color: #0000ff"&gt;While&lt;/span&gt; byteCount &amp;lt;&amp;gt; 0
        writeStream.Write(bytes, 0, byteCount)
        byteCount = readStream.Read(bytes, 0, bytes.Length)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;While&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Decompress(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; stream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Stream) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;()
      Using decompressedStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.Stream = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.Compression.GZipStream(stream, IO.Compression.CompressionMode.Decompress, &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;)
        Using resultStream &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IO.MemoryStream = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; IO.MemoryStream()
          CopyBuffered(decompressedStream, resultStream)
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; resultStream.ToArray()
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;


  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-3331720499749673054?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/3331720499749673054/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=3331720499749673054&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/3331720499749673054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/3331720499749673054'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negociocoreobjetobasevb.html' title='Negocio.Core.ObjetoBase.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-538721807556286079</id><published>2008-12-16T13:57:00.001+01:00</published><updated>2008-12-16T13:57:27.629+01:00</updated><title type='text'>Negocio.Core.IExportable.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Interface&lt;/span&gt; IExportable
    &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FormatoXml() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FormatoCsv(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; separador &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; HeaderCsv(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; separador &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Interface&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-538721807556286079?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/538721807556286079/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=538721807556286079&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/538721807556286079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/538721807556286079'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negociocoreiexportablevb.html' title='Negocio.Core.IExportable.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-2598484620842806200</id><published>2008-12-16T13:56:00.001+01:00</published><updated>2008-12-16T13:56:49.541+01:00</updated><title type='text'>Negocio.Core.Factory.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Factory

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Crear(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, Dal.ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; th &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; TransactionHelper) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; __O &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; T
      __O.ConnectionProvider = th.ConnectionProvider
      __O.transactionProvider = th.TransactionProvider
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; __O
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Crear(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, Dal.ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cp &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; tp &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; __O &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; T
      __O.ConnectionProvider = cp
      __O.transactionProvider = tp
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; __O
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Crear(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, Dal.ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cp &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; __O &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; T
      __O.ConnectionProvider = cp
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; __O
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Crear(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, Dal.ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; servidor &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; baseDeDatos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; password &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Crear(Of T)(&lt;span style="color: #0000ff"&gt;New&lt;/span&gt; TransactionHelper(Dal.DataServer.GetNewConection(servidor, baseDeDatos, usuario, password)).ConnectionProvider)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; this() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Factory
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-2598484620842806200?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/2598484620842806200/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=2598484620842806200&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2598484620842806200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2598484620842806200'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negociocorefactoryvb.html' title='Negocio.Core.Factory.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-2683993764632768599</id><published>2008-12-16T13:55:00.001+01:00</published><updated>2008-12-16T13:55:47.793+01:00</updated><title type='text'>Negocio.Core.CollectionBase.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Negocio

  &amp;lt;Serializable()&amp;gt; _
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; ColeccionBase(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjetoBase) : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; Generic.List(Of T) : &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Remove(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;MyBase&lt;/span&gt;.Remove(Item(id))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Default&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overloads&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Item(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.Find(&lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;(o &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjetoBase) o.Id = id)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Interface ILoader "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _ConnectionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.ConnectionProvider
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConnectionProvider
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate)
        _ConnectionProvider = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _TransactionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TransactionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.transactionProvider
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _TransactionProvider
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate)
        _TransactionProvider = value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetBinder() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ObjectLoader &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; Dal.ILoader.GetObjectLoader
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

    &amp;lt;NonSerialized()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Tag &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &amp;lt;Xml.Serialization.XmlIgnore()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Tag() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Tag
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;)
        _Tag = Value
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Set&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-2683993764632768599?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/2683993764632768599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=2683993764632768599&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2683993764632768599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2683993764632768599'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/negociocorecollectionbasevb.html' title='Negocio.Core.CollectionBase.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-7133766013319892690</id><published>2008-12-16T13:54:00.001+01:00</published><updated>2008-12-16T13:54:52.791+01:00</updated><title type='text'>Dal.Core.Helper.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;NotInheritable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Helpers

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;


    &lt;span style="color: #008000"&gt;' Formatear cadenas para sentencias SQL&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ParseCadena(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OrElse&lt;/span&gt; value.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"'{0}'"&lt;/span&gt;, value.Replace(&lt;span style="color: #006080"&gt;"'"&lt;/span&gt;, &lt;span style="color: #006080"&gt;"''"&lt;/span&gt;))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Formatear cadenas para sentencias SQL&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ParseNulableInteger(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; i &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;.TryParse(value, i) = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; i = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; i
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Formatear N�meros para sentencias SQL&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FormateaNumero(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OrElse&lt;/span&gt; value.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Replace(value, &lt;span style="color: #006080"&gt;","&lt;/span&gt;, &lt;span style="color: #006080"&gt;"."&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Formatear Fechas para sentencias SQL&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ParseFecha(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;OrElse&lt;/span&gt; value.Length = 0 &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;.Parse(value).ToString(&lt;span style="color: #006080"&gt;"\'yyyyMMdd HH:mm:ss\'"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #006080"&gt;"NULL"&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Module&lt;/span&gt; HexHelper
    &amp;lt;System.Runtime.CompilerServices.Extension()&amp;gt; _
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ToHexString(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt;()) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; hex &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.Text.StringBuilder = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Text.StringBuilder(value.Length * 2)
      &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; b &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Byte&lt;/span&gt; &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; value
        hex.AppendFormat(&lt;span style="color: #006080"&gt;"{0:x2}"&lt;/span&gt;, b)
      &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; hex.ToString()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;  
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Module&lt;/span&gt;


&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-7133766013319892690?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/7133766013319892690/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=7133766013319892690&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/7133766013319892690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/7133766013319892690'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/dalcorehelpervb.html' title='Dal.Core.Helper.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-4137127897249860518</id><published>2008-12-16T13:53:00.001+01:00</published><updated>2008-12-16T13:53:14.316+01:00</updated><title type='text'>Dal.Envios.vb</title><content type='html'>&lt;p&gt;&lt;/p&gt; &lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #008000"&gt;' Fichero autogenerado con PolCodeGen&lt;/span&gt;
&lt;span style="color: #008000"&gt;'        __          __               _     ___             _                   ___  &lt;/span&gt;
&lt;span style="color: #008000"&gt;'       /__\  __ _  / _|  __ _   ___ | |   / __\ __ _  ___ | |_  _ __  ___     / _ \ ___   _ __ ___    ___  ____&lt;/span&gt;
&lt;span style="color: #008000"&gt;'      / \// / _` || |_  / _` | / _ \| |  / /   / _` |/ __|| __|| '__|/ _ \   / /_\// _ \ | '_ ` _ \  / _ \|_  /&lt;/span&gt;
&lt;span style="color: #008000"&gt;'     / _  \| (_| ||  _|| (_| ||  __/| | / /___| (_| |\__ \| |_ | |  | (_) | / /_\\| (_) || | | | | ||  __/ / / &lt;/span&gt;
&lt;span style="color: #008000"&gt;'     \/ \_/ \__,_||_|   \__,_| \___||_| \____/ \__,_||___/ \__||_|   \___/  \____/ \___/ |_| |_| |_| \___|/___|                                                                   &lt;/span&gt;
&lt;span style="color: #008000"&gt;'&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt; Dal.Helpers

&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal
  &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' Clase de acceso a datos de Envios&lt;/span&gt;
  &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Envios : &lt;span style="color: #0000ff"&gt;Inherits&lt;/span&gt; ObjetoBase  
  
&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Constructores "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Contructor por defecto de instancias de Envios &lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
      &lt;span style="color: #0000ff"&gt;MyBase&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; conexion &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection)
      &lt;span style="color: #0000ff"&gt;MyBase&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(conexion)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' constructor de instancias de Envios proporcionando&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' un proveedor de conexión y un proveedor de transacción&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="cP"&amp;gt; Proveedor de conexión que utilizará el objeto para obtener la conexión. &amp;lt;/param&amp;gt;    &lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="tP"&amp;gt; Proveedor de transacción que utilizará el objeto para obtener la transacción. &amp;lt;/param&amp;gt;    &lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cp &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ConnectionProviderDelegate, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; tp &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; TransactionProviderDelegate)
      &lt;span style="color: #0000ff"&gt;MyBase&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(cp, tp)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Recuperación de datos "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetItems() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()
        cmd.CommandText = &lt;span style="color: #006080"&gt;"Select * from [T_Envio]"&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; __GetItems(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; filtro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; filtro = &lt;span style="color: #006080"&gt;""&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; GetItems()
      Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()
        cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"Select * from [T_Envio] where 1=1 and {0}"&lt;/span&gt;, filtro)
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetItem(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()   
        cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"Select * from [T_Envio] where Id={0}"&lt;/span&gt;, id)
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetDistinctItem(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fieldName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()        
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; fieldName = &lt;span style="color: #006080"&gt;""&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; fieldName = &lt;span style="color: #006080"&gt;"Id"&lt;/span&gt;
        cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"Select Distinct {0} from [T_Envio] order by {0} asc"&lt;/span&gt;, fieldName)
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteReader(cmd)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de Envios proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Delete(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      Using cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()
        cmd.CommandText = &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"Delete from [T_Envio] where ID={0}"&lt;/span&gt;, id)
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteNonQuery(cmd)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;        
    
&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Inserción "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de  proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Insert(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; idEnvio &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                           &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; observaciones &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                           &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; numeroDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                           &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fechaDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                           &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      Using CM &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()

        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Text.StringBuilder()
          .Append(&lt;span style="color: #006080"&gt;"Insert into [T_Envio] "&lt;/span&gt;)
          .Append(&lt;span style="color: #006080"&gt;"(IdEnvio,Observaciones,NumeroDeRegistro,FechaDeRegistro,Usuario)"&lt;/span&gt;)
          .AppendFormat(&lt;span style="color: #006080"&gt;" values({0},{1},{2},{3},{4});SELECT @@IDENTITY;"&lt;/span&gt;, _
              &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;() {ParseCadena(idEnvio), _
                            ParseCadena(observaciones), _
                            ParseCadena(numeroDeRegistro), _
                            ParseFecha(fechaDeRegistro), _
                            ParseCadena(usuario)})
          CM.CommandText = .ToString
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteScalar(Of &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)(CM)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Modificación "&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' Constructor de instancias de  proporcionando en &amp;lt;param ref="conexion" /&amp;gt; la conexión&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color: #008000"&gt;''' &amp;lt;param name="conexion"&amp;gt; Conexión que utilizará el objeto. &amp;lt;/param&amp;gt;&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Update(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; id &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, _
                            &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; idEnvio &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                            &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; observaciones &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                            &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; numeroDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                            &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fechaDeRegistro &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, _
                            &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      Using CM &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = CreateCommand()
        &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; System.Text.StringBuilder()
          .Append(&lt;span style="color: #006080"&gt;"Update [T_Envio] SET "&lt;/span&gt;)
          .AppendFormat(&lt;span style="color: #006080"&gt;"IdEnvio={1},Observaciones={2},NumeroDeRegistro={3},FechaDeRegistro={4},Usuario={5}"&lt;/span&gt; &amp;amp; _
                        &lt;span style="color: #006080"&gt;" Where Id={0};"&lt;/span&gt;, _
              &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;() {id, _
                            ParseCadena(idEnvio), _
                            ParseCadena(observaciones), _
                            ParseCadena(numeroDeRegistro), _
                            ParseFecha(fechaDeRegistro), _
                            ParseCadena(usuario)})
          CM.CommandText = .ToString
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.ExecuteNonQuery(CM)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Using
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

   
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; 
&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-4137127897249860518?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/4137127897249860518/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=4137127897249860518&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4137127897249860518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4137127897249860518'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/dalenviosvb.html' title='Dal.Envios.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-2390986988161710716</id><published>2008-12-16T13:48:00.001+01:00</published><updated>2008-12-16T13:48:35.754+01:00</updated><title type='text'>Dal.Core.ObjetoBase.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;MustInherit&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; ObjetoBase : &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; IDisposable
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; ConnectionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; TransactionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Constructores "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; conexion_ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection)
      _ConexionActual = conexion_
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; connectionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ConnectionProviderDelegate, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; transactionProvider &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; TransactionProviderDelegate)
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ConnectionProvider = connectionProvider
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.TransactionProvider = transactionProvider
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;


    &lt;span style="color: #008000"&gt;' Destructor&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overrides&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Finalize()
      Dispose(&lt;span style="color: #0000ff"&gt;False&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Dispose() &lt;span style="color: #0000ff"&gt;Implements&lt;/span&gt; System.IDisposable.Dispose
      Dispose(&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)
      GC.SuppressFinalize(&lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Overridable&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Dispose(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; disposing &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; ConnectionProvider IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; disposing = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; _ConexionActual = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; : &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _ConexionActual &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; ConnectionProvider &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        _ConexionActual.Close()
        _ConexionActual.Dispose()
        _ConexionActual = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;


    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _ConexionActual &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConexionEnUso() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #008000"&gt;' Primero se intenta usar la conexion asignada al objeto&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _ConexionActual IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
        &lt;span style="color: #008000"&gt;' Luego se intenta usar el proveedor de conexion&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.ConnectionProvider IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
          _ConexionActual = ConnectionProvider.Invoke()
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        &lt;span style="color: #008000"&gt;' Si la conexion compartida no existe se crea una nueva (normalmente para uso con WebForm)&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; DataServer.Connection &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
          _ConexionActual = DataServer.GetNewConection()
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _ConexionActual
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.Connection() &lt;span style="color: #008000"&gt;' Se devuelve la connexion compartida (Esta ser� la usada normalmente por WindowsForm)&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Transaction &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; TransaccionEnUso() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #008000"&gt;' Primero se intenta usar la _Transaction asignada al objeto&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Transaction
        &lt;span style="color: #008000"&gt;' si hay un delegado lo llamamos&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; TransactionProvider IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
          _Transaction = TransactionProvider.Invoke()
          &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Transaction
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        &lt;span style="color: #008000"&gt;' Se devuelve la transaccion compartida&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; DataServer.Transaction
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CreateCommand() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; System.Data.IDbCommand
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand = ConexionEnUso.CreateCommand()
      cmd.Connection = ConexionEnUso
      cmd.Transaction = TransaccionEnUso
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; cmd
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-2390986988161710716?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/2390986988161710716/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=2390986988161710716&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2390986988161710716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/2390986988161710716'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/dalcoreobjetobasevb.html' title='Dal.Core.ObjetoBase.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-4822919498349738607</id><published>2008-12-16T13:47:00.001+01:00</published><updated>2008-12-16T13:47:15.024+01:00</updated><title type='text'>Dal.Core.DataServer.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; DataServer
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; CADENA_DE_CONEXION &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt; = &lt;span style="color: #006080"&gt;"server=serve;database=;uid=;pwd=;"&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' variable conexion&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; _connection &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbConnection
    &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; _Trazas &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BooleanSwitch = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; BooleanSwitch(&lt;span style="color: #006080"&gt;"ConsultasDAL"&lt;/span&gt;, &lt;span style="color: #006080"&gt;""&lt;/span&gt;, &lt;span style="color: #006080"&gt;"1"&lt;/span&gt;)
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; DisableLog &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Constructor privado&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
      &lt;span style="color: #008000"&gt;' Evitar la creacion de objetos de esta clase&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Propiedades "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionString() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _connection.ConnectionString()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Connection() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbConnection
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _connection
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Metodos "&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Abre la conexion con la base de datos&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Open(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; ConnectionString &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
      Close()
      _connection = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SqlClient.SqlConnection(ConnectionString)
      _connection.Open()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Cierra la conexion con la base de datos&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Close()
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _connection IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        _connection.Close()
        _connection.Dispose()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; SetWebConnection(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;)
      CADENA_DE_CONEXION = value
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; OpenInternal2(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; servidor &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; baseDeDatos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; password &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; tempConnection &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbConnection
      tempConnection = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SqlClient.SqlConnection(&lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format( _
                          &lt;span style="color: #006080"&gt;"server={0};database={1};uid={2};pwd={3};Application Name=AppName.WindowsForms;"&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;() { _
                          Helpers.ParseCadena(servidor), _
                          Helpers.ParseCadena(baseDeDatos), _
                          Helpers.ParseCadena(usuario), _
                          Helpers.ParseCadena(password)}))
      tempConnection.Open()

      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; &lt;span style="color: #0000ff"&gt;DirectCast&lt;/span&gt;(tempConnection, SqlClient.SqlConnection)
        Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"DAL.CreateConnection  : {0} {1}"&lt;/span&gt;, .GetHashCode, DateTime.Now.ToString(&lt;span style="color: #006080"&gt;"HH:mm:ss tt"&lt;/span&gt;)))
        &lt;span style="color: #0000ff"&gt;AddHandler&lt;/span&gt; .Disposed, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; OnDisposeConnection
        &lt;span style="color: #0000ff"&gt;AddHandler&lt;/span&gt; .StateChange, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; OnStateChange
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; tempConnection
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetNewConection(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; servidor &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; baseDeDatos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; usuario &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; password &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; OpenInternal2(servidor, baseDeDatos, usuario, password)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetNewConection() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; c &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; SqlClient.SqlConnection = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; SqlClient.SqlConnection(CADENA_DE_CONEXION)
      c.Open()
      &lt;span style="color: #0000ff"&gt;AddHandler&lt;/span&gt; c.Disposed, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; OnDisposeConnection
      Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"DAL.CreateConnection  : {0} {1}"&lt;/span&gt;, c.GetHashCode, DateTime.Now.ToString(&lt;span style="color: #006080"&gt;"HH:mm:ss tt"&lt;/span&gt;)))
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; c
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; OnDisposeConnection(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; EventArgs)
      Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"DAL.DisposeConnection : {0} {1}"&lt;/span&gt;, sender.GetHashCode, DateTime.Now.ToString(&lt;span style="color: #006080"&gt;"HH:mm:ss tt"&lt;/span&gt;)))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; OnStateChange(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; sender &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; StateChangeEventArgs)
      Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;.Format(&lt;span style="color: #006080"&gt;"DAL.StateChage : {0} {1}"&lt;/span&gt;, sender.GetHashCode, e.CurrentState))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Transacciones "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; _transaction &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbTransaction

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; InTransaction() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Transaction() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbTransaction
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _transaction
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CreateOrUseTransaction() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbTransaction
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _transaction &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; _transaction = CreateTransaction(_connection)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _transaction
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CreateTransaction(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; c &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbTransaction
      Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; BeginTransaction"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; c.BeginTransaction
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Rollback(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction)
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Rollback : No existe Transacción en curso"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;
        t.Rollback()
        t.Dispose()
        t = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
        Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Rollback"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Rollback()
      Rollback(_transaction)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Commit(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction)
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Commit: No existe Transacción en curso"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;Else&lt;/span&gt;
        t.Commit()
        t.Dispose()
        t = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
        Trace.WriteLineIf(_Trazas.Enabled, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Commit"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Commit()
      Commit(_transaction)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; DisposeTransaction(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbTransaction)
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; t IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        t.Dispose()
        t = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; DisposeTransaction()
      DisposeTransaction(_transaction)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteReader(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of IDataReader)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteReader)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteNonQuery(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteNonQuery)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteScalar(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; ExecuteCommand(Of T)(cmd, &lt;span style="color: #0000ff"&gt;AddressOf&lt;/span&gt; _ExecuteScalar)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #008000"&gt;' Para centralizar los mensajes de error de la Capa de Acceso a Datos&lt;/span&gt;
    &lt;span style="color: #008000"&gt;' de forma que se puedan: Escribir la sentencia SQL, escribir en un log, tratar el texto de error, etc&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ExecuteCommand(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; handler &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; CommandHandler(Of T)) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Trazas.Enabled &lt;span style="color: #0000ff"&gt;And&lt;/span&gt; DisableLog = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
          Trace.WriteLine(IIf(cmd.Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Transaction."&lt;/span&gt;, &lt;span style="color: #006080"&gt;"DAL."&lt;/span&gt;) &amp;amp; &lt;span style="color: #006080"&gt;"ExecuteCommand : "&lt;/span&gt; &amp;amp; cmd.CommandText)
        &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
        DisableLog = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; handler(cmd)
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; e &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
        &lt;span style="color: #008000"&gt;' Trace the exception into the same log.&lt;/span&gt;
        Trace.WriteLine(&lt;span style="color: #006080"&gt;"--- Exception : "&lt;/span&gt; &amp;amp; e.Message)
        &lt;span style="color: #008000"&gt;' Aqui se podría inntentar controlar los mensajes de error de clave duplicada, etc...&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Throw&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Exception(&lt;span style="color: #006080"&gt;"Data Access Layer Exception "&lt;/span&gt;, e)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteReader(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Cmd.ExecuteReader()
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteNonQuery(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; Res &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt; = Cmd.ExecuteNonQuery()
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; _Trazas.Enabled &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt;
        Trace.WriteLine(IIf(Cmd.Transaction IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;, &lt;span style="color: #006080"&gt;"Dal --&amp;gt; Transaction "&lt;/span&gt;, &lt;span style="color: #006080"&gt;"DAL "&lt;/span&gt;) &amp;amp; Res &amp;amp; &lt;span style="color: #006080"&gt;" Filas"&lt;/span&gt;)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;If&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Res
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; _ExecuteScalar(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Cmd.ExecuteScalar
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;
&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-4822919498349738607?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/4822919498349738607/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=4822919498349738607&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4822919498349738607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/4822919498349738607'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/dalcoredataservervb.html' title='Dal.Core.DataServer.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2088102121773217265.post-6349466489214172839</id><published>2008-12-16T12:58:00.000+01:00</published><updated>2008-12-16T13:37:49.890+01:00</updated><title type='text'>Dal.Core.DataLoader.vb</title><content type='html'>&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;Imports&lt;/span&gt; System.Reflection

&lt;span style="color: #0000ff"&gt;Namespace&lt;/span&gt; Dal

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; BeginLoadDelegate()
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; EndLoadDelegate(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fields &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; objects &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; CommandHandler(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; cmd &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbCommand) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; ConnectionProviderDelegate() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDbConnection
  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; TransactionProviderDelegate() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Data.IDbTransaction


  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; Loader
    &lt;span style="color: #008000"&gt;' Delegados para informar del comienzo y fin de la carga de los objetos&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; OnBeginLoad &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BeginLoadDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; OnEndLoad &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; EndLoadDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FillObjectsDelegate(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; c &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; t &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; FillObjectDelegate(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
      &lt;span style="color: #008000"&gt;' Constructor privado para evitar que se creen instancias de esta clase. &lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Cargar un objeto "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; LoadObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Loader_ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader)
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnBeginLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnBeginLoad()
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.Read() &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; PopulateObject(Target, dr, Loader_)
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnEndLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnEndLoad(Loader_.Campos.Count, 1)
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.IsClosed = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; dr.Close()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; LoadObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader)
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnBeginLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnBeginLoad()
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.Read() &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; PopulateObject(Target, dr)
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnEndLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnEndLoad(Target.GetObjectLoader.Campos.Count, 1)
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.IsClosed = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; dr.Close()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;

&lt;span style="color: #cc6633"&gt;#Region&lt;/span&gt; &lt;span style="color: #006080"&gt;" Creacion y carga de colecciones de objetos "&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; LoadObjects(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T), &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; LoadObjects(Target, dr, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; T().GetObjectLoader)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; s &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt; = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; LoadObjects(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T), &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Loader_ &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of T)
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;

        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; iLoader &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ILoader = &lt;span style="color: #0000ff"&gt;DirectCast&lt;/span&gt;(Target, ILoader) &lt;span style="color: #008000"&gt;'.GetObjectLoader&lt;/span&gt;

        &lt;span style="color: #008000"&gt;' Notificamos el inicio de la carga&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnBeginLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnBeginLoad()
        &lt;span style="color: #008000"&gt;' Se cachea el delegado creado dinamicamente&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; Loader_.FillObjectsDelegate &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; Loader_.FillObjectsDelegate = MakeFillObjectsDelegate(Of T)(Loader_)
        &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; D &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; FillObjectsDelegate(Of T) = Loader_.FillObjectsDelegate
        &lt;span style="color: #0000ff"&gt;Do&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Until&lt;/span&gt; dr.Read() = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt;
          Target.Add(D(dr, iLoader.ConnectionProvider, iLoader.transactionProvider))
        &lt;span style="color: #0000ff"&gt;Loop&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.IsClosed = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; dr.Close()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      &lt;span style="color: #008000"&gt;' Notificamos el fin de la carga&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; OnEndLoad IsNot &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; OnEndLoad(Loader_.Campos.Count, Target.Count)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Target
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;
&lt;span style="color: #cc6633"&gt;#End Region&lt;/span&gt;


    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; PopulateObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;, ILoader})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; PopulateObject(Target, dr, Target.GetObjectLoader)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; PopulateObject(Of T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; {&lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;})(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Target &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; dr &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; IDataReader, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Cargador &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; T
      &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; Cargador.FillObjectDelegate &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; Cargador.FillObjectDelegate = MakeFillObjectDelegate(Of T)(Cargador)
        &lt;span style="color: #0000ff"&gt;DirectCast&lt;/span&gt;(Cargador.FillObjectDelegate, FillObjectDelegate(Of T))(Target, dr)
      &lt;span style="color: #0000ff"&gt;Catch&lt;/span&gt; ex &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Exception
      &lt;span style="color: #0000ff"&gt;Finally&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;If&lt;/span&gt; dr.IsClosed = &lt;span style="color: #0000ff"&gt;False&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Then&lt;/span&gt; dr.Close()
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Try&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Target
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;


    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; MakeFillObjectsDelegate(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; loader &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; FillObjectsDelegate(Of T)
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; Metodo &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Emit.DynamicMethod(&lt;span style="color: #006080"&gt;""&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T), &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Type() {&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord), &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(ConnectionProviderDelegate), &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(TransactionProviderDelegate)}, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T), &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)

      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Metodo.GetILGenerator()
        &lt;span style="color: #008000"&gt;' Declarar Objeto de salida, Crearlo y Almacenarlo&lt;/span&gt;
        .DeclareLocal(&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T))
        .Emit(Emit.OpCodes.Newobj, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T).GetConstructor(Type.EmptyTypes))
        .Emit(Emit.OpCodes.Stloc_0)

        &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; F &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BindItem &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; loader.Campos
          &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; OmitirNullos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Emit.Label = .DefineLabel()
          &lt;span style="color: #008000"&gt;' Comprobar si el valor del campo es DbNull&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldarg_0)               &lt;span style="color: #008000"&gt;' DataRecord&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldc_I4, F.fieldInfo.Index)  &lt;span style="color: #008000"&gt;' Indice&lt;/span&gt;
          &lt;span style="color: #008000"&gt;' Llamada a la funcion &lt;/span&gt;
          .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord).GetMethod(&lt;span style="color: #006080"&gt;"IsDBNull"&lt;/span&gt;))
          &lt;span style="color: #008000"&gt;' Saltar a la etiqueta si hay null&lt;/span&gt;
          .Emit(Emit.OpCodes.Brtrue, OmitirNullos)

          &lt;span style="color: #008000"&gt;' Recuperar el valor del campo&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldloc_0)               &lt;span style="color: #008000"&gt;' Objeto Negocio&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldarg_0)               &lt;span style="color: #008000"&gt;' DataRecord&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldc_I4, F.fieldInfo.Index)  &lt;span style="color: #008000"&gt;' Indice&lt;/span&gt;
          .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord).GetMethod(&lt;span style="color: #006080"&gt;"get_Item"&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Type() {&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)}))
          &lt;span style="color: #0000ff"&gt;Select&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(Int32))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Decimal&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Decimal&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)
              .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;).GetMethod(&lt;span style="color: #006080"&gt;"ToString"&lt;/span&gt;, Type.EmptyTypes))
          &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;

          .Emit(Emit.OpCodes.Stfld, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T).GetField(&lt;span style="color: #006080"&gt;"_"&lt;/span&gt; + F.PropertyName, BindingFlags.NonPublic &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.Instance &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.IgnoreCase))
          &lt;span style="color: #008000"&gt;'.Emit(Emit.OpCodes.Callvirt, GetType(T).GetProperty(F.PropertyName).GetSetMethod)&lt;/span&gt;
          .MarkLabel(OmitirNullos)

        &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
        .Emit(Emit.OpCodes.Ldloc_0)
        .Emit(Emit.OpCodes.Ldarg_1)
        .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T).GetProperty(&lt;span style="color: #006080"&gt;"ConnectionProvider"&lt;/span&gt;, BindingFlags.&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.Instance &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.IgnoreCase).GetSetMethod)
        &lt;span style="color: #008000"&gt;'.Emit(Emit.OpCodes.Stfld, GetType(T).GetField("_ConnectionProvider", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.IgnoreCase))&lt;/span&gt;

        .Emit(Emit.OpCodes.Ldloc_0)
        .Emit(Emit.OpCodes.Ldarg_2)
        .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T).GetProperty(&lt;span style="color: #006080"&gt;"TransactionProvider"&lt;/span&gt;, BindingFlags.&lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.Instance &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.IgnoreCase).GetSetMethod)
        &lt;span style="color: #008000"&gt;'.Emit(Emit.OpCodes.Stfld, GetType(T).GetField("_TransactionProvider", BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.IgnoreCase))&lt;/span&gt;

        &lt;span style="color: #008000"&gt;' Cargar el objeto y devolverlo&lt;/span&gt;
        .Emit(Emit.OpCodes.Ldloc_0)
        .Emit(Emit.OpCodes.Ret)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Metodo.CreateDelegate(&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(FillObjectsDelegate(Of T)))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Shared&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; MakeFillObjectDelegate(Of T)(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; loader &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; FillObjectDelegate(Of T)
      &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; Metodo &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Emit.DynamicMethod(&lt;span style="color: #006080"&gt;""&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T), &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Type() {&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T), &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord)}, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T), &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;)

      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; Metodo.GetILGenerator()
        &lt;span style="color: #0000ff"&gt;For&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Each&lt;/span&gt; F &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BindItem &lt;span style="color: #0000ff"&gt;In&lt;/span&gt; loader.Campos
          &lt;span style="color: #0000ff"&gt;Dim&lt;/span&gt; OmitirNullos &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Emit.Label = .DefineLabel()
          &lt;span style="color: #008000"&gt;' Comprobar si el valor del campo es DbNull&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldarg_1)                    &lt;span style="color: #008000"&gt;' DataRecord&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldc_I4, F.fieldInfo.Index)  &lt;span style="color: #008000"&gt;' Indice&lt;/span&gt;
          &lt;span style="color: #008000"&gt;' Llamada a la funcion &lt;/span&gt;
          .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord).GetMethod(&lt;span style="color: #006080"&gt;"IsDBNull"&lt;/span&gt;))
          &lt;span style="color: #008000"&gt;' Saltar a la etiqueta si hay null&lt;/span&gt;
          .Emit(Emit.OpCodes.Brtrue, OmitirNullos)

          &lt;span style="color: #008000"&gt;' Recuperar el valor del campo&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldarg_0)                    &lt;span style="color: #008000"&gt;' Objeto Negocio&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldarg_1)                    &lt;span style="color: #008000"&gt;' DataRecord&lt;/span&gt;
          .Emit(Emit.OpCodes.Ldc_I4, F.fieldInfo.Index)  &lt;span style="color: #008000"&gt;' Indice&lt;/span&gt;
          .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(IDataRecord).GetMethod(&lt;span style="color: #006080"&gt;"get_Item"&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Type() {&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)}))
          &lt;span style="color: #0000ff"&gt;Select&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; &lt;span style="color: #0000ff"&gt;True&lt;/span&gt;
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(Int32))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Double&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Decimal&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Decimal&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;)
              .Emit(Emit.OpCodes.Unbox_Any, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Boolean&lt;/span&gt;))
            &lt;span style="color: #0000ff"&gt;Case&lt;/span&gt; F.fieldInfo.DbType &lt;span style="color: #0000ff"&gt;Is&lt;/span&gt; &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Date&lt;/span&gt;)
              .Emit(Emit.OpCodes.Callvirt, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;Object&lt;/span&gt;).GetMethod(&lt;span style="color: #006080"&gt;"ToString"&lt;/span&gt;, Type.EmptyTypes))
          &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Select&lt;/span&gt;

          .Emit(Emit.OpCodes.Stfld, &lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(T).GetField(&lt;span style="color: #006080"&gt;"_"&lt;/span&gt; + F.PropertyName, BindingFlags.NonPublic &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.Instance &lt;span style="color: #0000ff"&gt;Or&lt;/span&gt; BindingFlags.IgnoreCase))
          &lt;span style="color: #008000"&gt;'.Emit(Emit.OpCodes.Callvirt, GetType(T).GetProperty(F.PropertyName).GetSetMethod)&lt;/span&gt;
          .MarkLabel(OmitirNullos)

        &lt;span style="color: #0000ff"&gt;Next&lt;/span&gt;
        &lt;span style="color: #008000"&gt;' Cargar el objeto y devolverlo&lt;/span&gt;
        .Emit(Emit.OpCodes.Ldarg_0)
        .Emit(Emit.OpCodes.Ret)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; Metodo.CreateDelegate(&lt;span style="color: #0000ff"&gt;GetType&lt;/span&gt;(FillObjectDelegate(Of T)))
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Interface&lt;/span&gt; ILoader
    &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; GetObjectLoader() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader
    &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; ConnectionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate
    &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; transactionProvider() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Interface&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; ObjectLoader
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; FillObjectDelegate &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt;]
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; FillObjectsDelegate &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; [&lt;span style="color: #0000ff"&gt;Delegate&lt;/span&gt;]


    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; C &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.ConnectionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; T &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Dal.TransactionProviderDelegate = &lt;span style="color: #0000ff"&gt;Nothing&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Private&lt;/span&gt; _Items &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of BindItem)

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;()
      _Items = &lt;span style="color: #0000ff"&gt;New&lt;/span&gt; Generic.List(Of BindItem)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; Add(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; value &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BindItem)
      _Items.Add(value)
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Default&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;ReadOnly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt; Item(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; Index &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;) &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; BindItem
      &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
        &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Items(Index)
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Get&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Property&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; Campos() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Generic.List(Of BindItem)
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; _Items
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt; this() &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; ObjectLoader
      &lt;span style="color: #0000ff"&gt;Return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Function&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt; BindItem
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; PropertyName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; fieldInfo &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; DbFieldInfo
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt; &lt;span style="color: #0000ff"&gt;New&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; propertyName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fieldName &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fieldIndex &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;ByVal&lt;/span&gt; fieldDbType &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Type)
      &lt;span style="color: #0000ff"&gt;Me&lt;/span&gt;.PropertyName = propertyName
      &lt;span style="color: #0000ff"&gt;With&lt;/span&gt; fieldInfo
        .Name = fieldName
        .Index = fieldIndex
        .DbType = fieldDbType
      &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;With&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Sub&lt;/span&gt;
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Class&lt;/span&gt;

  &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Structure&lt;/span&gt; DbFieldInfo
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; Name &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;String&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; Index &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Integer&lt;/span&gt;
    &lt;span style="color: #0000ff"&gt;Public&lt;/span&gt; DbType &lt;span style="color: #0000ff"&gt;As&lt;/span&gt; Type
  &lt;span style="color: #0000ff"&gt;End&lt;/span&gt; &lt;span style="color: #0000ff"&gt;Structure&lt;/span&gt;

&lt;span style="color: #0000ff"&gt;End&lt;/span&gt; Namespace&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;font size="1"&gt;&lt;font face="Trebuchet MS"&gt;&lt;font color="#000000"&gt;&lt;font size="1"&gt;&lt;font face="Trebuchet MS"&gt;&lt;font color="#000000"&gt;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2088102121773217265-6349466489214172839?l=rcastroblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcastroblog.blogspot.com/feeds/6349466489214172839/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2088102121773217265&amp;postID=6349466489214172839&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6349466489214172839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2088102121773217265/posts/default/6349466489214172839'/><link rel='alternate' type='text/html' href='http://rcastroblog.blogspot.com/2008/12/public-delegate-sub-beginloaddelegate.html' title='Dal.Core.DataLoader.vb'/><author><name>Rafael Castro</name><uri>http://www.blogger.com/profile/12631005521267697985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
