www.Devjoker.comhttp://www.devjoker.comWeb dedicada a la programación, las bases de datos, sistemas operativos, trucos ... Informatica profesional al alcance de todos.En castellano.SET IDENTITY_INSERT ON y LinqToSQLhttp://www.devjoker.com/contenidos/Articulos/380/SET-IDENTITY_INSERT-ON-y-LinqToSQL.aspxSET IDENTITY_INSERT ON y LinqToSQL

Recientemente he tenido que realizar un pequeño programa para migrar datos. Leia de una base de datos y grababa en otra, ambas SQL Server 2000.

Me decidí a usar VS 2008 y LinqToSQL por la rapidez en el desarrollo. No podía usar Integration Services ni DTS (o al menos no me parecio practico), ya que entre otras cosas tenia que crear y tratar documentos.

El caso es que a la hora de realizar inserciones en la tabla de destino, la clave primaria estaba definida como identity - pero necesitaba insertar los mismos valores en ambas bases de datos - y me encontraba con el siguiente error.

Explicit value must be specified for identity column in table 'DatosIdentity' when IDENTITY_INSERT is set to ON.

La solucion es sencilla, pero seguro que a mas de uno le ahorro un dolor de cabeza. Además la cosa cambia entre SQL Server 2005 y SQL 2000. Mientras que SQL Server 2005 todo funciona bien a la primera, en SQL Server 2000 se produce el error anterior.

Vamos a crear un tabla con un campo identity y un proyecto con Visual Studio 2008 en el que grabamos datos en dicha tabla.

Primero creamos la tabla sobre SQL Server 2005.

 

CREATE TABLE DatosIdentity

(

Id int IDENTITY NOT NULL,

Dato varchar(50) NULL,

Fecha datetime NULL

CONSTRAINT PK_DatosIdentity PRIMARY KEY (Id)

)

En nuestro proyecto de VS 2008 añadimos un formulario y modelo de datos de LinqToSQLClasses (ver como) conectado a SQL Server 2005.

En el formulario programos un botón de la siguiente manera:

 

using (DataClasses1DataContext ctx = new DataClasses1DataContext())

{

ctx.ExecuteCommand("SET IDENTITY_INSERT DatosIdentity ON");

DatosIdentity datos = new DatosIdentity();

datos.Id = 1;

datos.Dato = "Devjoker.com";

datos.Fecha = DateTime.Now;

ctx.DatosIdentities.InsertOnSubmit(datos);

ctx.SubmitChanges();

ctx.ExecuteCommand("SET IDENTITY_INSERT DatosIdentity OFF");

}

En SQL Server 2005 funcionara bien, pero si cambiamos la cadena de conexion y empezamos a trabajar con con SQL Server 2000 obtendremos el sguiente error:

Explicit value must be specified for identity column in table 'DatosIdentity' when IDENTITY_INSERT is set to ON.

La solucion es cambiar los decoradores de la propieda identity y cambiar el atributo IsDbGenerated=false.

 

[Column(Storage="_Id", AutoSync=AutoSync.OnInsert,
DbType=
"Int NOT NULL IDENTITY",
IsPrimaryKey=
true,
IsDbGenerated=false)]

public int Id

{

get

{

return this._Id;

}

set

{

if ((this._Id != value))

{

this.OnIdChanging(value);

this.SendPropertyChanging();

this._Id = value;

this.SendPropertyChanged("Id");

this.OnIdChanged();

}

}

}

Con esto funcionará.

El porque no lo sé, cosas que tienen las nuevas tecnologías.

Saludos, DJK

]]>
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder http://www.devjoker.com/contenidos/Articulos/378/Creando-cadenas-de-conexión-ConnectionStrings-en-net-3-5-o-visual-Studio-2008-usando-SqlConnectionStringBuilder.aspx

Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder

lo más correcto a la hora de leer una cadena de conexión a base de datos es almacenarla en un archivo .config y leerla desde allí

VB.Net: 

Dim conn As New SqlConnection()

conn.ConnectionString = My.Settings.AdventureWorksConnectionString

C#:

myConnectionString = ConfigurationManager.ConnectionStrings["AdventureWorksConnectionString"];

mySqlConnection = new SqlConnection(myConnectionString.ConnectionString);

No obstante si no queremos leerla desde el archivo .config esxiste una forma más comoda de generarla mediante la clase SqlConnectionStringBuilder

VB.net:

 

Dim conn As New SqlConnectionStringBuilder

conn.DataSource = "NombreServidor"

