Translate

Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

sábado, 1 de febrero de 2014

How to seed data in a "manual mode" way into an Entity Framework Code First data base

First of all, you need to enable automatic migrations: go to Tools, Library Package Manager and finally to Package Manager Console.

Execute the command: Enable-Migrations. A new class called Configuration appears under a new folder called Migrations. Go to this class and use the following code as an example to seed two tables called Sport and RaceType:




The first method, Seed which is overrided to use our own seed actions includes a call to an SQL Command, in order to delete the tables, and initialize the index counters. Following to a call to the method  GetSports, which obtains data from the Sports List created bellow. For each element on this list we call the Add method.

To manually launch this seed you only need to use the command Update-Database in the previous shell.


martes, 26 de noviembre de 2013

SQL Server: Manejar Time mayor de 24h con función escalar.

Este ejemplo resuelve el post Anterior pero ahora usando una función en vez de un procedimiento, lo que permite llamar a dicha función desde dentro del Select y así poder usar Group By:
CREATE FUNCTION dbo.floatToTimeChar
(
    – Add the parameters for the function here
    @timeAsFloat float
)
RETURNS varchar(14)
AS
BEGIN
    DECLARE @TotTimeVC varchar(14)
    declare @h int;
    declare @m int;
    declare @s int;
    set @h=CAST(@timeAsFloat/3600 as int);
    set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
    set @s=(CAST(@timeAsFloat as Int)%3600)%60;
    declare @mVC varchar(2);
    declare @sVC varchar(2);
    set @mVC=Convert(varchar(2),@m);
    set @sVC=Convert(varchar(2),@s);
    if LEN(@mVC)=1
    begin
        set @mVC=’0′+@mVC;
    end;
    if LEN(@sVC)=1
    begin
        set @sVC=’0′+@sVC;
    end;
    set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;    
    – Return the result of the function
    RETURN @TotTimeVC
END
Para usar esa función usamos el siguiente Select:
select
       (Select ST.SportTypeName from SportTypes ST where ST.SportTypeID=Sessions.SportTypeID) as SportName,      
       COUNT(SessionID) as SesionsCant,       
       CAST(SUM(Distance)as decimal(7,2))as TotDist,
       CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
       MAX(Distance) as MaxDist,
                    
       dbo.floatToTimeChar(SUM(CAST(Time As Float)*24*60*60)) As TotTimeCalc,
       dbo.floatToTimeChar(AVG(CAST(Time As Float)*24*60*60)) As AvgTimeCalc,                       
       dbo.floatToTimeChar(MAX(CAST(Time As Float)*24*60*60)) As MaxTimeCalc,                       
                           
       CAST(AVG(CAST(MedHR as float)) as decimal (7,2) )as AvgMedHR,
       MAX(MedHR) as MaxMedHR,
       CAST(AVG(CAST(MaxHR as float)) as decimal (7,2) )as AvgMaxHR,
       MAX(MaxHR) as MaxMaxHR,
       CAST(AVG(CAST(Value as float)) as decimal (7,2) )as AvgValue,
       MAX(Value) as MaxValue,
       
       CONVERT(varchar,MIN(Date),106) as firstDate,
       CONVERT(varchar,MAX(Date),106) as lastDate,
       DATEDIFF (day, CONVERT(varchar,MIN(Date),106), CONVERT(varchar,MAX(Date),106))+1 as days
       
from Sessions
where UserID=@userID
group by SportTypeID;

SQL Server: Manejar time mayores de 24horas

La idea es, tengo un programa donde controlo las sesiones de entrenamiento de una persona. Necesito obtener el total de distancia y tiempo recorrido por el atleta.

Con los datos de tipo time no puedo controlar más de 24horas. Si bién las sesiones son siempre muy inferoiores a 24horas, al sumarlas si se nos presenta el problema. Para resolverlo, ántes de sumar el tiempo de cada sesión los transformamos a float para sumarlos todos. Obtenemos un float que tiene la suma total, y luego con un procedimiento que crearemos en la BD podremos transformar a formato hhhh:mm:ss de manera que así ya podamos mostrarlo.

El procedure sería así:
@timeAsFloat es el float de entrada que contiene la suma de tiempos, y @totTimeVC será el resultado en formato varchar conteniendo el tiempo total.

