viernes, 19 de agosto de 2016

Funciones en C Sharp (C#) para Conexion y Manejo Basico de Bases de Datos de MSSQL

En esta publicacion veremos una pequeña clase que escribi hoy en la mañana y que puede ser util para el manejo de consultas en bases de datos Microsoft Sql Server desde ASP.NET con C#, en realidad con unas pocas modificaciones es posible adaptarlo a C# "de escritorio".

En mi caso, hice una publica clase llamada MSSQL, que esta compuesta por 2 funciones:

1.- script(sentencia sql) -> Retorna un String con el resultado de la operacion
2.- query(sentencia sql) -> Retorna un DataTable con el resultado de la operacion

En el Archivo web.config esta definida la cadena de conexion a la Base de Datos, dentro de las eqtiquetas "<connectionStrings>"



<connectionStrings>
    <add name="DB" connectionString="Server=IP_SERVIDOR,1433;Initial Catalog=NOMBRE_DB;Persist Security Info=False;User ID=NOMBRE_USUARIO;Password=CONTRASEÑA;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" />
  </connectionStrings>


Usamos 2 librerias de referencia:
  • using System.Data;
  • using System.Data.SqlClient; 



En la construccion de la clase MSSQL declare la conexion fuera de las funciones, para que todas pudieran tener acceso a esta...

La variable CONEXION esta declarada como privada, ya que necesito que sea visible solo por las funciones que utilizaran la conexion, al inicializar el objeto le indique que lea la cadena de conexion almacenada en el archivo web.config







private SqlConnection CONEXION = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
 
La funcion QUERY(sentencia SQL) recibe como parametro un string con la sentencia sql que se desea ejecutar, y devuelve un DataTable.



 ///<summary>Devuelve un DataTable con el resultado de la consulta. </summary>
        ///<param name="QUERY">String de consulta SQL</param>
        public DataTable QUERY(string QUERY)
        {

            DataTable tabla = new DataTable(); //declara un DataTable nuevo que recibira el resultado de la Query
            try
            {

//Verifica si la conexion no esta abierta, si el estado es distinto a open, la abre.
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
//Se declara e inicializa el objeto SqlCommand que contiene la QUERY (que se paso por parametro a la funcion) y la CONEXION.
                SqlCommand SENTENCIA = new SqlCommand(QUERY,CONEXION);

//Se define que la propiedad Timeout de la sentencia seran 180 segundos, esta propiedad define cuantotiempo esperar antes de arrojar error.
                SENTENCIA.CommandTimeout = 180;

//se crea e inicializa un SqlDataAdapter y se le entrega como parametro el objeto SENTENCIA que contiene la sentencia sql.
                SqlDataAdapter ADAPTADOR = new SqlDataAdapter(SENTENCIA);

//Utilizo la funcion Fill(DataTable) del objeto ADAPTADOR, entregandole como parametro la tabla vacia que declaramos al principio, esta funcion se encarga de llenar la tabla con el resultado de la consulta sql.
                ADAPTADOR.Fill(tabla);

//realizamos una validacion verificando que vienen resultados en la consulta.
                if (tabla.Rows.Count == 0)
                {

//si no vienen resultados creamos una tabla y la inicializamos
                    DataTable tmptbl = new DataTable();

//le agregamos una columna llamada "Resultados"
                    tmptbl.Columns.Add("Resultados");

//creamos una nueva fila con la estructura de la tabla
                    DataRow tmp = tmptbl.NewRow();

//le asignamos el valor a la fila nueva en la columna 0 con un texto que indica que no hay resultados
                    tmp[0] = "No se encontraron resultados.";

//agregamos la fila a la table
                    tmptbl.Rows.Add(tmp);

//cerramos la conexion
                    CONEXION.Close();

//retornamos la tabla con el mensaje como resultado a la funcion
                    return tmptbl;
                }

//si por el contrario, SI hay resultados...
                else
                {

//cerramos la conexion
                    CONEXION.Close();

//devolvemos como resultado de la funcion la tabla con los resultados.
                    return tabla;
                }
            }

//en caso de error lo manejamos de la siguiente forma
            catch (Exception ERR)
            {

//creamos una tabla y la inicializamos
                DataTable tmptbl = new DataTable();

//se agrega una columna con el nombre ERROR
                tmptbl.Columns.Add("ERROR");

//agregamos una fila con la estrucutra de la tabla
                DataRow tmp = tmptbl.NewRow();

//agregamos un mensaje con el detalle del error
                tmp[0] = "Mensaje: " + ERR.Message;

//agregamos la fila a la tabla
                tmptbl.Rows.Add(tmp);

//cerramos la conexion al servidor
                CONEXION.Close();

//retornamos como resultado al servidor la tabla con el error que se produjo
                return tmptbl;
            }
        }




La funcion SCRIPT(sentencia SQL), recibe como parametro un string con la sentencia sql que se desea ejecutar, y devuelve un string que indica el resultado de la ejecucion de la sentencia SQL indicada.


La explicacion de las partes de esta funcion son casi las mismas de la anterior, excepto por unos pequeños detalles....
 
public string SCRIPT(string T_SQL)
        {
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
                SqlCommand SENTENCIA = new SqlCommand(T_SQL, CONEXION);

//la funcion ExecuteNonQuery() devuelve un numero entero que indica el numero de filas afectadas ó -1 si es que es otro tipo de sentencia como un create table por ejemplo...
                int AFECTADAS = SENTENCIA.ExecuteNonQuery();
                CONEXION.Close();

//si el resultado es -1 se ejecuto una sentencia, y devolvemos un mensaje indicando esto.
                if (AFECTADAS == -1)
                    return "Sentencia Ejecutada.";
                else

//si el resultado era >= 0 devolvemos un mensaje indicando cuantos registros fueron afectados
                    return AFECTADAS.ToString() + " Registros afectados.";
            }

En caso de error devolvemos string con el mensaje de error.
            catch (Exception ERR)
            {
                CONEXION.Close();
                return ERR.Message;
            }
        }