conn.InitialCatalog = "AdventureWorks"

conn.IntegratedSecurity = true

 

C#:

 

System.Data.SqlClient.SqlConnectionStringBuilder conn = new System.Data.SqlClient.SqlConnectionStringBuilder();

conn.DataSource = "NombreServidor";

conn.InitialCatalog = "AdventureWorks";

conn.IntegratedSecurity = true;

Espero que os resulte interesante y recordar que esta última opción no funciona con la versión 2005 sólo con 2008

]]>
Navegando ....http://www.devjoker.com/contenidos/Articulos/377/Navegando-.aspxNavegando ....

Daños colaterales del SPAM.

El orginal en http://www.tiraecol.net/modules/comic/comic.php?content_id=2&mode=flat&order=0

]]>
Migración de WSE a WCF (Web Services de 2005 a 2008)http://www.devjoker.com/contenidos/Articulos/376/Migración-de-WSE-a-WCF-(Web-Services-de-2005-a-2008).aspx

Migración de WSE a WCF (Actualizar Web Services de visual Studio 2005 a Visual Studio 2008)

Para ahorraros leer el articulo entero os adelanto:No hay asistente ni compatibilidad entre WSE y WCG

Aclarado ese punto continuamos:

En anteriores articulos hablabamos de la evolución de los Web Services hacia tecnologías más complejas y teoricamente más potentes.

Tras esperar un tiempo prudencial parece confirmado que la implementación de microsoft de Web Services (que son un estandar global) estará incluida dentro de su framework (conjunto de librerias y/o utilidades) WCF o Windows Comunication Fundation, muchos dirán que esto estaba confirmado hace tiempo pero esta actualización trae unos problemas de compatibilidad con las versiones anteriores muy significativos que finalmente no van a ser corregidos :) , la compatibilidad se debe implementar a mano, especialmente por los programadores.

Microsoft en vez de desarrollar su propia implementación para desarrollar Web Services (que son una tecnología estandard) ha decidido unificar sus librerías de programación para Web Services junto con otras tencnologías orientadas a servicios no estandard y propietarias de microsoft como .net remoting , MSMQ y DCOM.

 Esto es una ventaja para aquellos que desarrollan en profundidad aplicaciones orientadas a servicios pero una desventaja para los que sólo necesitan una parte de la funcionalidad o tenían aplicativos en versiones anteriores.

Recordar ntes del definitivo WCF salieron dos versiones previas llamadas web Service Extensions: WSE , WSE2.0 y WSE3.0 nombre clave INDIGO de las que hablamos anteriormente http://www.devjoker.com/contenidos/Articulos/207/Web-services-Extensions-3-0-de-Indigo-a-WCF.aspx

Desgraciadamente microsoft no da soporte para ninguna de estas versiones WSE en Visual Studio 2008 las alternativas son:

Seguir usando los Web Services Standard sin las nuevas mejoras

http://www.devjoker.com/contenidos/Articulos/335/C%C3%B3mo-consumir-un-Servicio-WCF-en-vez-de-un-Web-Service.aspx

O mantener las versiones anteriores a WCF en un directorio virtual independiente y dejar esa versión "congelada" o hacer las modificaciones desde Visual Studio 2005 (usar virtualización sería de ayuda en este caso), teniendo en cuenta que estos web services deberán ser consumidos también desde clientes compatibles con esa versión (preferentemente Visual Studio 2005) O bién volver a hacer el servicio de nuevo, esta vez con WCF para lo que no hay ningún tipo de asistente de migración ni ayuda si una pequeña guia de equivalencias no muy extensa para mi gusto:

http://msdn.microsoft.com/en-us/library/ms732008.aspx

Nota:si nuestro Web Service no incluia ninguna de las extensiones o mejoras a los Web Services (mejoras de seguridad, transacciones , disponibilidad, envio de binarios) no deberíamos tener problemas al migrarlo a WCF o seguir consumiendolo desde clientes externos.

Espero que este articulo os ayude a entender las migración a WCF, si quereis comentar el articulo podeis hacerlo debajo pero para preguntar usar los foros de la web.

]]>
Generar archivos PDF con C#http://www.devjoker.com/contenidos/Articulos/374/Generar-archivos-PDF-con-C.aspxGenerar archivos PDF con C#

En este articulo vamos a  ver como generar documentos PDF con C# directamente desde código. Antes de nada, dar la gracias a Raul - compañero de trabajo - por enseñarme que existia iTextSharp - la librería que vamos a utilizar para este ejemplo. 

