Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)
Mostrando entradas con la etiqueta base de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta base de datos. Mostrar todas las entradas

miércoles, 10 de febrero de 2016

Visualizar imágenes en Sql Server Management Studio con SSMSBoost

Estaba insertando imágenes a un base de datos en SQL Server 2012 con este código. Luego necesité ver si las imágenes se habían insertado bien. El Sql Server Management Studio no tiene una opción para visualizar imágenes y yo necesitaba algo simple y rápido, de usar y tirar.
Rebuscando en internet hallé un add-on que sí lo permite: el SSMSBoost, el cual tiene una versión Community gratuita que se puede usar para todo, sólo hay que reinstalarla cada tres meses.

Luego de instalarlo, y para poder ver las imágenes, se deben seguir los siguientes pasos:

1. Escoger la tabla con las imágenes y elegir la opción "Visualizar los primeros 1000 registros" haciendo clc derecho (en realidad se debe hacer un select).
2. Hacer click derecho al registro con la imagen que queremos ver, escoger la opción "Visualize as->Settings"


3. En la opción "Picture (any format)", el formato de imagen se coloca png, pues si se deja el valor por defecto (dat) el mspaint no lo va a reconocer:


Esto hace que mspant pueda abrir imágenes png, gif y jpg (no he probado con otros formatos, pero debe funcionar).

4. Luego de presionar el botón "Apply" o "Apply & Close", se escoge la opción "Visualize as->Picture (any format)".

Éste es el resultado:



sábado, 12 de octubre de 2013

Cómo importar datos con carácteres internacionales desde xls a SQLite

Tengo el siguiente archivo xls:


y quiero pasar los datos a una tabla en SQLite.
Después de probar distintas aplicaciones para SQLite, descubrí que ninguna importa directamente desde el formato xls (al menos no las que son gratuitas), pero sí importan desde el formato csv.

Tanto MSExcel como OpenOffice Calc pueden exportar datos al formato csv. Pero hay que tener en consideración un par de detalles para no perder los carácteres internacionales.

Para este ejemplo estoy usando OpenOffice Calc 3, pero el procedimiento es muy similar para MS Excel.

En "Guardar Como" elegimos el formato csv. Aparecerá la siguiente ventana:


Los datos deben exportarse con la codificación UTF8 y estar entrecomillados.

Para importar los datos a una base de datos en SQLite, el mejor programa que hallé es el Add-On para Firefox SQLite Manager.

Una vez instalado, lo ejecutamos desde Firefox -> Herramientas -> SQLite Manager (yo uso la versión 0.8.0) y cargamos nuestra base de datos, o la creamos.
Si la creamos no añadimos ninguna tabla, los datos importados crearán una automáticamente (mi base de datos se llama "Prueba01").



Luego vamos a la opción Base de Datos -> importar, o al ícono celeste con la flechita al costado del ícono de Abrir:



Elegimos la pestaña "CSV". Con el botón "Seleccionar Archivo" escogemos el archivo csv donde hemos exportado los datos desde xls. Las opciones a elegir son:
- Tipo de Codificación: UTF-8
- La primera fila contiene los nombres de las columnas
- Campos separados por coma
- Campos limitados por comillas dobles, siempre.
- Le cambié el nombre a la nueva tabla de "sample sales" a "sample_sales". Es mejor que las tablas no tengan nombres con espacios.

Presionamos OK. Aparecerá esta ventanita:



Oh! ¡Aquí hay algo qué resaltar!

En mi caso, como los datos de "CategoryID" se repiten, debo deseleccionar las opciones "Clave Primaria" "Auto Inc" y "única" si no botará error (y uno bastante feo). Estas opciones se seleccionan sólo si los datos correspondientes son únicos, no hay valores en blanco, y pueden convertirse a enteros.