create procedure [dbo].[floatToTime] @timeAsFloat float, @totTimeVC varchar(14) output 
as
   declare @h int;
   declare @m int;
   declare @s int;
   set @h=CAST(@timeAsFloat/3600 as int);
   set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
   set @s=(CAST(@timeAsFloat as Int)%3600)%60;
   declare @mVC varchar(2);
   declare @sVC varchar(2);
   set @mVC=Convert(varchar(2),@m);
   set @sVC=Convert(varchar(2),@s);
   if LEN(@mVC)=1
   begin
      set @mVC=’0′+@mVC;
   end;
   if LEN(@sVC)=1
   begin
      set @sVC=’0′+@sVC;
   end;
   set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;

La consulta necesaria y que usa el procedimiento anterior sería:

use TrainIT;
declare @userID bigInt;
set @userID=85;
       declare @totTime float;
       set @totTime=(select SUM(CAST(Time As Float)*24*60*60) from Sessions where       UserID=@userID);
       declare @totTimeVC varchar(14);

execute floatToTime @totTime,@totTimeVC output;
select COUNT(SessionID) as SesionsCant,
           SUM(Distance) as TotDist,
           CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
           MAX(Distance) as MaxDist,                                                
           @totTimeVC As TotTimeCalc,              
from Sessions
where UserID=@userID;

domingo, 24 de noviembre de 2013

SQL Server: Primer y último día del mes

Consulta para calcular el número de sesiones, así como la suma de las distancia y tiempo en las sesiones realizadas en el mes en curso para el usuario dado (este se pasa por parámetro a la consulta en @userID)

Declare @firstDayOfMonth varchar;
Set @firstDayOfMonth=Convert(varchar,DATEADD(d,-day(GetDate())+1,GetDate()),105);


Declare @LastDayOfMonth varchar;
Set@LastDayOfMonth = Convert(varchar,DATEADD(d,-day(GetDate()),DATEADD(m,1,GetDate())),105);


select COUNT(SessionID) As SesionsCant,
          SUM(Distance) as TotDist,
          CONVERT(char(8),CAST(SUM(CAST(Time As Float)*24 )AS DateTime),108 )As TotTime
from Sessions
where UserID=@userID 

           AND (  (CONVERT(varchar,Sessions.Date,105)>=@firstDayOfMonth )         
          AND     (CONVERT(varchar,Sessions.Date,105)<=@LastDayOfMonth )   );

jueves, 21 de noviembre de 2013

SQL Server: DateTime To Float

La idea sería calcular la velocidad a partir de dos campos en una tabla que contienen la distancia en km y el tiempo invertido. El cálculo es fácil, distancia/tiempo, pero ántes tendremos que convertir el tiempo a float.

La tabla posee por lo tanto dos campo, uno DateTime (time) y otro float(distance). Necesitaremos hacer un CAST del time para convertir a float, lo que nos da un número que multiplicado por 24 serán horas, por 24*60 serán minutos, y 24*60*60 serán segundos. Así para obtener un campo que contenga la velocidad en km/h haremos un select de la siguiente manera:

select distance,time, distance/(CAST(time AS float)*24) AS “Speed” from Table1 where CAST(time AS float)>’0′

 La columna Speed contendrá el dato de la velocidad. En el campo time hay que usar el tipo DateTime ya que permite el casting a float, no así con el tipo Time.
Un DateTime cuyo valor sea “1900/01/01 00:00:00.000″ al hacer el cast a float devolverá 0.

La clausula where evita que dividamos por cero, pero eliminará aquellos registros que no tengan el dato tiempo. Para evitar eso podemos cambiar la consulta a :

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN distance/(CAST(time AS float)*24)
         ELSE ’0′
       END AS “Speed”       
from Table1

De esta manera si encontramos un time menor o igual a cero pondremos automáticamente la velocidad a 0, en otro caso si haremos el cálculo.

Si queremos mostrar el dato de la velocidad con solo dos dígitos tendremos que dar la salida haciendo un casting a decimal, para ello la consulta quedaría así:

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
                     distance/(CAST(time AS float)*24) AS decimal (7,2)     )
         ELSE ’0′
       END AS “Speed”       