Normalmente, cuando queremos generar un documento PDF recurrimos a una impresara virtual PDF - como explicamos en este artículo:
http://www.devjoker.com/contenidos/Articulos/311/DoPDF-Crea-archivos-PDF-facilmente.aspx,
pero en muchas ocasiones necesitamos hacerlo directamente desde código.

Ya hemos dicho que vamos a utilizar iTextSharp - una librería que proviene del mundo Java (iText), pero que ha sido portada a C# y que podemos descargar desde el siguiente enlace:
http://sourceforge.net/projects/itextsharp/

En este ejemplo hemos utilizado C# 3.0 ( Visual Studio 2008 ) - es decir .Net Framework 3.5 - , pero la librería funciona correctamente con cualquier versión de .Net, incluido el Framework 1.0.

Vamos a obviar temas de permisos de escritura en los directorios y esas cosas, asuminos que tenemos los permisos necesarios para escribir en disco y esas cosas (aunque como veremos más adelante también podríamos usar un MemoryStream).

Mi primer documento PDF.

Lo primero que tenemos que hacer es decargar la librería desde el enlace que hemos indicado y añadir la referencia a nuestro proyecto: itextsharp.dll.

En mi caso he creado un proyecto de tipo Windows Forms, y he diseñado un formulario con un único botón que servira para crear el documento pdf.

Tenemos que incluir las siguientes directivas using a nuestro formulario:

 

using iTextSharp.text;

using iTextSharp.text.pdf;

using System.IO;

Crear documentos PDF es realmente simple, vemos como y lo explicamos un poco más adelante.

 

private void button1_Click(object sender, EventArgs e)

{

Document document = new Document();

PdfWriter.GetInstance(document,

new FileStream("devjoker.pdf",

FileMode.OpenOrCreate));

document.Open();

document.Add(new Paragraph("Este es mi primer PDF al vuelo"));

document.Close();

}

Con esto ya tenemos nuestro primer PSF. Vamos a ver que hemos hecho ...

  • Creamos un objeto de tipo Document. Es nuestro PDF.
  • Invocamos al método estatico GetInstance de la clase PdfWriter - como argumentos recibe el documento que acabamos de crear y un Stream. En este caso utilizamos un FileStream pero podríamos haber usado cualquier Stream que admita escritura como por ejemplo MemoryStream. 
  • Abrimos el documento con el método Open.
  • Le añadimos un parrafo con Add. Debemos darnos cuenta que el método Add recibe como parametro una interface -IElement. Esto nos va a simplificar enormemente el trabajo.
  • Cerramos el documento con Close.

¡Que dificil! Con esto ya tenemos creado el archivo en la ruta indicada al FileStream (en mi caso la misma ruta que el ejecutable).

La librería es bastante amplia y permite controlar casi todo. Por ejemplo, para modificar la fuente y el tamaño del parrafo solo tendremos que utilizar el siguiente código:

 

Chunk chunk = new Chunk("Texto subrayado",

FontFactory.GetFont("ARIAL",

12,

iTextSharp.text.Font.UNDERLINE ));

 

document.Add(new Paragraph(chunk ));

Como hemos comentado antes, el método Add recibe como parámetro una interface - IElement . Todos los objetos que podemos añadir al documento implementan esta interface por lo que la manera de añadir elementos al documento es siempre la misma. Por ejemplo, insertar una imagen en el documento es igual de simple que un parrafo, solo cambiamos el objeto Paragraph pòr un objeto Image (no confundir con System.Drawing.Image!):

 

iTextSharp.text.Image jpg =

iTextSharp.text.Image.GetInstance(@"C:\...\ghostsandgoblins.jpg");

jpg.Alignment = iTextSharp.text.Image.MIDDLE_ALIGN;

document.Add(jpg);

Solo hemos visto una mínima para de la funcionalidad que ofrece la librería, pero espero que sea suficiente como para que os pique la curiosidad. Podemos encontrar un completo tutorial de como usar la librería en esta dirección:http://itextsharp.sourceforge.net/tutorial/index.html

Saludos, DJK

]]>
Reemplazar __doPostBackhttp://www.devjoker.com/contenidos/Articulos/373/Reemplazar-__doPostBack.aspxReemplazar __doPostBack

En ocasiones, cuando escribimos nuestras aplicaciones ASP.Net necesitamos realizar acciones antes de que se invoque el PostBack - por ejemplo, deshabilitar los botones del WebForm.