Finalmente aca abajo, les dejo el codigo completo de la clase.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DAL
{
    ///<summary>Clase para manejo de consultas Microsoft Sql Server</summary>
    public class MSSQL
    {
        private SqlConnection CONEXION = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
       
        ///<summary>Devuelve un texto con el resultado de la operacion. </summary>
        ///<param name="T_SQL">String de consulta SQL</param>
        public string SCRIPT(string T_SQL)
        {
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
                SqlCommand SENTENCIA = new SqlCommand(T_SQL, CONEXION);
                int AFECTADAS = SENTENCIA.ExecuteNonQuery();
                CONEXION.Close();
                if (AFECTADAS == -1)
                    return "Sentencia Ejecutada.";
                else
                    return AFECTADAS.ToString() + " Registros afectados.";

            }
            catch (Exception ERR)
            {
                CONEXION.Close();
                return ERR.Message;
            }
        }

        ///<summary>Devuelve un DataTable con el resultado de la consulta. </summary>
        ///<param name="QUERY">String de consulta SQL</param>
        public DataTable QUERY(string QUERY)
        {

            DataTable tabla = new DataTable();
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();

                SqlCommand SENTENCIA = new SqlCommand(QUERY,CONEXION);
                SENTENCIA.CommandTimeout = 180;
                SqlDataAdapter ADAPTADOR = new SqlDataAdapter(SENTENCIA);
                ADAPTADOR.Fill(tabla);
                if (tabla.Rows.Count == 0)
                {
                    DataTable tmptbl = new DataTable();
                    tmptbl.Columns.Add("Resultados");
                    DataRow tmp = tmptbl.NewRow();
                    tmp[0] = "No se encontraron resultados.";
                    tmptbl.Rows.Add(tmp);
                    CONEXION.Close();
                    return tmptbl;
                }
                else
                {
                    CONEXION.Close();
                    return tabla;
                }
            }
            catch (Exception ERR)
            {
                DataTable tmptbl = new DataTable();
                tmptbl.Columns.Add("ERROR");
                DataRow tmp = tmptbl.NewRow();
                tmp[0] = "Mensaje: " + ERR.Message;
                tmptbl.Rows.Add(tmp);
                CONEXION.Close();
                return tmptbl;
            }
        }

}