from Table1

Por último y para evitar que el campo time, de tipo datetime, nos devuelva un dato del tipo “1900-01-01 00:00:00.000″, tenemos que hacer una conversión, para lo cual usaremos la función CONVERT con el valor 108, que devuelve la parte time del campo en formato hh:mm:ss. Quedará la consulta así:

select distance, CONVERT(Char(8),time,108) As “ShortTime”,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
         distance/(CAST(time AS float)*24)
         AS decimal (7,2) )
         ELSE ’0′
       END AS “Speed”       
from Table1

SQL Server: Manejar datos tipo Money en Visual Studio y C#

Para usar el tipo de datos money de Sql en visual necesitaremos las siguientes referencias al framework:

Using System.Data.SqlTypes;
Using System.Xml;

Para definir un campo de este tipo en el código lo haremos así:

SqlMoney ammount;

Para asignar datos partiremos de un valor float, double o int que transformaremos a SqlMoney ántes de asignar a la variable:

Double aValue = 100.23F;
SqlMoney amount =(SqlMoney)aValue;

Si hemos usado un SQL reader para obtener los datos a través de una consulta usaremos el método GetSQqlMoney:

using (SqlConnection conn = new SqlConnection(connString))
{
     string query = “select * from Materials where MatID = @matID”;
     using (SqlCommand cmd = new SqlCommand(query, conn))
    {
           cmd.Parameters.Add(new SqlParameter(“@matID”,     SqlDbType.Int));
           cmd.Parameters["@matID"].Value = matID;
           conn.Open();
           SqlDataReader reader = cmd.ExecuteReader();
           while (reader.Read())
           {
                  matID = reader.GetInt32(0);
                  matCost = reader.GetSqlMoney(7);
                  matInitTime = reader.GetString(8);
                  matInitDist = reader.GetDecimal(9);
                  matRecTime = reader.GetString(10);
                  matRecDist = reader.GetDecimal(11);
                  matBuyMemo = reader.GetString(12);
                  userID = reader.GetInt32(13);
          }
         reader.Close();
     }
}  

miércoles, 20 de noviembre de 2013

SQL Server: Almacenar un campo encriptado

La idea es encriptar un campo de una tabla para poder almacenar un password. Para ello usaremos el tipo de datos varBinary y los comandos pwdencrypt y pwdcompare de SQL.

La idea es al usar el insert encriptar el campo de manera que no se podrá volver a desencriptar. Para poder comparar si una entrada pasada corresponde con una clave usaremos un select con el comando pwdcompare.

Supondremos una tabla que contendrá a los Usuarios, llamada Users de la siguiente manera:

tabla

Para grabar el dato usaremos el código:

save new user 

Mientras que para comprobar una clave dado un nombre de usuario usaremos:

checkLogin
pwdencrypt encripta usando una clave hash aleatoria y que no se guarda, lo que evita que podamos desenciptar la clave para verla. No podremos editarla, tendremos que establecer algún mecanismo para que cuando una clave se olvide haya que generar una clave nueva.

Visual Studio: GetSchemaTable para obtener el schema de una tabla

GetSchemaTable, devuelve el schema de una tabla dada, pero para sacar la información interesante del resto que sobra tendremos que interpretar los datos que se nos devuelven en forma de tabla.
Pongo aquí abajo el código de una forma de hacerlo que se me ha ocurrido, la idea es que al final se nos devuelva en un listBox algo parecido a esto:

Captura