Navegando por ahí - no puedo citar la fuente porque no la recuerdo - encontre este truco que reemplaza a la funcion __doPostBack de ASP.Net, permitiendonos modificar el comportamiento y añadir nueva funcionalidad.

El código de la función es el siguiente:

 <script language="javascript" type="text/javascript">
 // Almacenamos una referencia a la funcion __doPostBack original.
 var __oldDoPostBack = __doPostBack;
 // Reemplazamos la funcion __doPostBack con otra de la misma firma.
 // Cuando ASP.NET llame a __doPostBack en realidad llamara a la nueva
// función.
 __doPostBack = FormSubmitEvent;
 function FormSubmitEvent (eventTarget, eventArgument)
 {
  disableButtons(); 
  return __oldDoPostBack (eventTarget, eventArgument);
 }
</script>

, donde disableButtons es una función que deshabilita los botones.

Recordar que este código solo se ejecutará cuando el Postback sea provocado por un control de servidor. Si queremos controlar los envios producidos por botones de tipo submit debemos suscribirnos al evento OnSubmit del formulario html.

Nota: El evento OnSubmit solo se dispara con un botón de tipo submit, y no con a través de JavaScript con una invocación al método submit del formulario.

Saludos, DJK.

]]>
Escritorios cubicos.http://www.devjoker.com/contenidos/Articulos/372/Escritorios-cubicos.aspxEscritorios cubicos.

El tema de los escritorios multiples y cubicos con impresionantes efectos 3D ya lo hemos tratado alguna que otra vez en Devjoker.

http://www.devjoker.com/contenidos/Articulos/256/Escritorios-cúbicos-en-Windows-XP.aspx

http://www.devjoker.com/contenidos/Articulos/253/Multiples-escritorios-en-Windows-XP.aspx

Seguro que si conoceis a algún fanatico de Linux, os habrá hablado maravillas de XGLCompiz y Beryl, y la verdad es que razón no le faltará. Y si vuestro amigo utliza un Mac ...

Lo que a lo mejor no sabeis es que podemos obtener los mismos resultados sobre nuestros equipos Windows XP y Vista.

Unos videos para que sepamos de que estamos hablando:

Compiz Fusion on openSUSE

UBUNTU XGL and Beryl

Windows XP con YodM 3D

Windows Vista Cube desktop

Widnow XP Shock 4Way 3D

Windows Vista Object Dock

 

Muchos de estos programas son de pago en su versión Windows, aunque casi todos disponen de una versión gratuita para descargar.

http://www.cubedesktop.com/

http://www.stardock.com/products/objectdock/

En conclusión, si queremos impresionantes efectos 3d y "chominadas" varias en nuestros equipos, no es necesario que gastemos un dineral en un mac o aprendamos a recompilar el nucleo de Linux, también nos vale nuestro Windows.

Y por favor, que nadie interprete este articulo como un ataque a nadie, simplemente mostramos como conseguir ciertas cosas "chulas" que hacen los Linux y Mac en nuestros PC´s con Windows.

Saludos, DJK

]]>
Manual de minicom de Linux con fotoshttp://www.devjoker.com/contenidos/Articulos/370/Manual-de-minicom-de-Linux-con-fotos.aspxManual de minicom de Linux con fotos

Tutorial básico del minicom para openSUSE 11.x

Este pequeño tutorial se basa en cómo configurar un equivalente al Hyper Terminal de Windows llamado Minicom desde el Sistema Operativo Linux openSUSE 11.x para aquellas personas que también puedan controlar el puerto serie RS232 (DB9) con un microcontrolador PIC, router o otra aplicación.


[Ampliar Imagen]

Minicom es el equivalente al Hyper Terminal de Windows. En este caso utilizaremos el Minicom v2.3 de openSUSE 11.0 mientras usamos el KDE 3.5.9. Los puertos series en Linux son /dev/ttyS0 para el puerto serie 1 (COM 1), /dev/ttyS1 para el COM 2, etc.

Si no lo tenemos instalado, pulsa el botón de inicio como muestra la imagen de la derecha. Busca instalar SoftWare y has clic con el ratón.

Instalar Minicom

Te pedirá una contraseña de superusuario, se abrirá el YaST2 e introducimos la palabra minicom y hacemos clic en Buscar hasta que aparezca en el paquete minicom, claro que tendrás que tener el disco en la unidad lectora.


[Ampliar Imagen]


[Ampliar Imagen]

Hacemos clic en el paquete minicom para verificar con una V verde de que lo hemos seleccionado y a punto de instalar. Al final pulsa Aceptar.

Configurar Minicom