En una bse de datos SQLIte es mejor no usar el formato DateTime. Lo mejor es guardar las fechas como texto, y recién realizar la conversión en nuestra aplicación. Así se evitan excepciones que se producen en el driver de SQLite y no en nuestro código (esta recomendación es de la misma web de SQLite, y la aprendí después de jugar un poco con el C# y aventar algunas hermosas excepciones de formato...).

Si todo sale bien, nuestros datos se verán así, ya dentro de la base de datos:


Si no se declara una clave primaria, el SQLite Manager nos creará una :D en este caso es "rowid". Y como se puede ver, los carácteres internacionales se conservan intactos.

Ya para trastear administrar la base de datos, prefiero usar el SQLite Studio.

miércoles, 20 de junio de 2012

VB6 error: no se pudo encontrar el archivo ISAM instalable

Me conectaba a una base de datos en Access 2003 usando un objeto ADODB.Connection llamado miDB, y un Recordset llamado miRS. Luego cerraba ambas conexiones haciendo:

If miDB.State <> adStateClosed Then miDB.Close
If miRS.State <> adStateClosed Then miRS.Close

miDB.Open miConnectionStringaDSN
miRS.Open "select * from Tabla", miDB

La propiedad State de ambas variables me dice si están cerradas o abiertas.

En resumen, una vez cerrada la conexión a la base de datos en Access, conectaba miDB a otra base de datos, a través de un DSN (ya creado mediante ODBC usando el aplicativo odbcad32.exe del Windows) y usando el formato de cadena de conexión para System DSN de la web de ConnectionStrings.

Y entonces me saltaba este error:


El mensaje es: "Error 80004005 en tiempo de ejecución: no se pudo encontrar el archivo ISAM instalable."

Parecía que me faltaba instalar algo, pero cuando realizaba primero la conexión por DSN (sin conectar miDB ó miRS a ninguna base de datos con anterioridad) la aplicación funcionaba de maravilla.

Deduje que no era problemas de instalación. Cuando conectaba miDB y miRS a una base de datos, cerraba ambos objetos e intentaba abrir una nueva conexión a DSN (¡y esto sólo ocurría al conectar por DSN!), "algo" se quedaba bloqueando un archivo, en algún lugar, y como la nueva conexión por DSN no podía abrirlo, consideraba que el archivo no existía y me lanzaba el error.

Entonces cambié mi código a:

If miDB.State <> adStateClosed Then miDB.Close
If miRS.State <> adStateClosed Then miRS.Close

Set miDB = Nothing
Set miRS = Nothing
Set miDB = New Connection
Set miRS = New Recordset

miDB.Open miConnectionStringaDSN
miRS.Open "select * from Tabla", miDB

Y resolví el problema, ya no aparece el error de ISAM instalable, y pude conectarme a mi DSN sin más inconvenientes, pues al anular ambos objetos (miDB y miRS) destruyo cualquier enlace que quede flotando, en algún lugar, perdido en las entrañas de mi Windows.

viernes, 9 de septiembre de 2011

Error en Crystal Reports: "Esta sección de Grupo no se puede imprimir..."

El mensaje completo es:
"Esta Seccion de grupo no se puede imprimir porque su campo de condicion no existe o no es valido. Dar formato a la seccion para elegir otro campo de condicion". Este mensaje de error aparece al querer ir a la pestaña "Vista Previa". Al presionar el botón Aceptar, aparece una página en blanco en lugar del reporte.


Busqué en Internet y no hallé cómo eliminar este error. Tampoco hallé nada útil en la Ayuda de Crystal Reports. Pero, después de probar un poco, dí yo misma con la solución.

Todos los reportes de Crystal Reports van conectados a una Base de Datos. Los grupos del reporte (por ejemplo un encabezado), están vinculadas a un campo específico de la Base de Datos. Esto es para que Crystal Reports sepa en qué orden mostrar los reportes con la data jalada desde la Base de Datos.
Este error se genera al cambiar la conexión a otra Base de Datos, eliminarla, cambiar a otra tabla, y cualquier situación en que el reporte no tenga cómo hallar el campo al que estaba vinculado.

Para solucionar esto, se debe ir al asistente de Base de Datos y configurar o crear la conexión, esto es necesario en caso de haberla eliminado:



Luego, en la pertaña Diseño, le hacemos click derecho al grupo que da problemas y elegimos la opción "Cambiar el Grupo":


Se nos abrirà la ventana que nos permitirá asignar un nuevo campo de condición:


Con esto, ya podemos ir a la Vista Previa de nuestro reporte :D

viernes, 11 de marzo de 2011

Obtener los nombres de las tablas y los nombres de sus esquemas de una BD en SQLServer desde VB6

Un día intentaba conectarme a AdventureWorks sample BD desde una app en Visual Basic 6.

Declaraba un recordset como sigue:

db.Open miConnectionString 'db es un objeto tipo Connection
Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
para poder listar todas sus tablas, usando un bucle.
Mi problema era que al ejecutar un query en SQL:

Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s"
rs.MoveNext
Loop

Me botaba error, ya que sólo tenía el nombre de la tabla. Para que funcionara, el query dentro de la variable "s" necessitaba también el nombre del esquema (Schema Name) y contruirlo todo de la siguiente forma:
Select * from Schema_Name.Tabla

Luego de mucho rebuscar en Google, hallé esta web
http://www.techrepublic.com/article/much-ado-about-field-properties/1045310

Donde explican lo que hace OpenSchema. Para mi caso, utilizo el SchemaID "AdSchemaTables", el cual incluye un filtro llamado "TABLE_SCHEMA".

Finalmente mi query queda:
Dim s as String

Do Until rs.EOF
s="Select * from " & rs!Table_Schema & "." & rs!Table_Name
' Hacer muchas muchas cosas con la variable "s" 
rs.MoveNext
Loop

Update!
Cómo saber si una tabla tiene un nombre de esquema asignado:
Basta añadir este código en el bucle ("miTabla" es una variable tipo String):

miTabla = vbNullString
miTabla = rs!TABLE_SCHEMA
    
If miTabla <> vbNullString Then
      miTabla = rs!TABLE_SCHEMA & "." & rs!TABLE_NAME
Else
      miTabla = rs!TABLE_NAME
End If 

martes, 28 de diciembre de 2010

Código fuente en VB6 para llenar un TreeView con las tablas, y otro con las vistas, de una Base de Datos en SQL Server 2005

El código fuente es muy parecido para hacer lo mismo en Oracle 10g 
De todos modos voy a poner el código fuente completo con la explicación:

En TreeView1 irán las tablas y en TreeView2 irán las vistas. "db" es un objeto tipo Connection, "nodx" es un objeto tipo Node, "rs" y "rs1" son Recordset, "count" es una variable tipo Integer. El estilo (propiedad Style) de los TreeViews es el número 7.


db.Open miConnectionString 'cadena de conexión a la BD en SQL Server

TreeView1.Nodes.Clear
Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
count = 0
Set nodx = TreeView1.Nodes.Add(, , "Root", "El título que le quiero poner")

Do Until rs.EOF
    count = count + 1
    Set nodx = TreeView1.Nodes.Add(1, tvwChild, "a" & str(count), rs!TABLE_NAME)
    rs.MoveNext
Loop
rs.Close

TreeView2.Nodes.Clear
rs1 = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))  ' <<== Acá
count = 0
Set nodx = TreeView2.Nodes.Add(, , "Root", "El título que le quiero poner")

