none
¿Cómo guardar el resultado de un procedimiento almacenado en un archivo de texto usando C#? RRS feed

  • Pregunta

  • Tengo un procedimiento almacenado (sp_help_revlogin) en la base de datos master de una instancia de base de datos en SQL Server. A continuación, el resultado de la ejecucíon:

    exec [dbo].[sp_help_revlogin]

    Lo que estoy intentando sin éxito, es guardar dicho resultado en un archivo de texto ejecutándolo desde un ETL que corre un script en C#. El siguiente código está bien resumido, pero básicamente esa es la lógica que pude armar. 

    #region Namespaces
        using System;
        using System.Data;
        using Microsoft.SqlServer.Dts.Runtime;
        using System.Windows.Forms;
        using System.Collections.Generic;
        using System.Text;
        using Microsoft.SqlServer.Management.Smo;
        using Microsoft.SqlServer.Management.Common;
        using System.Collections.Specialized;
        using System.IO;
        using System.Data.SqlClient;
        #endregion
    
        namespace ST_d59f37d9cd9f4882a6e0a79016b7da00
        {
            [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    
            public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
            {
                public void Main()
                {
                    try
                    {
                        // Create a connection to the server
                        string sqlConnectionString = "String conection";
                        SqlConnection conn = new SqlConnection(sqlConnectionString);
    
                        //Execute Stored Procedure
                        string query = "EXEC sp_help_revlogin;";
                        SqlCommand cmd = new SqlCommand(query, conn);
                        conn.Open();
    
                        //ES AQUÍ MI PROBLEMA!!! (Cómo guardo el resultado del procedimiento)
                        SqlDataAdapter da = new SqlDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        da.Fill(ds);
    
                        //Create Path
                        string FullPath = @"D:\Repository";
                        if (!System.IO.Directory.Exists(FullPath))
                        {
                            System.IO.Directory.CreateDirectory(FullPath);
                        }
                        
                        //Set file Name
                        string FileFullPath = FullPath +"\\" + "Logins.sql";
                        ds.WriteXml(FileFullPath);
    
                    }
                    catch (Exception exception)
                    {
                        /* Code exeption */
                    }
                }
            }
        }
    Con la lógica anterior he podido crear las carpetas (Path) e inclusive crear el archivo.sql, pero no he logrado escribir el resultado del stored en dicho archivo, las razones pueden ser obvias, estoy tratando de escribir en formato xml una salida de tipo texto.

    He encontrado muchos ejemplos en internet, pero básicamente son para casos en las que se consultan a tablas y por consiguiente los métodos son para recorrer y guardar columnas, pero en mi caso la salida es texto.

    De modo que quisiera que por favor me ayuden a encontrar un método correcto para poder realizar lo expuesto líneas arriba.

    Gracias.


    • Editado Franklin J sábado, 5 de diciembre de 2020 15:00
    sábado, 5 de diciembre de 2020 14:59

Todas las respuestas

  • Te sugiero que preguntes en el foro de sqlserver, ahí tenes mas chances que te respondan
    sábado, 5 de diciembre de 2020 20:49
  • Hola Frankiln J:

    create procedure sp_info 
    As
    Begin
    	Print 'Ejemplo salida 1';
    	Print 'Ejemplo salida 2';
    	Print 'Ejemplo salida 3';
    	Print 'Ejemplo salida 4';
    End
    go

    Los retornos de la ventana de mensajes se capturan con el evento InfoMessage de SqlConnection

    class Program
    {
        static DataSet ds = new DataSet();
        
    
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("mensaje", typeof(string)));
            ds.Tables.Add(dt);
            try
            {
                // Create a connection to the server
                string sqlConnectionString = "Data Source=ESPDPC44\\SQL2019;Initial Catalog=HowTo;Integrated Security=true";
    
                using (SqlConnection conn = new SqlConnection(sqlConnectionString))
                {
                    conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);
                    conn.FireInfoMessageEventOnUserErrors = true;
                    
                    //Execute Stored Procedure
                    string query = "sp_info";
    
                    using (SqlCommand cmd = new SqlCommand(query, conn))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection.Open();
                        cmd.ExecuteNonQuery();
                    }
    
                    printFile();
                }
            }
            catch (Exception exception)
            {
                /* Code exeption */
            }
    
    
        }
        static void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
        {
           ds.Tables[0].Rows.Add(e.Message);
        }
    
        static void printFile()
        {
            try
            {
                //Create Path
                string FullPath = @"D:\Repository";
                if (!System.IO.Directory.Exists(FullPath))
                {
                    System.IO.Directory.CreateDirectory(FullPath);
                }
    
                //Set file Name
                string FileFullPath = FullPath + "\\" + "Logins.sql";
                if (ds != null)
                    ds.WriteXml(FileFullPath);
            }
            catch (Exception)
            {
                /* Code Manejar excepciones de lectura y escritura IO Exception */
                throw;
            }
        }
    }
    Esta puede ser una de las maneras de realizarlo.



    domingo, 6 de diciembre de 2020 6:54
  • Hola

    Alguna actualización sobre tu consulta?

    Saludos

    lunes, 7 de diciembre de 2020 22:07
    Moderador