Una vez abrimos el Terminal o línea de comandos del Linux, introducimos en modo root o superusuario este comando:

minicom -s


[Ampliar Imagen]

En esta ventana del Terminal, vamos a configurar el puerto serie COM1 llamado ttyS0 para Linux.

Seleccionamos “Serial port setup” y pulsamos enter.


[Ampliar Imagen]

Aquí es donde hay que seleccionar el puerto que vamos a usar.

Pulsa la “A” y escribes arriba /dev/ttyS0, luego enter y luego la letra “E”.


[Ampliar Imagen]

Si has pulsado la “E”, aparecerá él menú “comm parameters”. Ya que lo uso para controlar un PIC 16F84A he usado la configuración:

  • “Speed” C: 9600
  • “Parity” None
  • “Data” V: 8
  • “StopBits” X: 2

Pulsa enter al acabar.


[Ampliar Imagen]

Si deseas guardar los datos algo muy recomendable, selecciona “Save setap as dfl”. Cuando ya hayas guardado la configuración, pulsa “Exit” para salir y reiniciar.


[Ampliar Imagen]

Pulsamos "Exit" para empezar.


[Ampliar Imagen]

Si todo ha ido bien, aparecerá la ventana de bienvenida y listo para usar.


[Ampliar Imagen]

Funcionando con Minicom


[Ampliar Imagen]

Si deseas salir del Minicom, como bien dice al principio de la bienvenida, pulsa “Control +A” que aparecerá una barra roja inferior mostrando información y algunos datos.


[Ampliar Imagen]

Ahora pulsa la “Z” y aparece la ventana “Minicom Command Summary”. Para salir sin reset pulsa la “Q” que es la opción “Quit with no reset”, luego pulsa enter.


[Ampliar Imagen]

En la ventana “Leave without reset?” ya podrás pulsar “Yes” para salir en definitiva


[Ampliar Imagen]

Un ejemplo: Controlando un microcontrolador PIC 16F84A mediante el puerto serie ttyS0 o COM1 con el Minicom de openSUSE 11.0. Controlo dos led, un motor, un altavoz interior del PC y botón de parada del sistema.

 

[Ampliar Imagen]


[Ampliar Imagen]


[Ampliar Imagen]


[Ampliar Imagen]


[Ampliar Imagen]

 

]]>
¿El fin de los servidores de 32Bits?http://www.devjoker.com/contenidos/Articulos/369/El-fin-de-los-servidores-de-32Bits.aspx¿El fin de los servidores de 32Bits?

Uno de los rumores que lleva tiempo sonando y que a pesar de la crisis internacional no parece apagarse es  el de que microsoft abandonará los servidores de 32 bits sacando nuevas versiones sólo de 64 bits de algunos de sus servidores más populares como Exchange o Sharepoint.

Aunque esto no afectará a los equipos de escritorio (sólo a los servidores) la decisión es tremendamente arriesgada.

¿La llevarán a cabo definitivamente para la próxima versión?


[Ampliar Imagen]
 

Las mejoras son evidentes:Aumento del rendimiento y del prestigio de microsoft

Las desventajas: la falta de integración de esos servidores con software no 64bits , los costes y la negativa de algunos empresarios a asumir ese gasto Así mismo cuando los videojuegos para PC empezaron a exigir actualizar el hardware para poder jugar los usuarios simplemente abandonaron los juegos para PC para pasarse a las consolas más seguras y estables.

¿Serán los servidores de 64 el espaldarazo para que la gente migre a Linux o como sin duda espera microsoft el espaldarazo para que la gente migre de IBM a Microsoft?

Yo apuesto por lo primero, pero el tiempo lo dirá.

 

]]>
SQL Server 2008http://www.devjoker.com/contenidos/Articulos/366/SQL-Server-2008.aspxSQL Server 2008

image

EL pasado dia 06/08/2008 fue liberado SQL Server 2008, para todos los que tienen una subscripción MSDN o TechNet Si ese es tu caso ya puedes descargarlo.

Casi de inmediato, Microsoft publico el SP1 de Visual Studio 2008 para (entr otras cosas) dar soporte a todas las nuevas funcionalidades de SQL Server 2008

A continuación está interesante lista de enlaces:

Enlace original: http://blogs.msdn.com/mvplead/archive/2008/08/06/sql-server-2008.aspx

 

Y no menos interesantes son estos enlaces sobre las mejoras que incorpora SQL Server 2008 para desarrolladores publicadas en blog del CINN.

Saludos.

 

 

]]>