El primer método devuelve el Schema según lo hace la función GetSchemaTable, y el segundo descompone la información:

     public DataTable readSchemaFromTable(string conString, string queryString)
        {
            using (SqlConnection connection = new SqlConnection(conString))
            {
                using (SqlCommand command = new SqlCommand(queryString, connection))
                {
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
                    {
                        DataTable table = reader.GetSchemaTable();
                        return table;
                    }
                }
            }            
        }
        private void readTableDataMenuItem_Click(object sender, EventArgs e)
        {
            //Leo datos de la tabla
            string conn = @”Integrated Security = true;
                            Initial catalog = ” + tBxCatalog.Text + @”;
                            Data Source = ” + tBxServer.Text + @”;”;
            string query = @”SELECT * FROM ” + tBxTable.Text;
            using (DataTable table = readDataToTable(conn, query))
            {
                //Conectamos al grid
                dBSrcSQL.DataSource = table;
                dGVTable.DataSource = dBSrcSQL;
            }
            //Leo el schema de la tabla
            using (DataTable schema = readSchemaFromTable(conn, query))
            {
                
                string cadena = “”;                
                string name =”";
                string dataType =”";
                string sizeData=”";
                string isKey=”";
                string isAuto = “”;
                //Pasamos los datos al list Box
                foreach (DataRow row in schema.Rows)
                {
                    foreach (DataColumn column in schema.Columns)
                    {
                        if (column.ColumnName == “ColumnName”)  
                            name = row[column].ToString();
                        else if (column.ColumnName == “DataTypeName”)
                                dataType = row[column].ToString();
                             else if (column.ColumnName == “ColumnSize”)
                                     sizeData=row[column].ToString();
                                  else if (column.ColumnName == “IsKey”)
                                        {
                                            if (row[column].ToString()==”True”) isKey = “isKey”;
                                            else isKey = “”;
                                            //isKey = row[column].ToString();
                                        }
                                        else if (column.ColumnName == “IsAutoIncrement”)
                                        {
                                            if (row[column].ToString()==”True”) isAuto = “isAutoIncrement”;
                                            else isAuto = “”;
                                        }
                            
                    }
                    cadena = name + ” ” + dataType + “(” + sizeData + “) ” + isKey + ” ” + isAuto;
                    lBxFields.Items.Add(cadena);
                    cadena = “”;
                }
            }
        }

martes, 19 de noviembre de 2013

Visual Studio C#: Cargar un excel en un DataGridView

La idea sería cargar un fichero de excel que contiene datos en una tabla para que se muestren en un DataViewGrid y así poder pasar a una base de datos SQL.

Para ello vamos a hacer uso de OLE DB, (Object Linking and Embeding for Data Bases), que no es mas que una tecnología propia de Microsofot para permitir el acceso a datos. OLE DB forma parte de la tecnología MDAC (Microsoft Data Access Componentes) de microsoft, que divide OLE DB en dos componentes principales, consumidores, y proveedores en referencia a como tratan los datos.
Usaremos así los proveedores OLE DB para acceder a cualquier tipo de dato, desde una hoja de excell a una base de datos SQL, Oracle, etc…
Para hacer nuestro ejemplo crearemos un simple projecto del tipo WFA (Windows Form Application), al que añadiremos cuatro componentes:
  • Un Data GridView que llamaremos: dGVExcel
  • Un Binding Source que llamaremos: dBSource
  • Un Text Box que llamaremos: txBxPath, y que en la propiedad Text tendrá el nombre del excell que queremos abrir, incluyendo el path de búsqueda, en mi caso C:\Users\uge\Desktop\excell1.xlsx
  • Y un botón, que al hacer click sobre el abrira el excel indicado en el TextBox mostrando los datos en el DataGridView.
Para poder hacer uso de OLE DB tenemos que añadir a los using del fichero:

using System.Data.OleDb;

Una vez hecho esto hacemos doble click sobre el botón para escribir el código correspondiente, que será como sigue:
Primero necesitamos crear un string que contenga la siguiente info:

1- La configuración de nuestro OLE DB Provider. Existen muchos tipos de proveedores implementados, así que tenemos que tener claro cual vamos a usar. En nuestro caso es una hoja de excel creada con office 2010, así que usaremos como provider Microsoft.ACE.OLEDB.12.0;

En esta página http://www.connectionstrings.com/ podéis acceder a información relativa a conexiones, no solo para OLE DB, sinó también para otras formas de conexion. Para excel podeis encontrarlas en http://www.connectionstrings.com/excel

2 – El DataSource del que obtendremos los datos, esto es, nuestro fichero de excel, que sacaremos del campo Text del objeto txBxPatx.

3 – Propiedades del fichero a abrir, es decir las Extended properties. en nuestro caso usaremos Excel 12.0 XMml; HDR=YES. Esta última indica por ejemplo que se añada la primera fila con los títulos de las columnas.