Do Until rs1.EOF
    count = count + 1
    Set nodx = TreeView2.Nodes.Add(1, tvwChild, "a" & str(count), rs1!TABLE_NAME)
    rs1.MoveNext
Loop
rs1.Close

Si se intenta abrir el recordset rs1 con db.OpenSchema(adSchemaViews) nos dará error, y si se le coloca un On Error Resume Next, el bucle que recorre rs1 será infinito, pues como rs1 nunca se abrió, su propiedad EOF nunca será verdadera.

sábado, 23 de octubre de 2010

Código fuente en VB6 para llenar un TreeView con las tablas, y otro con las vistas, de una Base de Datos en Oracle

En TreeView1 irán las tablas y en TreeView2 irán las vistas. "db" es un objeto tipo Connection, "nodx" es un objeto tipo Node, "rs" y "rs1" son Recordset, "count" es una variable tipo Integer. El estilo (propiedad Style) de los TreeViews es el número 7.

db.Open miConnectionString 'cadena de conexión a la BD en Oracle

TreeView1.Nodes.Clear
Set rs = db.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "TABLE"))
count = 0
Set nodx = TreeView1.Nodes.Add(, , "Root", "El título que le quiero poner")

Do Until rs.EOF
    count = count + 1
    Set nodx = TreeView1.Nodes.Add(1, tvwChild, "a" & str(count), rs!TABLE_NAME)
    rs.MoveNext
Loop
rs.Close

TreeView2.Nodes.Clear
Set rs1 = db.OpenSchema(adSchemaViews)
count = 0
Set nodx = TreeView2.Nodes.Add(, , "Root", "El título que le quiero poner")

Do Until rs1.EOF
    count = count + 1
    Set nodx = TreeView2.Nodes.Add(1, tvwChild, "a" & str(count), rs1!TABLE_NAME)
    rs1.MoveNext
Loop
rs1.Close

lunes, 23 de agosto de 2010

Cómo averiguar los tipos de datos almacenados en cada campo de una base de datos

El código está en VB6:

' rs es el recorset ya enlazado a una base de datos

Select Case rs.Fields("un_campo").Type

Case adBigInt, adBinary, adDecimal, adDouble, adNumeric, adInteger, adLongVarBinary, adSingle, _
adSmallInt, adTinyInt, adUnsignedBigInt, adUnsignedInt, adUnsignedSmallInt, adUnsignedTinyInt, _
adVarNumeric, adVarBinary, adBoolean
        ' Hacer cosas con datos de tipo numérico
   
Case adBSTR, adChar, adLongVarChar, adLongVarWChar, adVarChar, adVarWChar, adWChar, _
adVariant
        ' Hacer cosas con datos de tipo texto o caracteres
   
Case adDate, adDBDate, adDBTime, adDBTimeStamp
        If IsDate(lo que hay en el campo) Then
               ' Esto funciona sólo para Access y SQL Server
        End If
        ' Para Oracle se debe usar la función TO_DATE(lo que hay en el campo, formato de fecha)
        ' el formato de fecha es DD/MM/YY por defecto.
Case Else
       ' El formato de imágenes para estas tres bases de datos es en VB6 el tipo AdLongVarBinary, 
       ' el cual tiene el valor de 205.
End Select