Entradas

Mostrando las entradas de 2019

Notas C# Oracle

Paquete Nuget
Install-Package Oracle.ManagedDataAccess
Referencias
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
Connection String
Estructura del datasource: tnsnames.ora, su ubicación varía dependiendo del tipo de instalación, éste ejemplo es de la versión Express (gratuita).
Data Source=localhost:1521/XE;User Id=usuario;password=clave
Importante:

Las instrucciones de SQL NO deben de terminar con ;

Notas SQL de Oracle

Descargar Oracle Express

Acceder a la base de datos vía CMD (Credenciales implícitas)
sqlplus  / as sysdba

Acceder a la base de datos vía CMD (Credenciales implícitas)
sqlplus  usuario/clave

Versión del servidor
SELECT * FROM v$version;

Mostrar todos los usuarios
SELECT * FROM dba_users;

Cambiar Contraseña
ALTER USER cuenta IDENTIFIED BY "clave";

Desbloquear cuenta
ALTER USER cuenta ACCOUNT UNLOCK;

Exportar consulta a archivo de texto
SET TRIMSPOOL ON
SET LINESIZE 32000;
SET PAGESIZE 1000;

SPOOL C:\TEMP\prueba3.txt
SELECT * FROM dba_users;
SPOOL OFF;

Dar permiso de ejectuar la instrucción DBMS_CRYPTO en Oracle 11
GRANT EXECUTE ON SYS.DBMS_CRYPTO TO usuario

Instalar (Ubuntu) Subsistema de Linux en Windows 10

Requisitos

Para poder instalar el Subsistema de Linux para Windows (Windows Subsystem for Linux, WSL), se necesita tener Windows 10 con la versión de Compilación (build) superior a 1621.

Para verificar si nuestro sistema es compatible, se puede consultar usando siguiente comando en la consola de PowerShell:
[System.Environment]::OSVersion.Version


ó desde el menú Ayuda > Acerca de ... de cualquier accesorio de Windows (tal como el bloc de notas).

Instalación

En una consola de PowerShell como administrador, introducimos el siguiente comando, para habilitar e instalar la característica de WSL:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Opcional: Al terminar el proceso de instalación, en la consola nos pedirá que reiniciemos la máquina; guardamos todo lo que tengamos pendiente y al estar listos, tecleamos en la consola "Y" y damos Enter para reiniciar la máquina, de lo contrario, oprimimos "N" para el siguiente paso.


Instalación desde la Tienda de Windows

Las versiones de linux que se pueden instalar están disponibles en la tienda de Windows, en el caso de Ubuntu se ecnuentra la siguiente dirección: Ubuntu Windows Store

Instalación Manual (Offline)

En caso de no poder descargar de la Tienda de Windows, se puede obtener un archivo de instalación del siguiente enlace:  https://docs.microsoft.com/en-us/windows/wsl/install-manual#downloading-distros

Descargamos, abrimos el archivo, hacemos click en instalar y esperamos a que se instale.


Configuración

Al terminar de instalar la aplicación, se nos pedirá ingresar un nombre usuario (Root) para Linux  (que no afecta ni se relaciona con el nombre de usuario de Windows), además de una contraseña.


Finalmente, actualizamos con el clásico
sudo apt update
sudo apt upgrade -y

Referencias


Generar archivos de Excel en C#, fácilmente con EPPlus

Limitaciones

  • No se pueden evaluar fórmulas
  • Únicamente el estilo "Normal" está definido (Hay que definir el estilo de "Contabilidad", para poder usar el formato de moneda).

Páquete de Nuget

Install-Package EPPlus

Referencias

using System.IO;
using System.Drawing;

using OfficeOpenXml;
using OfficeOpenXml.Style;
using OfficeOpenXml.Style.XmlAccess;

Código

FileStream fs = new FileStream("prueba.xlsx", FileMode.Create);
ExcelPackage Excel = new ExcelPackage(fs);

/* Creación del estilo. */
Excel.Workbook.Styles.CreateNamedStyle("Moneda");
ExcelNamedStyleXml moneda = Excel.Workbook.Styles.NamedStyles[1];// 0 = Normal, 1 (El que acabamos de agregar).

moneda.Style.Numberformat.Format = "_-$* #,##0.00_-;-$* #,##0.00_-;_-$* \"-\"??_-;_-@_-";
moneda.Style.Fill.PatternType = ExcelFillStyle.Solid;
moneda.Style.Fill.BackgroundColor.SetColor(Color.Yellow);

/* Creación de hoja de trabajo. */
Excel.Workbook.Worksheets.Add("Hoja de Prueba 1");
ExcelWorksheet hoja = Excel.Workbook.Worksheets["Hoja de Prueba 1"];

