Linq to XML: carga de archivos XML enormes (más de 1Gb)

Filed Under (.Net, LINQ, SQLServer) by admin on 10-10-2011

Tagged Under : , , ,

Estos días he estado bastante liado ya que el proceso que teníamos de carga de XML realizaba una precarga en memoria del archivo (método Load()), la solución que hay es bastante sencilla con un XMLReader, os pongo un fragmento que seguro se entiende:

 

using (XmlReader reader = XmlReader.Create(directoryTemp + fichero))
{
 reader.MoveToContent();

 int count = 0; // una variable contador XElement nombretabla = null; // un XElement auxiliar

 while (!reader.EOF)
 {
 switch (reader.NodeType)
 {
 case XmlNodeType.Element: // se puede filtrar por tipo de XmlNodeType...
 if (count == 0)
 {
 // CUALQUIER CONDICION
 count++;
 reader.Read();

 } else if (count == 1)
 {
 nombretabla = new XElement((XName)reader.Name); // esto para crear un XELEMENT con el nombre del Reader actual
 count++;
 reader.Read();
 } else
 {
 if (string.IsNullOrEmpty(nodoReg)) nodoReg = reader.Name; // condicion para omitir anidados..

 if (nodoReg == reader.Name)
 {
 count++;
 nombretabla.Add(XElement.ReadFrom(reader) as XElement);

 // INSERCION .. cada X lanzo una inserción en BD
 if (count % numInserciones == 0)
 {
 nombrecondicionado.Add(nombretabla);
 docaux.Add(nombrecondicionado);

 // VALIDACION ...
 validado = ValidarEsquema(docaux, esquema);

 if (validado)
 {
 nreg += cond.Insertar(docaux, delete);
 delete = false;

 // vacio contenidos
 nombretabla.Elements().Remove();
 nombrecondicionado.Elements().Remove();
 docaux.Elements().Remove();
 }
 else
 {
 OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error);
 EstadoCarga = 2;
 }
 }

 }

 }
 break;

 default :
 reader.Read();
 break;

 }

 }
 // INSERCION DE LOS ULTIMOS QUE NO ENTRAN EN EL ÚLTIMO WHILE
 nombrecondicionado.Add(nombretabla);
 docaux.Add(nombrecondicionado);

 // VALIDACION
 validado = ValidarEsquema(docaux, esquema);

 if (validado)
 {
 nreg += cond.Insertar(docaux, delete);

 // vacio contenidos
 nombretabla.Elements().Remove();
 nombrecondicionado.Elements().Remove();
 docaux.Elements().Remove();
 }
 else
 {
 OnReportInformation(string.Format("ERROR fichero{0} no valido.", fichero), ReportLevel.Error);
 EstadoCarga = 2;
 }

}

Problema mapeo LINQ to SQL de tipo nvarchar(1) de SQLSERVER

Filed Under (.Net, LINQ, SQLServer) by admin on 27-07-2011

Tagged Under : , , , ,

"La cadena debe contener exactamente un carácter"

Este es el mensaje que te aparece si has mapeado un nvarchar(1) y LINQ to SQL tiene que tratarlo cuando tiene el valor de string vacio es decir “”.

Si se hace sobre el DBML:

 

Botón derecho > Abrir Con > Editor XML

 

y se busca la tabla, nos damos cuenta que se esta mapeando de esta forma:

 

 

El problema reside en que al ser de 1 posición esta tratando el string de uno como si fuera tipo Char, la solución es editar a mano el DBML y ponerlo como tipo String:

 

Configurar SQLServer 2005 en TOMCAT

Filed Under (Java, SQLServer) by admin on 24-03-2011

Tagged Under :

  1. En el directorio /bin de TOMCAT debemos dejar el driver, en mi caso el sqljdbc.jar para SQLServer 2005
  2. Modificar el archivo conf/context.xml y añadir para SQLServer 2005:

<Resource name="general" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://[SERVER]:1433;databaseName=[NameBBDD];user=[user];password=[password];"
maxActive="20" maxIdle="10"
maxWait="-1"/>

* Nota: En las pruebas que hemos hecho, para el caso de SQL Server 2005, hay que crear un usuario de autenticación SQL Server y no de login de Windows (autologin con la propia sesión), ya que comprobamos que el driver rechaza las conexiones.

Los campos puestos en negrita pueden variar en función de la instalación que se realice del motor de la BBDD:

jdbc:sqlserver://(servidor):(puerto);databaseName=(BBDD);user=(usuario);password=(password);

Generar una importación de INSERTS a partir de un script SQL

Filed Under (SQLServer) by admin on 31-01-2011

Bueno muchas veces nos gustaría sacar del SQL Server un monton de INSERTS para tenerlo en un script para ejecutar cuando quieras. Os propongo una opción sencilla y adaptable:

SELECT  'INSERT INTO nombretabla(campo1,campo2)values (' + Convert(varchar, campo1) + ','
          + Convert(varchar, campo2) +  ');'
FROM tuTabla

Cambiar el tipo de dato de un campo con SQLServer

Filed Under (SQLServer) by admin on 26-11-2010

Tagged Under : , , ,

Os dejo la consulta SQL para SQL Server para cambiar el tipo de dato de un campo

ALTER TABLE tabla ALTER COLUMN campo tipodedato

Modificar longitud de un nchar en SQLSERVER

Filed Under (SQLServer) by admin on 22-10-2010

La consulta es la siguiente:

ALTER TABLE tabla
ALTER COLUMN nombrecampo nchar(5) not null

donde 5 es la nueva longitud

Caracteres extraños (cuadraditos) en nvarchar SQLServer

Filed Under (SQLServer) by admin on 06-05-2010

Tagged Under : , ,

Tenemos un campo nvarchar(1) de la base de datos que se introduce con un carácter extraño, modificamos la carga y se introducían bien pero había que cambiar las ya existentes. Para ello se pensó en muchas cosas (codificación, tamaño de la cadena, etc) dando al final con esta solución:

Problema:
cuadraditos

Solución:
UPDATE Esquema.Tabla
SET Campo = 'valorquequeremos'
WHERE ASCII(Campo) = 0

Unir el resultado de dos SQL: Operador UNION

Filed Under (SQLServer) by admin on 23-03-2010

Tagged Under : , , ,

La sintaxis es la siguiente:

[Instrucción SQL 1]
UNION
[Instrucción SQL 2]

Supongamos que tenemos las siguientes dos tablas,

Tabla Store_Information
store_name Sales Date
Los Angeles 1500 € 05-Jan-1999
San Diego 250 € 07-Jan-1999
Los Angeles 300 € 08-Jan-1999
Boston 700 € 08-Jan-1999

Tabla Internet_Sales
Date Sales
07-Jan-1999 250 €
10-Jan-1999 535 €
11-Jan-1999 320 €
12-Jan-1999 750 €

y deseamos saber de todas las fechas donde hay una operación de venta. Para hacerlo, utilizamos la siguiente instrucción SQL:

SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales

Resultado:

Date
05-Jan-1999
07-Jan-1999
08-Jan-1999
10-Jan-1999
11-Jan-1999
12-Jan-1999

Lo único que hay que tener en cuenta es que los campos que queremos unir sean del mismo tipo en ambas consultas a la vez de que tengan el mismo nombre.

SQL cambiar tabla de esquema en SQL Server 2005

Filed Under (SQLServer) by admin on 22-03-2010

ALTER SCHEMA Comisiones TRANSFER dbo.GestoresComerciales;
GO

Con esta consulta cambiamos la tabla dbo.GestoresComerciales del esquema “dbo” al esquema “Comisiones”

Más información en: http://msdn.microsoft.com/es-es/library/ms173423.aspx

“Saltarse” las Constraints en SQLServer

Filed Under (.Net, SQLServer) by admin on 01-12-2009

Tagged Under : , , ,

Las constraints de una tabla de SQL Server se pueden desactivar temporalmente con la opción NOCHECK CONSTRAINT ALL de ALTER TABLE.
El comando quedaría así:
ALTER TABLE tabla NOCHECK CONSTRAINT ALL;
Con esto se desactivan y puedes hacer la carga de datos sin que te molesten las FK

Después, para volver a activarlas sólo tienes que hacer este otro ALTER TABLE:
ALTER TABLE tabla WITH CHECK CHECK CONSTRAINT ALL;
Reactiva las constraints chequeando que los datos de las tablas las cumplan

Si quieres volver a habilitarlas sin validar los datos que hayas cargado, aunque no es muy recomendable también se puede hacer:
ALTER TABLE tabla CHECK CONSTRAINT ALL;