Añadimos al código:

         string connectionString = @”Provider=Microsoft.ACE.OLEDB.12.0;
                                         Data Source=” + txBxPath.Text + @”;
                                         Extended Properties=”"Excel 12.0 Xml;HDR=YES”"”;

Lo siguiente será preparar una consulta que extraiga los datos del provider, la consulta se hace en SQL y el nombre que incluimos será el de la Hoja dentro del excel de la que sacar los datos, en mi caso es Hoja1, y se le añadirá $ por detrás:

string query = “SELECT * FROM [Hoja1$]“;

Una vez tenemos el string que configura al provider, y la consulta que extrae los datos vamos a crear la conexión y extraer los datos hacia una tabla que también crearemos en el código:

//Creamos el provider
OleDbConnection excelConnection = new OleDbConnection(connectionString);
//Lo abrimos
excelConnection.Open();
//Creamos un Data Adapter que extraiga los datos necesarios(todos) del provider
OleDbDataAdapter data = new OleDbDataAdapter(query, excelConnection);
//Creamos una tabla
DataTable dTable = new DataTable();
//Usando el Data Adapter que tiene los datos seleccionados, rellenamos la tabla.
data.Fill(dTable);
// Conectamos el BindingSource con la Tabla.
dBSource.DataSource = dTable;
// Conectamos el DataGridView con el BindingSource
dGVExcel.DataSource = dBSource;

Si compilamos y ejecutamos el proyecto deberíamos obtener una pantalla similar a esta:

Capture

A partir de aquí ya podemos trabajar con los datos en nuestra aplicación VS.


martes, 30 de julio de 2013

Trasladar Prestashop de un servidor a otro

Para ello vamos a suponer que ambos hosts son servidores FTP.  Los pasos serían:

1º Conectamos por FTP al servidor de origen y mediante un cliente de FTP descargamos la carpeta correspondiente a nuestra tienda en el servidor. Esta acción tardará un rato, así que mientras se completa podemos hacer el siguiente paso.



2º realizamos una copia de seguridad de la base de datos. Para ello conectamos por web al servidor origen usando phpmyadmin y hacemos click en el panel lateral de la izqda sobre la BD a copiar.


Se muestra la BD y ahora pulsamos sobre la pestaña export


Ponemos el nombre y pulsamos Go, tendremos un fichero .sql que contendrá la copia de nuestra base de datos.



3º Conectamos contra el servidor de destino usando nuevamente phpmyadmin. Si no teníamos la BD creada anteriormente es el momento de hacerlo, para ello vamos a Bases de datos ponemos el nombre de la BD y pulsamos sobre crear. Una vez creada, o bién si ya la teníamos, pulsamos sobre la BD en el lateral izquierdo de la pantalla para seleccionarla, pulsamos sobre importar y escogemos el fichero anteriormente descargado, por último pulsamos continuar.


En este punto puede que obtengamos algún error debido a que detecte alguna clave primaria duplicada, etc... en ese caso borra la BD completamente y vuelve a crearla, después importa los datos.

4º Una vez el paso 1º se ha completado procederemos a subir la tienda al nuevo servidor de destino de la misma forma que la descargamos, es decir mediante el cliente FTP.

5º Por último accedemos al fichero settings.inc.php situado dentro de la carpeta config de prestashop y modificamos el valor de los campos _DB_USER y _DB_PASSWD



Algunas precauciones. Si has cambiado el dominio, debes acceder mediante phpMyAdmin y cambiar el valor de la variable ps_shop_url y acceder a la tabla ps_configuration, y cambiar el valor de las entradas PS_SHOP_DOMAIN y PS_SHOP_DOMAIN_SSL por el nuevo dominio a usar.

domingo, 30 de octubre de 2011

Crear/Conectar BD desde MySQL a Visual Studio

Dos herramientas:

  • MySQL 
  • Visual Studio 


Pasos:

1º usar MySQL workbench para crear el Schema, donde definiremos la tablas que lo componen.
2º sincronizar el modelo, lo cual permite que la base de datos sea visible al acceder a nuestro servidor de bases de datos.

3º Ya en Visual Studio ir al Server Explorer (menú View), y pulsar sobre connect database



 De esta manera ya podremos añadir a nuestros forms componentes que nos permitan acceder a la base de datos creada.