/* Num Caracteres + 1.29 de Margen.
Los índices de columna empiezan desde 1. */
hoja.Column(1).Width = 11.29f;
            
ExcelRange rango = hoja.Cells["A1"];

rango.Value = 1.0M;
rango.StyleName = "Moneda";

Excel.Save();
            
// No estoy seguro de ésta parte, pero mejor cerramos el stream de archivo.
fs.Close();
fs.Dispose();
            
Excel.Dispose();

Referencias

Adjuntar archivos de texto a otro archivo de texto

Tengo una gran cantidad de archivos SQL generados (uno por tabla), por un programa de copia de seguridad que hice, elimino los archivos que no necesito y los junto en un archivo para llenar mi Base de Datos.

El problema: No quiero abrir archivo por archivo e ir copiando y pegando las líneas de código. ¿La Solución? , nuestro viejo amigo redireccionamiento de MS-DOS…


@ECHO OFF
REM Borrando archivo de destino
DEL master.txt

REM Adjuntando el contenido de cada archivo SQL a master.txt

REM Omito usar la extensión .sql para evitar que archivo generado
REM se incluya en el DIR .

REM *Nota Mental* ECHO. da un salto de línea...

FOR /f %%f IN ('dir /b *.sql') DO (
 TYPE %%f >> master.txt
 ECHO ; >> master.txt
)

PAUSE

Código de prueba de base de datos (MySQL) en PHP


Lo mínimo necesario para probar los datos de conexión a una base de datos de MySQL (o MariaDB), con su consulta de prueba, pobremente optimizada.

Código

<?php
$mysqli = new mysqli("localhost","usuario","clave", "base_de_datos");

/* comprobar la conexión */
if ($mysqli->connect_errno) {
 printf("Falló la conexión: %s\n", $mysqli->connect_error);
 exit();
}else{
 print("Conexión a Base de Datos Correcta.\n\n");
}

if($resultado = $mysqli->query("SELECT NOW() AS Fecha;"))
{
 print '<pre>';
 while ($fila = $resultado->fetch_assoc()) 
 {
  print_r($fila);
 }
 $resultado->free();
 print '</pre>';
}else{
 printf("ERROR: %s",mysqli_error($mysqli));
}

$mysqli->close();
?> 

Rotar una imágen basándose en los metadados EXIF (C#)

Mientras estaba escribiendo un generador de miniaturas para un sistema, noté que algunas imágenes generadas no coincidían con el original, y oh sorpresa!, todas las imágenes tenían algo en común: fueron tomadas con celular....

Al abrir las imágenes con Microsoft Paint (Versión XP), pude constatar que las imágenes generadas coincidían con las miniaturas, a pesar que el explorador de archivos y el navegador web decían lo contrario, ¿el culpable? ¡Metadatos!.

Los metadatos son datos adicionales incrustados en un archivo, generalmente al final del mismo; y su función es proporcionar información adicional, que en mi caso es orientación de la imagen.

Existen 8 distintos tipos de Orientación:


1 - Horizontal (normal) - RotateNoneFlipNone

2 - Mirror horizontal - Rotate180FlipY

3 - Rotate 180 - Rotate180FlipNone


4 - Mirror vertical - RotateNoneFlipY

5 - Mirror horizontal and rotate 270 CW - Rotate270FlipY

6 - Rotate 90 CW - Rotate90FlipNone

7 - Mirror horizontal and rotate 90 CW - Rotate90FlipY

8 - Rotate 270 CW - Rotate270FlipNone

Referencias

using System.Drawing;
using System.Drawing.Imaging;

Código

RotateFlipType rotation = RotateFlipType.RotateNoneFlipNone;
            
foreach (PropertyItem item in bitmap.PropertyItems)
{
 if (item.Id == 0x0112)
 {
  int orientation = BitConverter.ToInt16(item.Value, 0);
  switch (orientation)
  {
   case 2: rotation = RotateFlipType.Rotate180FlipY; break;
   case 3: rotation = RotateFlipType.Rotate180FlipNone; break;
   case 4: rotation = RotateFlipType.RotateNoneFlipY; break;
   case 5: rotation = RotateFlipType.Rotate270FlipY; break;
   case 6: rotation = RotateFlipType.Rotate90FlipNone; break;
   case 7: rotation = RotateFlipType.Rotate90FlipY; break;
   case 8: rotation = RotateFlipType.Rotate270FlipNone; break;
  }
  break;
 }
}
image.RotateFlip(rotation); 

Fuentes