En Mas adelante veremos como pasar un DataTable a HTML o a Excel (.xls), espero les sea util, comentarios de como mejorar esto son bienvenidos...

Cambiar la Hora en PBX NEC Univerge SV8100

Bueno, varios preguntaron como cambiar la hora en esta central, suponiendo que no tienen acceso a la interfaz web, por la cual es facil, les indicare como cambiarla por el Modo Programacion NEC SV8100 desde un terminal digital.

El programa para manejar la Fecha y Hora de la central es el 10-01, veamos las opciones:

Items del 10-01:
01: Año <- Valores de 00 a 99, solo 2 digitos
02: Mes <- Valores de 01 a 12
03: Dia <- Valores de 01 a 31
04: Dia de la Semana <- valores de 1 a 7, 1=Lunes 7=Domingo
05: Hora <- 00 a 23
06: Minuto <- 00 a 59
07: Segundo <- 00 a 59

Y... esto seria toda la magia de como cambiar la hora...

Modo Programacion NEC Univerge SV8100

En esta ocacion explicare como ingresar y salir del modo de programacion de la PBX NEC Univerge SV8100 desde un terminal digital.

Como entrar al modo Programacion:

1.- Ir a un terminal digital (como este SV8100)
2.- NO LEVANTAR el auricular
3.- Presionar el boton Speaker 
4.- Presionar #*#*
5.- El terminal solicitara el Password, ingresar 12345678 y Presionar el boton Transfer

La PBX posee 3 niveles de programacion:

tech 12345678 <-- Usuario de instalacion, con acceso a todos los programas
admin1 0000 <-- Usuario Administrador nivel 1 (SA)
admin2 9999 <-- Usuario Administrador nivel 2 (SB)

Teclas para moverse por los programas:

0-9 y * : Ingreso de datos al programa.
Transfer: Confirma los datos ingresados (como presionar ENTER en el pc)
Recall: Borra hacia la izquierda (como presionar el Backspace en pc)
Hold: Borra todo lo que esta a la derecha del cursor.
Answer: Vuelve un paso atras en el programa, por ejemplo si estas en el item 5 del programa 15-03, al presionar answer puedes seleccionar otro item del programa 15-03
MIC: va cambiando el cursor entre los campos de ingreso de datos

Como salir del modo Programacion:

Cuando esten listos con lo que programaron, deben salir de la opcion de programacion, para salir deben presionar el boton Answer.

1.- Presionar Answer para salir del programa, si es que aun no salen.
2.- Presionar Speaker, si hicieron cambios saldra un mensaje que dira algo como "Saving System Data"
3.- En pantalla aparecera "Complete Data Save" y saldra del modo de programacion.


Dell PowerEdge 2850: Codigos de Pitido o Beep Codes

Esto ya es lo ultimo que encontre guardado, los codigos de pitidos de este servidor...

System Beep Codes

If an error that cannot be reported on the screen occurs during POST, the system may emit a series of beeps that identifies the problem.
NOTE: If the system boots without a keyboard, mouse, or monitor attached, the system does not issue beep codes related to those peripherals.
If a beep code is emitted, write down the series of beeps and then look it up in Table 2-10. If you are unable to resolve the problem by looking up the meaning of the beep code, use system diagnostics to identify the possible cause. If you are still unable to resolve the problem, see "Getting Help."

CAUTION: Only trained service technicians are authorized to remove the system cover and access any of the components inside the system. See your Product Information Guide for complete information about safety precautions, working inside the computer, and protecting against electrostatic discharge.

