<?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-7991087482136142924</id><updated>2011-11-24T16:06:24.295-07:00</updated><title type='text'>Arturo Intentando Programar</title><subtitle type='html'>.. el programador nace o se hace?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://arturogranillo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7991087482136142924/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://arturogranillo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Arturo Granillo</name><uri>http://www.blogger.com/profile/04998087868469438279</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>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7991087482136142924.post-2876968362217671590</id><published>2011-11-24T16:06:00.001-07:00</published><updated>2011-11-24T16:06:24.354-07:00</updated><title type='text'>Activar AgentXP en SQL Server 2005</title><content type='html'>&lt;p&gt;sp_configure 'show advanced options', 1;&lt;br&gt;GO&lt;br&gt;RECONFIGURE;&lt;br&gt;GO&lt;br&gt;sp_configure 'Agent XPs', 1;&lt;br&gt;GO&lt;br&gt;RECONFIGURE;&lt;br&gt;GO&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7991087482136142924-2876968362217671590?l=arturogranillo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arturogranillo.blogspot.com/feeds/2876968362217671590/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://arturogranillo.blogspot.com/2011/11/activar-agentxp-en-sql-server-2005.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7991087482136142924/posts/default/2876968362217671590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7991087482136142924/posts/default/2876968362217671590'/><link rel='alternate' type='text/html' href='http://arturogranillo.blogspot.com/2011/11/activar-agentxp-en-sql-server-2005.html' title='Activar AgentXP en SQL Server 2005'/><author><name>Arturo Granillo</name><uri>http://www.blogger.com/profile/04998087868469438279</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-7991087482136142924.post-8663882514746949524</id><published>2011-09-30T11:45:00.001-06:00</published><updated>2011-09-30T12:13:35.921-06:00</updated><title type='text'>Documentación PetaPoco en Español</title><content type='html'>&lt;p&gt;&lt;a href="http://arturogranillo.blogspot.com/2011/08/documentacion-petapoco-en-espanol.html"&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="1"&gt;Nota del editor: Esta es una traducción libre no oficial de la documentación de PetaPoco, el archivo original se encuentra disponible en:&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.toptensoftware.com/petapoco/"&gt;&lt;font size="1"&gt;http://www.toptensoftware.com/petapoco/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="1"&gt;Aún se encuentra en borrador por lo que existen faltas de ortografía, sintaxis y traducción que se ajustaran conforme tenga tiempo.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;PetaPoco&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Un pequeño ORM para POCOs.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;PetaPoco es un pequeño y rápido micro-ORM de un solo archivo para. NET y Mono.&lt;/li&gt; &lt;li&gt;Como Massive es un archivo único que es fácil añadir a cualquier proyecto.&lt;/li&gt; &lt;li&gt;A diferencia Massive que funciona POCOs fuertemente tipados.&lt;/li&gt; &lt;li&gt;Al igual que Massive, soporta dynamic Expandos - leer más.&lt;/li&gt; &lt;li&gt;Al igual que ActiveRecord, soporta con una estrecha relación entre el objeto y la tabla de base de datos.&lt;/li&gt; &lt;li&gt;Al igual que SubSonic, soporta la generación de las clases POCO con plantillas T4.&lt;/li&gt; &lt;li&gt;Al igual que Dapper, es rápido, ya que utiliza la generación de método dinámico (MSIL) para asignar valores a las propiedades de las columna.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Antecedentes&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco fue originalmente inspirado en Massive de Rob Conery, pero para su uso con objetos POCO no dinámicos&lt;/p&gt; &lt;p&gt;Lo comencé por que muchos de mis proyectos que utilizan SubSonic / Linq eran lentos o se convertían en una mezcla de LINQ y codinghorror.&lt;/p&gt; &lt;p&gt;Necesitaba una capa de acceso a datos pequeña, rápida, fácil de usar y que funcionara en NET 3.5 y / o Mono 2.6 (es decir: sin soporte para dynamic expandos)&lt;/p&gt; &lt;p&gt;Massive y sus 400 líneas de código me intrigaron y me preguntaba si algo similar se podría hacer sin dynamics.&lt;/p&gt; &lt;p&gt;Así que, ¿cuál nombre? Bueno, si es Massive es masiva, se trata de "Peta" masiva (ahora tiene más de 1.500 líneas, después de todo) y ya que trabaja con "POCO"s ... "PetaPoco" parecía un nombre divertido!&lt;/p&gt; &lt;p&gt;El numero de líneas de PetaPoco ha crecido hasta más de lo que se esperaba - no es el pequeño Massive de 400 líneas.&lt;/p&gt; &lt;p&gt;Pero echa un vistazo a lo que puede hacer ... reúne una gran cantidad de fuerza para su tamaño.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Características&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Pequeño, sin dependencias ... un solo archivo de C # que se puede añadir a cualquier proyecto.&lt;/li&gt; &lt;li&gt;Funciona con POCOs estrictamente sin decorar, o POCOs con atributos.&lt;/li&gt; &lt;li&gt;Métodos auxiliares para Insert/Delete/Update/Save y IsNe.&lt;/li&gt; &lt;li&gt;Peticiones de paginado automático, obtiene el número de registros totales y buscar una página específica.&lt;/li&gt; &lt;li&gt;Soporte fácil de transacciones.&lt;/li&gt; &lt;li&gt;Soporte de remplazo de paramentos mejorado, incluyendo parámetros con nombre de las propiedades del objeto.&lt;/li&gt; &lt;li&gt;Gran rendimiento mediante la eliminación de LINQ y la asignación de propiedades rápido con la generación dinámica de métodos.&lt;/li&gt; &lt;li&gt;Incluye plantillas T4 para generar automáticamente las clases POCO.&lt;/li&gt; &lt;li&gt;El lenguaje de consulta es SQL ... sin una extraña sintaxis fluent o Linq (sí, cuestión de opinión)&lt;/li&gt; &lt;li&gt;Incluye una clase para construir SQL con baja fricción que hace que la escritura de SQL sea mucho más fácil.&lt;/li&gt; &lt;li&gt;Opciones para el registro de excepciones, la instalación de convertidores de valores y el mapeo de columnas a propiedades sin atributos.&lt;/li&gt; &lt;li&gt;Trabaja con SQL Server, SQL Server CE, MySQL, PostgreSQL y Oracle.&lt;/li&gt; &lt;li&gt;Trabaja bajo. NET 3.5 o Mono 2.6 y posteriores.&lt;/li&gt; &lt;li&gt;Soporte experimental para dynamic bajo. NET 4.0 y Mono 2.8&lt;/li&gt; &lt;li&gt;Pruebas NUnit.&lt;/li&gt; &lt;li&gt;OpenSource (licencia Apache)&lt;/li&gt; &lt;li&gt;Todo esto en unas 1.500 líneas de código&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Descarga&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco esta disponible desde:&lt;/p&gt; &lt;p&gt;NuGet - &lt;a href="http://nuget.org/List/Packages/PetaPoco"&gt;http://nuget.org/List/Packages/PetaPoco&lt;/a&gt;&lt;/p&gt; &lt;p&gt;GitHub - &lt;a href="https://github.com/toptensoftware/petapoco%20"&gt;https://github.com/toptensoftware/petapoco&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Vamos al código!&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Estos ejemplos comienzan más detallados de lo que necesitan pero se vuelven menos detallados según se introducen más funciones ... asegúrese de leer todo para tener una experiencia completa. He referenciado explícitamente el espacio de nombres PetaPoco, tal vez necesites agregar using PetaPoco.&lt;/p&gt; &lt;p&gt;Además, todos estos ejemplos han sido escritos a mano sin compilado. Es probable que existan errores. Si es así, por favor hágamelo saber.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Sin Ensamblados (dlls)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco consta de un solo archivo – PetaPoco.cs. No requiere de ninguna dependencia, solo el GAC.&lt;/p&gt; &lt;p&gt;Agrega el archivo a tu proyecto y listo...&lt;/p&gt; &lt;p&gt;Ejecutando consultas&lt;/p&gt; &lt;p&gt;Define tu clase POCO:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Representa un registro en la tabla de artículos&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public class article&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long article_id { get; set; }&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;public string title { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public DateTime date_created { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public bool draft { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public string content { get; set; }&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Después, crea un PetaPoco.Database y ejecuta la consulta&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Crea un objeto database de PetaPoco&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var db=new PetaPoco.Database("connectionStringName");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Muestra todos los articulos&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;foreach (var a in db.Query&amp;lt;article&amp;gt;("SELECT * FROM articles"))&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;Console.WriteLine("{0} - {1}", a.article_id, a.title);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Para consultar un escalar&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;long count=db.ExecuteScalar&amp;lt;long&amp;gt;("SELECT Count(*) FROM articles");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;O para obtener solo un registro&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a = db.SingleOrDefault&amp;lt;article&amp;gt;("SELECT * FROM articles WHERE article_id=@0", 123));&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Paginado&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco puede paginar automáticamente&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var result=db.Page&amp;lt;article&amp;gt;(1, 20, // &amp;lt;-- page number and items per page&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;"SELECT * FROM articles WHERE category=@0 ORDER BY date_posted DESC", "coolstuff");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Esto regresara un objeto PagedFetch&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public class Page&amp;lt;T&amp;gt; where T:new()&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long CurrentPage { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long ItemsPerPage { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long TotalPages { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long TotalItems { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public List&amp;lt;T&amp;gt; Items { get; set; }&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Internamente, Petapoco hace lo siguiente:&lt;/p&gt; &lt;p&gt;1. Sintetiza y ejecuta la consulta para obtener el numero total de registros.&lt;/p&gt; &lt;p&gt;2. Modifica la consulta original para solicitar solo el subconjunto necesario.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Query vs Fetch&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;La clase Database tiene dos métodos para recuperar registros Query vs Fetch. Son muy similares excepto por que Fecth regresa un List&amp;lt;&amp;gt; de POCOs mientras que Query itera sobre el resultado sin cargar todo el conjunto memoria.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Comandos sin-consulta&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Para ejecutar un comando sin-consulta usa el metodo Execute&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Execute("DELETE FROM articles WHERE draft&amp;lt;&amp;gt;0");&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Inserts, Updates and Deletes&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Petapoco cuenta con auxiliares para insert, update y delete.&lt;/p&gt; &lt;p&gt;Para insertar un registro, necesitas especificar la tabla y la llave primaria:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Crea un articulo&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=new article();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.title="My new article";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.content="PetaPoco was here";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.date_created=DateTime.UtcNow;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Insertamos el articulo&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Insert("articles", "article_id", a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Ahora a.article_id contendrá el id del nuevo registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Actualizar es similar&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Obtenemos un registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.SingleOrDefault&amp;lt;article&amp;gt;("SELECT * FROM articles WHERE article_id=@0", 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Realizamos los cambios&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.content="PetaPoco was here again";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Guardamos&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Update("articles", "article_id", a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;O puedes pasar un tipo anónimo para actualizar un subconjunto de campos. En este caso solo el campo titulo se actualizara&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Update("articles", "article_id", new { title="New title" }, 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Para eliminar&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;//Eliminar un articulo extrayendo la llave primaria del registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Delete("articles", "article_id", a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// O si ya se conoce la llave primaria&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Delete("articles", "article_id", null, 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Decorando los POCOs&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;En los ejemplos anteriores, debemos especificar la tabla y la llave primaria, podemos ahorrarnos esto agregando esta información al POCO:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Representa un registro en la tabla "articles"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.TableName("articles")]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.PrimaryKey("article_id")]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public class article&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long article_id { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public string title { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public DateTime date_created { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public bool draft { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public string content { get; set; }&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Ahora los inserts, updates y deletes se simplifican a esto:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Inserta un registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=new article();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.title="My new article";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.content="PetaPoco was here";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.date_created=DateTime.UtcNow;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Insert(a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// actualizando&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;a.content="Blah blah";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Update(a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// eliminando&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Delete(a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Hay otras sobrecargas para Update y Delete:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Elimina un articulo&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Delete&amp;lt;article&amp;gt;("WHERE article_id=@0", 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Update an article&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Update&amp;lt;article&amp;gt;("SET title=@0 WHERE article_id=@1", "New Title", 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Puedes indicar también que campos son ignorados&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public class article&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Ignore]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public long SomeCalculatedFieldPerhaps&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{ &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;get; set; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Si quieres ser mas explicito, en lugar de mapear todas las columnas puedes usar el atributo ExplicitColumns en la clase y Column en la propiedad para indicar que columnas deben ser mapeadas&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Representa un registro en la tabla "articles"&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.TableName("articles")]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.PrimaryKey("article_id")]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.ExplicitColumns]&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;public class article&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Column] public long article_id { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Column] public string title { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Column] public DateTime date_created { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Column] public bool draft { get; set; }&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;[PetaPoco.Column] public string content { get; set; }&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;esto funciona con partial classes. Colocas todo lo referente al mapeo de la clase en un archivo .cs y los campos calculados y otras propiedades se agregan en un archivo separado sin pensar en la capa de datos.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Plantillas T4&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Escribir todos los objetos POCO a mano es tedioso y puede generar errores.&lt;/p&gt; &lt;p&gt;PetaPoco incluye plantillas T4 que pueden codificar automáticamente clases para todas las tablas de la base de datos, actualmente soporta: SQL Server, SQL Server CE, MySQL, PostrgeSQL y Oracle.&lt;/p&gt; &lt;p&gt;Usar las plantillas es muy simple, en el proyecto se incluye la carpeta \Models\Generates&lt;/p&gt; &lt;p&gt;PetaPocPetaPoco.Core.ttinclude – incluye todas las rutinas auxiliares para leer el esquema de la base de datos&lt;/p&gt; &lt;p&gt;PetaPoco.Generator.ttinclude – la plantilla actual que define que se generado&lt;/p&gt; &lt;p&gt;Database.tt – la plantilla en si misma que contiene varias configuraciones e incluye los otros dos archivos ttincluded&lt;/p&gt; &lt;p&gt;Un archivo Database.tt tipico se ve asi:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;&amp;lt;#@ include file="PetaPoco.Core.ttinclude" #&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;&amp;lt;#&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Settings&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;ConnectionStringName = "jab";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;Namespace = ConnectionStringName;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;DatabaseName = ConnectionStringName;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;string RepoName = DatabaseName + "DB";&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;bool GenerateOperations = true;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Load tables&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var tables = LoadTables();&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;#&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;&amp;lt;#@ include file="PetaPoco.Generator.ttinclude" #&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;para usar las plantillas:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Agrega los tres archivos a tu proyecto.&lt;/li&gt; &lt;li&gt;Asegúrate de tener una connection string y un provider name configurados en el archivo app.config o web.config.&lt;/li&gt; &lt;li&gt;Cambia la propiedad ConnectionStringName en Database.tt por el nombre de tu connection string.&lt;/li&gt; &lt;li&gt;Guarda Database.tt.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Si todo sale bien Database.tt generara todos los POCOs representando las tablas en tu base de datos.&lt;/p&gt; &lt;p&gt;Para que funcione tienes que agregar también PetaPoco.cs a tu proyecto&lt;/p&gt; &lt;p&gt;La plantilla esta basada en la plantilla de Subsonic. Si estas familiarizado con su plantilla ActiveRecord veras que la plantilla de PetaPoco es muy similar.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Clausulas automáticas con Select&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Cuando usas Petapoco, la mayoría de las consultas comienzan con “SELECT * FROM tabla”. Dado que ahora podemos extraer el nombre de la tabla directo del POCO usando el atributo TableName, también podemos generar automáticamente esta parte de la consulta.&lt;/p&gt; &lt;p&gt;Si ejecutas una consulta que no comience con “SELECT”, PetaPoco lo agregara automáticamente, así que:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Obtener un registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.SingleOrDefault&amp;lt;article&amp;gt;("SELECT * FROM articles WHERE article_id=@0", 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;puede ser reducido a:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Obtener un registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.SingleOrDefault&amp;lt;article&amp;gt;("WHERE article_id=@0", 123);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco no genera un “SELECT *”, en su lugar toma los nombres de las columnas del POCO y solo consulta estas columnas.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Metodos IsNew y Save&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;A veces vas a necesitar saber si un POCO ya esta guardado en la base de datos. Desde que tenemos la llave primaria, todo lo que tenemos que hacer es verificar si la propiedad a sido asignada a algún valor diferente de el valor default.&lt;/p&gt; &lt;p&gt;Así que para verificar si un registro es nuevo:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Es un nuevo registro&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;if (db.IsNew(a))&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Si es...&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;También hay un método Save para ejecutar un Insert o Update según sea necesario&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;// Guarda un registro nuevo o existente&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;db.Save(a);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Transacciones&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;//Sección pendiente.&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;PetaPoco SQL Buildier (Constructor de Consultas SQL)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;El objetivo es hacer el formateo de las sentencias SQL mas fácil y reemplazar los parámetros apropiados para protegernos de SQL Injection.&lt;/p&gt; &lt;p&gt;No es una forma de asegurarnos que la sentencia es sintácticamente correcta.&lt;/p&gt; &lt;p&gt;Esta es la forma mas básica:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var id=123;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.Query&amp;lt;article&amp;gt;(PetaPoco.Sql.Builder&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("SELECT * FROM articles")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("WHERE article_id=@0", id)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Algo importante es que los índices de los parámetros son específicos en cada llamada a Append&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var id=123;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.Query&amp;lt;article&amp;gt;(PetaPoco.Sql.Builder&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("SELECT * FROM articles")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("WHERE article_id=@0", id)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("AND date_created&amp;lt;@0", DateTime.UtcNow)&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;También puedes construir la sentencia condicionalmente:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var id=123;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var sql=PetaPoco.Sql.Builder&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("SELECT * FROM articles")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Append("WHERE article_id=@0", id);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;if (start_date.HasValue)&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;sql.Append("AND date_created&amp;gt;=@0", start_date.Value);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;if (end_date.HasValue)&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;sql.Append("AND date_created&amp;lt;=@0", end_date.Value);&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;var a=db.Query&amp;lt;article&amp;gt;(sql)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;por que cada llamada a append usa el parámetro @0? PetaPoco construye la lista completa de argumentos y actualiza los índices de parámetros internamente por ti.&lt;/p&gt; &lt;p&gt;Puedes también nombrar los parámetros y estos buscaran la propiedad apropiada en los argumentos.&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;sql.Append("AND date_created&amp;gt;=@start AND date_created&amp;lt;=@end", &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;new &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;{ &lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;start=DateTime.UtcNow.AddDays(-2), &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;end=DateTime.UtcNow &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;);&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Con ambos, parámetros numerados o nombrados, si cualquiera de los parámetros no puede ser obtenido una excepción será lanzado.&lt;/p&gt; &lt;p&gt;Existen métodos para construir comandos SQL comunes.&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;var sql=PetaPoco.Sql.Builder()&lt;/font&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier"&gt;.Select("*")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.From("articles").Where("date_created &amp;lt; @0", DateTime.UtcNow)&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier"&gt;.OrderBy("date_created DESC");&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Rastreo de comandos SQL&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;A veces es de utilidad tener disponible las sentencia SQL que acaba de ser ejecutada. Petapoco tiene las siguientes propiedades:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;LastSQL – muy obvio.&lt;/li&gt; &lt;li&gt;LastArgs – un array de object con todos los argumentos pasados.&lt;/li&gt; &lt;li&gt;LastCommand – una string que muestra la sentencia SQL y los argumentos.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Visualizar la propiedad LastCommand en el debugger hace muy fácil saber lo que esta pasando.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;OnException Handler Routine&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;PetaPoco envuelve todas las invocaciones de comandos SQL en try / catch. Las excepciones se pasa al método virtual OnException. Por el registro de estas excepciones (o el establecimiento de un punto de interrupción en este método) puedes seguir fácilmente una cuando hay problemas con el SQL.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Es todo&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Cubrimos la mayoría de los aspectos básicos del trabajo con PetaPoco, pero para más información por favor lea estas publicaciones en el blog sobre PetaPoco.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7991087482136142924-8663882514746949524?l=arturogranillo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://arturogranillo.blogspot.com/feeds/8663882514746949524/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://arturogranillo.blogspot.com/2011/09/documentacion-petapoco-en-espanol.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7991087482136142924/posts/default/8663882514746949524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7991087482136142924/posts/default/8663882514746949524'/><link rel='alternate' type='text/html' href='http://arturogranillo.blogspot.com/2011/09/documentacion-petapoco-en-espanol.html' title='Documentación PetaPoco en Español'/><author><name>Arturo Granillo</name><uri>http://www.blogger.com/profile/04998087868469438279</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></feed>
