none
Crear XML RRS feed

  • Pregunta

  • Hola 

    Una consulta usando OPEN XML se puede crear un archivo XML esto si se que se puede hacer, pero cuando SQL SERVER lo crea se puede guardar ese archivo en una ruta del servidor en una carpeta?

    NOTA : Estoy usando SQL SERVER 2000


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    lunes, 22 de abril de 2013 11:06

Respuestas

  • Espero este enlace te sirva

    http://www.c-sharpcorner.com/UploadFile/pk_khuman/ManagedTrigersUsingCSharp02202007230729PM/ManagedTrigersUsingCSharp.aspx


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 5:58
  • El proceso es un poco más complejo de lo que parece.

    1º Creas un proyecto CLR Database Project

    2 º Una vez configurada la cadena de conexión añades un trigger:

    3º Escribes el código. Este es un ejemplo de trigger para la tabla Products de la base de datos Nothwind. Que genera el fichero XML:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;
    using System.Xml;
    using System.IO;
    using System.Threading;
    
    
    public partial class Triggers
    {
    
    	public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments";
    	
    	[SqlTrigger (
    		Name="UpdateProductsTrigger", 
    		Target="dbo.Products", Event="FOR INSERT, UPDATE, DELETE")]
    	public static void UpdateProductsTrigger()
    	{
    		var xDoc = new XmlDocument();
    		using (var cn = new SqlConnection("context connection=true"))
    		using (var cmd = new SqlCommand("SELECT * FROM dbo.Products FOR XML PATH('Product'),ROOT('Products')", cn))
    		{
    			cn.Open();
    			using (var reader = cmd.ExecuteXmlReader())
    			{
    				xDoc.Load(reader);
    			}
    		}
    
    		var tmpFilePath = Path.Combine(XmlDocumentsFolderPath, Guid.NewGuid().ToString("N") + ".tmp");
    		using (var fs = new FileStream(tmpFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
    		{
    			xDoc.Save(fs);
    		}
    		var targetFilePath = Path.Combine(XmlDocumentsFolderPath, "Products.xml");
    		int remainingRetries = 8;
    		while (true)
    		{
    			try
    			{
    				if (File.Exists(targetFilePath))
    				{
    					File.Replace(tmpFilePath, targetFilePath, null);
    				}
    				else
    				{
    					File.Move(tmpFilePath, targetFilePath);
    				}
    				return;
    			}
    			catch
    			{
    				if (--remainingRetries <= 0)
    				{
    					File.Delete(tmpFilePath);
    					throw;
    				}
    				//Thread.Sleep(10);
    			}
    		}
    	}
    }

    Observa que el código tiene reintentos para sustituir el archivo ya que es posible que esté abierto y falle la sustitución.

    4º Configura el proyecto para "External Access" ya que el trigger tiene que escribir en un fichero.

    5º Configura la base de datos para permitir ensamblado con permiso de external access:

    ALTER DATABASE Northwind SET TRUSTWORTHY ON
    EXEC sp_changedbowner 'sa'


    6º Despliega el proyecto:

    7º Lo pruebas:

    UPDATE dbo.Products
    SET UnitsInStock = 40
    WHERE ProductID = 1

    8º Compruebas que se ha generado el fichero:

    <Products>
      <Product>
        <ProductID>1</ProductID>
        <ProductName>Chai2</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>1</CategoryID>
        <QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
        <UnitPrice>18.0000</UnitPrice>
        <UnitsInStock>40</UnitsInStock>
        <UnitsOnOrder>0</UnitsOnOrder>
        <ReorderLevel>10</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>702.0000</Total>
      </Product>
      <Product>
        <ProductID>2</ProductID>
        <ProductName>Chang</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>1</CategoryID>
        <QuantityPerUnit>24 - 12 oz bottles</QuantityPerUnit>
        <UnitPrice>19.0000</UnitPrice>
        <UnitsInStock>17</UnitsInStock>
        <UnitsOnOrder>40</UnitsOnOrder>
        <ReorderLevel>25</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>323.0000</Total>
      </Product>
      <Product>
        <ProductID>3</ProductID>
        <ProductName>Aniseed Syrup</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>2</CategoryID>
        <QuantityPerUnit>12 - 550 ml bottles</QuantityPerUnit>
        <UnitPrice>12.0000</UnitPrice>
        <UnitsInStock>13</UnitsInStock>
        <UnitsOnOrder>70</UnitsOnOrder>
        <ReorderLevel>25</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>156.0000</Total>
      </Product>
    </Products>


    • Propuesto como respuesta Sergio Parra martes, 23 de abril de 2013 12:08
    • Editado Jesús López miércoles, 24 de abril de 2013 5:10
    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 12:04
  • SQL clr c#


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 17:50
  • El EndExecuteXmlReader es para Finaliza la ejecución asincrónica de una instrucción de Transact-SQL y devuelve los datos solicitados como XML. Tu no has hecho llamada asíncrona,modifica ese método por ExecuteXmlReader

    Ahora si que voy a dormir


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Propuesto como respuesta Sergio Parra martes, 23 de abril de 2013 23:47
    • Votado como útil Sergio Parra martes, 23 de abril de 2013 23:47
    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    martes, 23 de abril de 2013 23:46
  • Ejecuta primero las pruebas desde el SQL Server Management Studio, no desde la aplicación, ejecuta un UPDATE sobre una de las tablas base, comprueba que no hay errores y que el el fichero se genera correctamente.

    ¿Cual es la cuenta con la que se ejecuta el servicio de SQL Server? Míralo en el "SQL Server Configuration Manager"

    Es importante, esa cuenta tiene que tener permisos NTFS sobre la carpeta de los archivos XML.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    miércoles, 24 de abril de 2013 5:29
  • Es necesario que configures la conexión si no no podrás desplegar

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:42
    martes, 23 de abril de 2013 18:08
  • No puedes tener instalados dos versiones de SQL (ni dos veces de la misma verisón) en la misma máquina con el mismo nombre de instancia. Eso es imposible.

    Debes de tener más de un nombre de instancia. ¿Cuales son?. Mira a ver en "SQL Server Configuration Manager" y los servicios de Windows.

    Y nos cuentas.

    ¿Qué experiencia tienes con SQL Server?

    Me da la impresión que lo acabas de conocer.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:42
    martes, 23 de abril de 2013 20:09
  • El trigger sobre la vista no se va a ejecutar si no ejecutas un INSERT, UPDATE o DELETE sobre la vista. ¿Por qué haces un trigger sobre la vista? ¿Es que la aplicación nunca va a modificar directamente las tablas base?. Lo que tendrías que hacer es crear un trigger para cada una de las tablas base de la vista.

    Desde Visual Basic 6.0 usando ADO clásico puedes obtener un recordset actualizable de una vista, pero cuando actualizas los campos del recordset y llamas al método Recordset.Update, por detrás ADO está actualizando directamente una de las tablas base de la vista.

    En vez de un trigger CLR haz un procedimiento almacenado CLR. Luego crea un trigger T-SQL para cada una de las tablas de la vista que llame al procedimiento almacenado CLR.

    La ruta \\SQLD\XmlDocuments es una ruta de red. Se supone que hay una máquina en la red (en mi red) que se llama SQLD y que tiene una carpeta compartida que se llama XmlDocuments. La carpeta donde vayas a poner los archivos xml debe estar accesible y tener sentido desde el servidor de base de datos.

    La cuenta de servicio con la que se ejecuta SQL Server debe tener permisos NTFS sobre esa carpeta.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    miércoles, 24 de abril de 2013 5:24

Todas las respuestas

  • Por qué no pruebas a usar FOR XML para generar la consulta y lo usas junto con el comando BCP??

    bcp "SELECT FirstName, LastName FROM AdventureWorks2012.Person.Person ORDER BY LastName, Firstname" queryout Contacts.txt -c -T --> esto exporta los resultados de un aconsulta a un fichero del servidor

    bcp Utility


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos



    lunes, 22 de abril de 2013 11:32
  • Lo que quiero hacer es por  ejemplo tengo una tabla Lineas con esta estructura

    Si se modifico esta tabla ya sea (INSERT, UPDATE, DELETE) me genere un archivo XML pero que este archivo se guarde en una ruta especifica, me refiero en el SO Server 2003 donde se encuentra instalada la DB, en una ruta D:Temp

    Lo que me gustaría hacer es cada que haya estos cambios crear un trigger en sus 3 eventos (DML) y me genere los xml usando OPEN XML

     

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    lunes, 22 de abril de 2013 11:37
  • Al ejecutar esta consulta me da error

    DECLARE @xml_text VARCHAR(4000), @i INT
    SELECT * FROM ==> No se encuentra la instrucción preparada con el controlador 0.
    	OPENXML(@i, '/root/authors')
    	   WITH (
    	     au_id VARCHAR(11),
    	     au_lname VARCHAR(20),
    	     au_fname VARCHAR(30),
    	     phone VARCHAR(12),
    	     address VARCHAR(50),
    	     city VARCHAR(20),
    	     state CHAR(2),
    	     cip CHAR(5),
    	     contract BIT)


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 22 de abril de 2013 12:06
  • Sergio me da error en esta parte la consulta que me recomiendas

    bcp SELECT au_id, au_lname, au_fname FROM authors ORDER BY au_lname,au_fname queryout Contacts.txt -c -T

    Línea 1: sintaxis incorrecta cerca de 'queryout'.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 22 de abril de 2013 12:11
  • Pon la consulta entre " "

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 22 de abril de 2013 12:32
  • SELECT * FROM authors FOR XML AUTO, TYPE 
    Te devuelve la consulta en formato XML

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    lunes, 22 de abril de 2013 12:44
  • O sea para exportar el fichero Authors harías
    bcp "SELECT au_id, au_lname, au_fname FROM authors ORDER BY au_lname,au_fname FOR XML AUTO, TYPE" queryout "C:\Authors.xml" -c -T


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos



    lunes, 22 de abril de 2013 12:47
  • Hola Pedro, te sirvió mi ayuda? Tienes mas dudas?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    lunes, 22 de abril de 2013 16:26
  • Hola Sergio lo voy a probar recién

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 22 de abril de 2013 20:44
  • Hola Sergio

    Esto es lo que quiero hacer http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/d1404fd7-dd85-4180-8a30-68637bebcbb0

    ya migre la db a SQL SERVER 2005

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/20803a3a-4f8d-4f95-9d25-e286fde58753/

    Si me puedes ayudar con Leandro para elegir la mejor opción ya que voy a migrar una aplicación que esta en vb6.0 a C# y quiero mejorarlo y usar tecnologia la verción de VS que uso es 2010 y la db ya la migre a SQL SERVER 2005


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 1:13
  • Sergio 

    La consulta que me recomiendas SELECT * FROM authors FOR XML AUTO, TYPE me da error

    Línea 1: sintaxis incorrecta cerca de 'TYPE'.

    y esta consulta también me da error 

    bcp "SELECT au_id, au_lname, au_fname FROM authors ORDER BY au_lname,au_fname FOR XML AUTO, TYPE" queryout "C:\Authors.xml" -c -T

     Línea 1: sintaxis incorrecta cerca de 'queryout'.

    Pero mejor lo dejamos allí ya que migre a SQL 2005


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 1:29
  • Buenos días Pedro, me parece muy buena idea el haber migrado a 2005. Si quieres busca algún ejemplo de For Xml para 2005 y comentamos.

    Saludos


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 5:16
  • Hola Sergio lo que quiero es usar la capacidad que tiene sql server para usar codigo .net y con esto crear un trigger

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 5:25
  • Espero este enlace te sirva

    http://www.c-sharpcorner.com/UploadFile/pk_khuman/ManagedTrigersUsingCSharp02202007230729PM/ManagedTrigersUsingCSharp.aspx


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 5:58
  • Hola Sergio buenos días, buen articulo gracias lo pondré en práctica pero como hago para que el trigger me fucione en los 3 eventos INSERT, DELETE, UPDATE y ademas me genere los xml en una carpeta compartida en el  servidor server 2003 donde se encuentra alojada la db

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 10:52
  • using System.Data.SqlClient;
    using System.Text.RegularExpressions;
    using Microsoft.SqlServer.Server;
    
    public partial class Triggers
    {
        [SqlTrigger(Name="UserNameAudit", Target="Users", Event="FOR INSERT")]
        public static void UserNameAudit()
        {
            SqlTriggerContext triggContext = SqlContext.TriggerContext;
            SqlParameter userName = new SqlParameter("@username", System.Data.SqlDbType.NVarChar);
    
            if (triggContext.TriggerAction == TriggerAction.Insert)
            {
                using (SqlConnection conn = new SqlConnection("context connection=true"))
                {
                    conn.Open();
                    SqlCommand sqlComm = new SqlCommand();
                    SqlPipe sqlP = SqlContext.Pipe;
    
                    sqlComm.Connection = conn;
                    sqlComm.CommandText = "SELECT UserName from INSERTED";
    
                    userName.Value = sqlComm.ExecuteScalar().ToString();
    
                    if (IsEMailAddress(userName.ToString()))
                    {
                        sqlComm.CommandText = "INSERT UsersAudit(UserName) VALUES(userName)";
                        sqlP.Send(sqlComm.CommandText);
                        sqlP.ExecuteAndSend(sqlComm);
                    }
                }
            }
        }
    
    
        public static bool IsEMailAddress(string s)
        {
            return Regex.IsMatch(s, "^([\\w-]+\\.)*?[\\w-]+@[\\w-]+\\.([\\w-]+\\.)*?[\\w]+$");
        }
    }
    si ves la "decoración" del metodoe puedes indicar el evento

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    martes, 23 de abril de 2013 11:39
  • http://msdn.microsoft.com/en-us/library/938d9dz2(v=vs.100).aspx

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 11:41
  • Por ejemplo en este trigger lo hice en sus 3 eventos

    CREATE TRIGGER DBO.VerificarLineas 
       ON  dbo.Lineas
       AFTER INSERT,DELETE,UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
          INSERT INTO HistoricoLineas(fechaModificacion, usuarioSistema, estacionUsuario)
    						VALUES(GETDATE(), SYSTEM_USER, HOST_NAME())
    						
    	 
    
    END

    Puedo hacer esto

       [SqlTrigger(Name="UserNameAudit", Target="Users", Event="FOR INSERT, DELETE,UPDATE")]

    O estoy equivocado?


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 11:47
  • El proceso es un poco más complejo de lo que parece.

    1º Creas un proyecto CLR Database Project

    2 º Una vez configurada la cadena de conexión añades un trigger:

    3º Escribes el código. Este es un ejemplo de trigger para la tabla Products de la base de datos Nothwind. Que genera el fichero XML:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;
    using System.Xml;
    using System.IO;
    using System.Threading;
    
    
    public partial class Triggers
    {
    
    	public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments";
    	
    	[SqlTrigger (
    		Name="UpdateProductsTrigger", 
    		Target="dbo.Products", Event="FOR INSERT, UPDATE, DELETE")]
    	public static void UpdateProductsTrigger()
    	{
    		var xDoc = new XmlDocument();
    		using (var cn = new SqlConnection("context connection=true"))
    		using (var cmd = new SqlCommand("SELECT * FROM dbo.Products FOR XML PATH('Product'),ROOT('Products')", cn))
    		{
    			cn.Open();
    			using (var reader = cmd.ExecuteXmlReader())
    			{
    				xDoc.Load(reader);
    			}
    		}
    
    		var tmpFilePath = Path.Combine(XmlDocumentsFolderPath, Guid.NewGuid().ToString("N") + ".tmp");
    		using (var fs = new FileStream(tmpFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
    		{
    			xDoc.Save(fs);
    		}
    		var targetFilePath = Path.Combine(XmlDocumentsFolderPath, "Products.xml");
    		int remainingRetries = 8;
    		while (true)
    		{
    			try
    			{
    				if (File.Exists(targetFilePath))
    				{
    					File.Replace(tmpFilePath, targetFilePath, null);
    				}
    				else
    				{
    					File.Move(tmpFilePath, targetFilePath);
    				}
    				return;
    			}
    			catch
    			{
    				if (--remainingRetries <= 0)
    				{
    					File.Delete(tmpFilePath);
    					throw;
    				}
    				//Thread.Sleep(10);
    			}
    		}
    	}
    }

    Observa que el código tiene reintentos para sustituir el archivo ya que es posible que esté abierto y falle la sustitución.

    4º Configura el proyecto para "External Access" ya que el trigger tiene que escribir en un fichero.

    5º Configura la base de datos para permitir ensamblado con permiso de external access:

    ALTER DATABASE Northwind SET TRUSTWORTHY ON
    EXEC sp_changedbowner 'sa'


    6º Despliega el proyecto:

    7º Lo pruebas:

    UPDATE dbo.Products
    SET UnitsInStock = 40
    WHERE ProductID = 1

    8º Compruebas que se ha generado el fichero:

    <Products>
      <Product>
        <ProductID>1</ProductID>
        <ProductName>Chai2</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>1</CategoryID>
        <QuantityPerUnit>10 boxes x 20 bags</QuantityPerUnit>
        <UnitPrice>18.0000</UnitPrice>
        <UnitsInStock>40</UnitsInStock>
        <UnitsOnOrder>0</UnitsOnOrder>
        <ReorderLevel>10</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>702.0000</Total>
      </Product>
      <Product>
        <ProductID>2</ProductID>
        <ProductName>Chang</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>1</CategoryID>
        <QuantityPerUnit>24 - 12 oz bottles</QuantityPerUnit>
        <UnitPrice>19.0000</UnitPrice>
        <UnitsInStock>17</UnitsInStock>
        <UnitsOnOrder>40</UnitsOnOrder>
        <ReorderLevel>25</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>323.0000</Total>
      </Product>
      <Product>
        <ProductID>3</ProductID>
        <ProductName>Aniseed Syrup</ProductName>
        <SupplierID>1</SupplierID>
        <CategoryID>2</CategoryID>
        <QuantityPerUnit>12 - 550 ml bottles</QuantityPerUnit>
        <UnitPrice>12.0000</UnitPrice>
        <UnitsInStock>13</UnitsInStock>
        <UnitsOnOrder>70</UnitsOnOrder>
        <ReorderLevel>25</ReorderLevel>
        <Discontinued>0</Discontinued>
        <Total>156.0000</Total>
      </Product>
    </Products>


    • Propuesto como respuesta Sergio Parra martes, 23 de abril de 2013 12:08
    • Editado Jesús López miércoles, 24 de abril de 2013 5:10
    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 12:04
  • Totalmente de acuerdo...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 12:08
  • Lo pondré en práctica y les comento, gracias por el apoyo a ambos

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 13:02
  • Hola mi proyecto es en 3 capas clásico en que capa lo coloco el nuevo proyecto sqlserver 

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 17:13
  • Cual de los 2 proyectos de sql server 2005 elijo


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 17:29
  • SQL clr c#


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:41
    martes, 23 de abril de 2013 17:50
  • Ok, cuando agrego el proyecto me sale una recomendación que use framework 3.5 para SQL SERVER 2005 pq estoy trabajando con VS 2010 y por defecto viene el framework 4.0, me toca cambiarlo entonces confirmen.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 17:53
  • .net fx 2
    martes, 23 de abril de 2013 17:57
  • Selecciona la 3.5 por favor

    te dejo este enlace de msdn http://msdn.microsoft.com/en-us/library/938d9dz2(v=vs.90).aspx


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos


    martes, 23 de abril de 2013 17:58
  • Creo que no es necesario seleccionar la DB, pq cuando la selecciono me dice que no existe la db 

    Lo que hice fue instalar SQL SERVER 2005 DEVELOPER EDITION y saque un backup de la db que esta en SQL SERVER 2000 y la restaure en el SQL 2005


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 18:01
  • Has puesto bien el nombre del servidor?? Puedes verlo?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 18:03
  • Este es el error que me sale


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 18:04
  • No. Sql 2005 no tiene por qué tener intalado .net 3.5. Pero si .net 2.0. es mejor.CConfigura el proyecto para .net 2.0. no necesitas mas

    martes, 23 de abril de 2013 18:06
  • En DESARROLLO-PC que versión tienes instalada? A ver si la 2005 tiene otro nombre

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 18:07
  • Es necesario que configures la conexión si no no podrás desplegar

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:42
    martes, 23 de abril de 2013 18:08
  • Hay un pequeño problema en mi pc tengo instalado las dos verciones de SQL 2000 Y 2005 ambas se llaman DESARROLLO-PC desisntalo el SQL 2000???

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 19:48
  • Si claro, te da conflictos

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 19:50
  • No puedes tener instalados dos versiones de SQL (ni dos veces de la misma verisón) en la misma máquina con el mismo nombre de instancia. Eso es imposible.

    Debes de tener más de un nombre de instancia. ¿Cuales son?. Mira a ver en "SQL Server Configuration Manager" y los servicios de Windows.

    Y nos cuentas.

    ¿Qué experiencia tienes con SQL Server?

    Me da la impresión que lo acabas de conocer.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:42
    martes, 23 de abril de 2013 20:09
  • Al final del todo. Sólo estás intentando crear unos archivos XML que contienen los datos de unas tablas "pequeñas", (seguro que no tienen más de unos cientos de filas) con el fin de no tener que consultar las tablas y así aumentar el rendimiento de la aplicación. Pero el aumento de rendimiento global de la aplicación que se consigue con esto es tan insignificante que no merece la pena. Sobre todo cuando seguro que hay en la aplicación un número considerable de consultas que con ejecutarse una única vez dejan en pañales toda esa optimización tipo "caché" que tanto esfuerzo estás poniendo y que tan poco valor aporta. Y que no tienes el concocimiento necesario ni siquiera para empezar, a pesar de toda la ayuda que con la mejor intención te estamos proporcionando.

    Siento ser tan rudo contigo, pero yo dejaría de empeñar mi esfuerzo en cosas que aportan poco valor a la aplicación y me centraría en cosas mucho más importantes.



    martes, 23 de abril de 2013 20:21
  • Si tengo experiencia en SQL SERVER el problema es que aca trbajan con 2000 y para hacer lo que necesitaba tenia que instalar el 2005 pero como me dejo instalar con local no me dijo que ya habia otro sql intalado pq gerneralmente te avisa que ya hay un local y lo unico que te da opcion es instalarlo como istancia.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 20:36
  • Jesús no creo que tu hayas nacido sabiendolo todo?

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 20:38
  • Cierto! :-)

    Pero me he tirado horas y horas leyendo, estudiando y probando.

    ¿Has mirado los servicios de Windows?

    ¿Qué tenemos ahí?

    martes, 23 de abril de 2013 20:53
  • Jesús si conosco SQL, el problema es que mi jefe le gusta el SQL 2000 y le insistido tanto que me dejo instalar el 2005 pero ya estaba ionstalado el 2000, esta pasado en el tiempo y trabaja con vb6 y sql 2000 y ya etamos en el siglo XXI pero que puedo hacer VS no se integra con sql 2000.

    Ahora tengo otro problem a desisntale el 2000 y ya no logueo en el SQL 2005, que nota, eso me pasa por trabajar en empresas anticuadas, pero de lo que quiero hacer si es primera vez lo del CLR


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 21:04
  • Ya me puedo conectar haciendo la referencia de conexión, tuve que desinstalar todos SQL e instalar de nuevo el SQL 2005, por fin voy a probar, gracias por su paciencia, genralmente trabajo con SQL 2008R2 y no pierdo el tiempo con sql 2000 pero no es cosa mia es mi jefe que esta oxidado

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 22:40
  • Ok compañero,intenta hacer algo y nos cuentas. Pero lo veré mañana que aqui ya es la 1:00de la noche...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 23:03
  • Ok compañero cuando te levantes seran la 1am que estaré despierto

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 23:11
  • Hola me sale el siguiente error en el código :

    public partial class Triggers { // Introduzca la tabla o vista existente del destino y elimine la marca de comentario de la línea de atributos // [Microsoft.SqlServer.Server.SqlTrigger (Name="Trigger1", Target="Table1", Event="FOR UPDATE")] public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments"; [SqlTrigger( Name = "Trigger1", Target = "dbo.Cargos_Personal", Event="FOR INSERT, UPADTE, DELETE")] public static void Trigger1() { // Sustituir con su propio código SqlContext.Pipe.Send("Trigger FIRED"); var xDoc = new XmlDocument(); using(var cn = new SqlConnection("context connection=true")) using(var cmd = new SqlCommand("SELECT * FROM dbo.Cargos_Personal FOR XML PATH('Cargos_Personal'),ROOT('Cargos_Perosnal')",cn)) { cn.Open(); using (var reader = cmd.EndExecuteXmlReader()) ==> Ninguna sobrecarga para el metodo EndExecuteXmlReader toma o argumentos

    { xDoc.Load(reader); } } var tmpFilePath = Path.Combine(XmlDocumentsFolderPath, Guid.NewGuid().ToString("N") + ".tmp"); using (var fs = new FileStream(tmpFilePath, FileMode.Create, FileAccess.Write, FileShare.None)) { xDoc.Save(fs); } var targetFiePath = Path.Combine(XmlDocumentsFolderPath, "Cargos_Personal.xml"); int remainingRetries = 8; while (true) { try { if (File.Exists(targetFiePath)) { File.Replace(tmpFilePath, targetFiePath, null); } else { File.Move(tmpFilePath, targetFiePath); } return; } catch (Exception) { if (--remainingRetries <= 0) { File.Delete(tmpFilePath); } throw; } } } }

    Ya lo corregí disculpen era un error de sintaxis

    cn.Open();
                using (var reader = cmd.ExecuteXmlReader())
                {
                    xDoc.Load(reader);
                }


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 23:40
  • Una consulta sobre la ruta puedo crear esta ruta en D

    public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments";

    D:\SQLD\XmlDocuments


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 23:45
  • El EndExecuteXmlReader es para Finaliza la ejecución asincrónica de una instrucción de Transact-SQL y devuelve los datos solicitados como XML. Tu no has hecho llamada asíncrona,modifica ese método por ExecuteXmlReader

    Ahora si que voy a dormir


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    • Propuesto como respuesta Sergio Parra martes, 23 de abril de 2013 23:47
    • Votado como útil Sergio Parra martes, 23 de abril de 2013 23:47
    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    martes, 23 de abril de 2013 23:46
  • Ok siu ya corregí, solo tengo una duda en la ruta antes de probarlo

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    martes, 23 de abril de 2013 23:49
  • Inténtalo y comenta...

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó vótala como útil. Saludos

    martes, 23 de abril de 2013 23:54
  • Confirma la ruta tengo que crear la ruta que pongo lineas arriba

    public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments";

    D:\SQLD\XmlDocuments


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    martes, 23 de abril de 2013 23:59
  • El trigger lo estoy haciendo contra una vista pùede ser que por eso no funcione???

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 0:01
  • Aqué se refieren a Desplegar el proyecto a (Generar)?

    Mi proyecto es el siguiente y lo he puesto como inicio para probarlo pero me da error


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    miércoles, 24 de abril de 2013 0:13
  • Cual sería el problema que usuario ejecuta el trigger, estoy usando el usuario sa y como daber que sa tiene acceso a la carpeta, cundo ejecuto la plicación me sale error, pero en la ventana de errores no me dice nada sale vacio

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 4:20
  • El trigger sobre la vista no se va a ejecutar si no ejecutas un INSERT, UPDATE o DELETE sobre la vista. ¿Por qué haces un trigger sobre la vista? ¿Es que la aplicación nunca va a modificar directamente las tablas base?. Lo que tendrías que hacer es crear un trigger para cada una de las tablas base de la vista.

    Desde Visual Basic 6.0 usando ADO clásico puedes obtener un recordset actualizable de una vista, pero cuando actualizas los campos del recordset y llamas al método Recordset.Update, por detrás ADO está actualizando directamente una de las tablas base de la vista.

    En vez de un trigger CLR haz un procedimiento almacenado CLR. Luego crea un trigger T-SQL para cada una de las tablas de la vista que llame al procedimiento almacenado CLR.

    La ruta \\SQLD\XmlDocuments es una ruta de red. Se supone que hay una máquina en la red (en mi red) que se llama SQLD y que tiene una carpeta compartida que se llama XmlDocuments. La carpeta donde vayas a poner los archivos xml debe estar accesible y tener sentido desde el servidor de base de datos.

    La cuenta de servicio con la que se ejecuta SQL Server debe tener permisos NTFS sobre esa carpeta.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    miércoles, 24 de abril de 2013 5:24
  • Ejecuta primero las pruebas desde el SQL Server Management Studio, no desde la aplicación, ejecuta un UPDATE sobre una de las tablas base, comprueba que no hay errores y que el el fichero se genera correctamente.

    ¿Cual es la cuenta con la que se ejecuta el servicio de SQL Server? Míralo en el "SQL Server Configuration Manager"

    Es importante, esa cuenta tiene que tener permisos NTFS sobre la carpeta de los archivos XML.

    • Marcado como respuesta Pedro Ávila miércoles, 24 de abril de 2013 14:43
    miércoles, 24 de abril de 2013 5:29
  • Despliga el proyecto antes de probarlo. Botón derecho del ratón sobre el proyecto y pulsa "Desplegar". Comprueba luego que tienes el trigger creado usando el Management Studio.

    Cuando te salgan errores dinos cual es exáctamente el mensaje de error. De poco nos sirve para ayudarte que nos digas "me sale un error".

    miércoles, 24 de abril de 2013 5:34
  • Hola Jesús, como estoy haciendo pruebas primero lo voy hacer con una tabla ya despues que funcione lo hare como me indicas sobre las vistas, lo probare en mi pc localmente primero.

    en el proyecto sql no encuentro desplegar cuando le doy clic derecho estoy usando VS 2010 en español

    Esto es todo lo que tengo en ese proyecto haciendole click derecho

    Jesús, NO VEO NINGUN DESPLEGAR


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú





    • Editado Pedro Ávila miércoles, 24 de abril de 2013 10:17
    miércoles, 24 de abril de 2013 9:25
  • Jesús, como hago esto

    La cuenta de servicio con la que se ejecuta SQL Server debe tener permisos NTFS sobre esa carpeta.

    Estoy usando el usuario sa, me puedes ayudar con esto

    No aparece el trigger que lo cree en el visual studio


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila miércoles, 24 de abril de 2013 10:07
    miércoles, 24 de abril de 2013 9:54
  • Cuando compilo la solución no me da errores pero cuando ejecuto la aplicaión me sale este mensaje

    Cuando cree el proyecto me salio un mensaje si deseo agregar depurador le puse que si, como verán sale este mensaje sin embargo no sale un error en la ventana de errores, las pruebas lo estoy haciendo en mi maquina por ahora quiero que gener los archivos xml, otra cosa si no se genera el trigger nunca va a pasar nada


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila miércoles, 24 de abril de 2013 10:16
    miércoles, 24 de abril de 2013 10:15
  • Que esta mal, cuando comento todo el código la aplicación se puede ejecutar pero cuando dejo el código sin comentar no ejecuta

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;
    using System.Xml;
    using System.IO;
    using System.Threading;
    
    
    public partial class Triggers
    {
    
        //public const string XmlDocumentsFolderPath = @"\\SQLD\XmlDocuments"; nombre de red\nombre carpeta
        public const string XmlDocumentsFolderPath = @"D:\XmlDocuments";
    
        [SqlTrigger(
            Name = "Trigger1",
            Target = "dbo.Productos", Event = "FOR INSERT, UPADTE, DELETE")]
        public static void Trigger1()
        {
            // Sustituir con su propio código
            //SqlContext.Pipe.Send("Trigger FIRED");
    
            var xDoc = new XmlDocument();
            using (var cn = new SqlConnection("context connection=true"))
            using (var cmd = new SqlCommand("SELECT * FROM dbo.Productos FOR XML PATH('Producto'),ROOT('Productos')", cn))
            {
                cn.Open();
                using (var reader = cmd.ExecuteXmlReader())
                {
                    xDoc.Load(reader);
                }
            }
    
            var tmpFilePath = Path.Combine(XmlDocumentsFolderPath, Guid.NewGuid().ToString("N") + ".tmp");
            using (var fs = new FileStream(tmpFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                xDoc.Save(fs);
            }
    
            var targetFiePath = Path.Combine(XmlDocumentsFolderPath, "Productos.xml");
            int remainingRetries = 8;
            while (true)
            {
                try
                {
                    if (File.Exists(targetFiePath))
                    {
                        File.Replace(tmpFilePath, targetFiePath, null);
                    }
                    else
                    {
                        File.Move(tmpFilePath, targetFiePath);
                    }
                    return;
                }
                catch(Exception)
                {
                    if (--remainingRetries <= 0)
                    {
                        File.Delete(tmpFilePath);
                        throw;
                    } 
                   
                }
            }
        }
    }
    

    La tabla se llama productos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 10:44
  • Esta es la lectura cuando genero el proyecto y cuando ejecuto

    ------ Operación Generar iniciada: proyecto: Controles, configuración: Debug x86 ------
      Controles -> D:\Controles\Controles\bin\Debug\Pueba.Controles.exe
    ------ Operación Implementar iniciada: proyecto: SqlServerPrisma, configuración: Debug Any CPU ------
    Compilación iniciada a las 24/04/2013 07:39:02 a.m..
    SqlClrDeploy:
      Iniciando implementación del ensamblado SqlServerPrisma.dll en el servidor PERSONAL: Prisma
      Se puede producir el siguiente error si implementa un proyecto SQL CLR compilado para una versión de .NET Framework incompatible con la instancia de destino de SQL Server: "Error de implementación SQL01268: error de CREATE ASSEMBLY para el ensamblado porque no se pudo comprobar el ensamblado". Para resolver este problema, abra las propiedades del proyecto y cambie la versión de .NET Framework.
      Script de implementación generado en:
      D:\Controles\SqlServerPrisma\bin\Debug\SqlServerPrisma.sql
      
      Quitando [SqlServerPrisma].[SqlAssemblyProjectRoot]...
      Quitando [SqlServerPrisma]...
      Creando [SqlServerPrisma]...
      Agregando archivos al ensamblado [SqlServerPrisma]
      Creando [dbo].[Trigger1]...
    D:\Controles\SqlServerPrisma\bin\Debug\SqlServerPrisma.sql(121-121): Deploy error SQL01268: .Net SqlClient Data Provider: Mensaje 325, Nivel 15, Estado 1, Procedimiento Trigger1, Línea 4 Sintaxis incorrecta cerca de 'EXTERNAL'. Es probable que tenga que establecer el nivel de compatibilidad de la base de datos actual en un valor superior para habilitar esta característica. Vea la ayuda del procedimiento almacenado sp_dbcmptlevel.
      Error al ejecutar el lote.
    
    ERROR al compilar.
    
    Tiempo transcurrido 00:00:10.00
    ========== Generar: 1 correctos, 0 incorrectos, 4 actualizados, 0 omitidos ==========
    ========== Implementar: 0 correctos, 1 incorrectos, 0 omitidos ==========

    Estoy usando para ese proyecto Framework 3.5

    sale un error en external


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila miércoles, 24 de abril de 2013 12:42
    miércoles, 24 de abril de 2013 12:41
  • Ya lo corregí, como la ve estaba creada en SQL SERVER 200 no había compatibilidad pero ya cambie la compatibilidad a SQL 2005 me esta saliendo este mensaje que opcion tomo.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 13:24
  • Voy abrir un nuevo hilo con este ultimo percanse y no me esta creando los archivos XML cuando los pruebo.

    NOTA : NO ME ABANDONDEN QUE YA REME HASTA LA ORILLA NO DEJEN QUE ME AHOGUE FALTANDO POCO


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila miércoles, 24 de abril de 2013 14:45
    miércoles, 24 de abril de 2013 14:44
  • Digo yo que será "Implementar", en inglés es "Deploy" y yo nunca uso versiones de Visual Studio ni de Windows ni de nada en español, todo siempre en inglés. ¡Porque en español no me entero! No sé como lo traducen.
    miércoles, 24 de abril de 2013 15:49
  • No es un desencadenador de base de datos, es un desencadenador de la tabla.

    Para ver la cuenta de servicio mira en el "SQL Server Configuration Manager" no en el "SQL Server Management Studio". En este último puedes ver si se ha creado el trigger, pero no la cuenta de servicio (creo).

    Permisos NTFS:

    En mi SQL, la cuenta de servicio es el usuario del dominio SQLService, y le he dado "Full Control" en la carpeta XmlDocuments

    miércoles, 24 de abril de 2013 15:57
  • Repito, es un trigger de tabla:

    miércoles, 24 de abril de 2013 16:01
  • Lo tengo así

    no te olvides de este mensaje cuando ejecuto la aplicacion


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 16:05
  • Jesús ya salio el trigger en la tabla y hice la prueba y  no esta generando el xml 


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 16:19
  • Esta la ruta esta bien escrita

    public const string XmlDocumentsFolderPath = @"D:\SQLD\XmlDocuments";

    tengo esa carpeta creada en esa ruta.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 16:21
  • Esta parte tengo dudas

    [SqlTrigger(
            Name = "Trigger1",
            Target = "dbo.Periodos", Event = "FOR INSERT, UPADTE, DELETE")]
        public static void Trigger1()
        {
            // Sustituir con su propio código
            //SqlContext.Pipe.Send("Trigger FIRED");
    
            var xDoc = new XmlDocument();
            using (var cn = new SqlConnection("context connection=true"))
            using (var cmd = new SqlCommand("SELECT * FROM dbo.Periodos FOR XML PATH('Periodo'),ROOT('Periodos')", cn))
            {
    Ese periodo la tabla se llama periodos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 24 de abril de 2013 16:29
  • Estoy trabajando con usuario sa, pero el usuario sa no tiene clave y si le agrego el usuario aca, seria agregar DESARROLLO02/Administradores, allí esta incluido mi sa me imagino, confirma, pero no tengo clave es sin clave.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila miércoles, 24 de abril de 2013 16:47
    miércoles, 24 de abril de 2013 16:37
  • Sergio la aplicación se ejecuta y ha creado el trigger en la tabla pero cuando lo pruebo por base de datos no me esta creando el archivo xml en la ruta indicada.

    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    jueves, 25 de abril de 2013 7:34