Table 2-10. System Beep Codes 

Code

Cause

Corrective Action
1-1-2
CPU register test failure.Replace microprocessor 1. See "Processors" in "Installing System Board Options." If the problem persists, replace microprocessor 2.
1-1-3
CMOS write/read failure; faulty system board.See "Getting Help."
1-1-4
BIOS error.Reflash the BIOS firmware. See "Getting Help."
1-2-1
Programmable interval-timer failure; faulty system board.See "Getting Help."
1-2-2
DMA initialization failure.See "Troubleshooting System Memory" in "Troubleshooting Your System."
1-2-3
DMA page register write/read failure.
1-3-1
Main-memory refresh verification failure.
1-3-2
No memory installed.
1-3-3
Chip or data line failure in the first 64 KB of main memory.
1-3-4
Odd/even logic failure in the first 64 KB of main memory.
1-4-1
Address line failure in the first 64 KB of main memory.
1-4-2
Parity failure in the first 64 KB of main memory.
1-4-3
Fail-safe timer test failure.
1-4-4
Software NMI port test failure.
2-1-1 through
2-4-4
Bit failure in the first 64 KB of main memory.
3-1-1
Slave DMA-register failure.See "Getting Help."
3-1-2
Master DMA-register failure.
3-1-3
Master interrupt-mask register failure.
3-1-4
Slave interrupt-mask register failure.
3-2-2
Interrupt vector loading failure.
3-2-4
Keyboard-controller test failure.See "Troubleshooting the Keyboard" in "Troubleshooting Your System."
3-3-1
CMOS failure.See "Getting Help."
3-3-2
System configuration check failure.
3-3-3
Keyboard controller not detected.
3-3-4
Video memory test failure.
3-4-1
Screen initialization failure.
3-4-2
Screen-retrace test failure.
3-4-3
Video ROM search failure.
4-2-1
No timer tick.
4-2-2
Shutdown test failure.
4-2-3
Gate A20 failure.
4-2-4
Unexpected interrupt in protected mode.See "Troubleshooting Expansion Cards" in "Troubleshooting Your System."
4-3-1
Improperly installed or faulty memory modules.See "Troubleshooting System Memory" in "Troubleshooting Your System."
4-3-2
No memory modules installed in bank 1.Install memory modules in bank 1 of the same type and size. See "Installing Memory Modules" in "Installing System Options."
4-3-3
Faulty system board.See "Getting Help."
4-3-4
Time-of-day clock stopped.See "Troubleshooting the System Battery" in "Troubleshooting Your System."
4-4-1
Super I/O chip failure; faulty system board.See "Getting Help."
4-4-2
BIOS-shadowing failure.See "Troubleshooting System Memory" in "Troubleshooting Your System."
4-4-3
Microprocessor speed control sequence failure.See "Troubleshooting the Microprocessors" in "Troubleshooting Your System."
4-4-4
Cache test failure; faulty microprocessor.
NOTE: For the full name of an abbreviation or acronym used in this table, see the "Glossary" in the User's Guide.

Warning Messages

A warning message alerts you to a possible problem and prompts you to respond before the system continues a task. For example, before you format a diskette, a message will warn you that you may lose all data on the diskette. Warning messages usually interrupt the task and require you to respond by typing y (yes) or n (no).
NOTE: Warning messages are generated by either the application or the operating system. For more information, see "Finding Software Solutions" and the documentation that accompanied the operating system or application.

Diagnostics Messages

When you run system diagnostics, an error message may result. Diagnostic error messages are not covered in this section. Record the message on a copy of the Diagnostics Checklist in "Getting Help," and then follow the instructions in that section for obtaining technical assistance.

Alert Messages

Systems management software generates alert messages for your system. Alert messages include information, status, warning, and failure messages for drive, temperature, fan, and power conditions. For more information, see the systems management software documentation.