Hoy se ha cerrado la encuesta que había en el Blog referente al SGBD que la gente usa en sus programas.
Me ha servido un poco, para probar el plugin de encuestas, pero también (aunque los votantes no han sido muchos en esta «prueba piloto») me ha sorprendido un poco el resultado.
Sinceramente no pensé que SQL Server apareciera tan arriba. Personalmente trabajo con ella y me gusta mucho, pero la gente suele ser reacia en los foros a utilizarla (o eso me parecía a mi desprender de los comentarios que leía).
También creo que es una solución más a nivel profesional, mientras que me da la impresión que Firebird, puede ser más una elección personal. Eso explicaría que la gente la use, aunque no les acabe de gustar (por obligación) ;-D
Un saludo.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Utilizando ADO se puede acceder a casi toda la información de la Base de Datos, Tablas y Columnas, pero no a toda. En el caso de las Bases de datos de Access, por ejemplo, la propiedad descripción, que utilizamos para añadir un texto descriptivo a las columnas de las tablas, no es accesible.
Para obtenerla, hace falta acceder directamente a la información del «catálogo» utiliando ADOX. Para poder utilizar ADOX, lo primero que debemos hacer es importar la librería a en Delphi;
Esto se puede hacer desde el menú de: Proyect/Import Type Library.
La librería en concreto es la llamada «Microsoft ADO Ext. for DDL and Security» y proceso paso a paso, podéis verlo es esta página de Zarko Gajic.
Una vez importada la librería, basta con abrir la Base de Datos, acceder a una tabla y a un columna; A partir de ahí ya tenemos todos los datos(propiedades) referentes a esa columna.
El código es sencillo (basta con tener un formulario con un memo (Memo1) y un botón (button1)):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| procedure TForm1.Button2Click(Sender: TObject);
const
DB_CONNECTION='Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=%s';
DATABASENAME = 'c:\Archivos de ' +
'programa\Archivos comunes\Borland Shared\Data' +
'\dbdemos.mdb';
var
i, j:Integer;
Con:OleVariant;
fCatalog:Catalog;
Column: _Column;
Table:_Table;
Str1, Str2:string;
begin
// Limpiar la salida
Memo1.Lines.Clear;
// Conectar con la Base de Datos
Con := CreateOleObject('ADODB.Connection');
// Abrir
Con.Open(Format(DB_CONNECTION,[DATABASENAME]));
// proteccion
try
// Acceder a la Base de Datos
fCatalog := CoCatalog.Create;
fCatalog._Set_ActiveConnection(Con);
// Acceder a la tabla de empleados
Table := fCatalog.Tables['employee'];
// recorrer las columnas
for i := 0 to (Table.Columns.Count - 1) do begin
// Acceder a la columna
Column := Table.Columns[i];
// Datos de columna
Memo1.Lines.Add(' ');
Memo1.Lines.Add(Format('Columna: %s',[Column.Name]));
Memo1.Lines.Add('---------------------------------');
Memo1.Lines.Add(Format(' Tamaño: %d',[Column.DefinedSize]));
Memo1.Lines.Add(Format(' Precisión: %d',[Column.Precision]));
// recorrer las propiedades de la columna
for j := 0 to (Column.Properties.Count - 1) do begin
// Cada propiedad, Nombre y valor
Str1 := Column.Properties[j].Name;
Str2 := Column.Properties[j].Value;
// Saltamos las propiedades Jet...
if (Length(Str1) > 0) then begin
// Saltar las Jet
if (Str1[1] <> 'J') then begin
Memo1.Lines.Add(Format(' %s: %s',[Str1, Str2]))
end; //if
end; //if
end; // for
end; // for
finally
// Liberar y cerrar
Column := nil;
Table := nil;
fCatalog := nil;
Con.Close;
end;
end; |
procedure TForm1.Button2Click(Sender: TObject);
const
DB_CONNECTION='Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source=%s';
DATABASENAME = 'c:\Archivos de ' +
'programa\Archivos comunes\Borland Shared\Data' +
'\dbdemos.mdb';
var
i, j:Integer;
Con:OleVariant;
fCatalog:Catalog;
Column: _Column;
Table:_Table;
Str1, Str2:string;
begin
// Limpiar la salida
Memo1.Lines.Clear;
// Conectar con la Base de Datos
Con := CreateOleObject('ADODB.Connection');
// Abrir
Con.Open(Format(DB_CONNECTION,[DATABASENAME]));
// proteccion
try
// Acceder a la Base de Datos
fCatalog := CoCatalog.Create;
fCatalog._Set_ActiveConnection(Con);
// Acceder a la tabla de empleados
Table := fCatalog.Tables['employee'];
// recorrer las columnas
for i := 0 to (Table.Columns.Count - 1) do begin
// Acceder a la columna
Column := Table.Columns[i];
// Datos de columna
Memo1.Lines.Add(' ');
Memo1.Lines.Add(Format('Columna: %s',[Column.Name]));
Memo1.Lines.Add('---------------------------------');
Memo1.Lines.Add(Format(' Tamaño: %d',[Column.DefinedSize]));
Memo1.Lines.Add(Format(' Precisión: %d',[Column.Precision]));
// recorrer las propiedades de la columna
for j := 0 to (Column.Properties.Count - 1) do begin
// Cada propiedad, Nombre y valor
Str1 := Column.Properties[j].Name;
Str2 := Column.Properties[j].Value;
// Saltamos las propiedades Jet...
if (Length(Str1) > 0) then begin
// Saltar las Jet
if (Str1[1] <> 'J') then begin
Memo1.Lines.Add(Format(' %s: %s',[Str1, Str2]))
end; //if
end; //if
end; // for
end; // for
finally
// Liberar y cerrar
Column := nil;
Table := nil;
fCatalog := nil;
Con.Close;
end;
end;
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
En este ejemplo vamos a crear un par de campos de tipo String, una clave primaria y un campo de tipo entero y Autonumérico (Autoincremental) para probar las propiedades de ADOX:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| var
Catalog : _Catalog;
Table : _Table;
BaseName : String;
DS : String;
col : _Column;
key : _Key;
begin
// Nombre de la Base de Datos
BaseName := 'C:\Temp\MiBaseDatos.mdb';
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog'))
as _Catalog;
// Set the Connection String
DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
// Check if we already have such a file and delete it
if FileExists(BaseName) Then begin
DeleteFile(BaseName);
end;
// Create new Access database
Catalog.Create(DS);
// Create a Table Object
Table := CreateCOMObject(StringToGUID('ADOX.Table')) as _Table;
// Set the name of a table
Table.Name := 'MiTabla';
// Append Table into the base
Catalog.Tables.Append(Table);
// Now add two columns (fields) into the table
// Both are Text fields up to 128 characters
Table.Columns.Append('Nombre', adVarWChar, 128);
Table.Columns.Append('Apellido', adVarWChar, 128);
// Creamos el objeto columna para el autoIncremental
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'Auntoincremental';
// Tipo del campo
col.Type_ := adInteger;
// Asignamos que es un AutoIncremental
col.Properties['AutoIncrement'].Value := True;
// Añadimos la columna
Table.Columns.Append(col, adInteger, col.DefinedSize);
// Columna para la clave primaria
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'ClavePrimaria';
col.Type_ := adInteger;
// Añadirla
Table.Columns.Append(col, adInteger, col.DefinedSize);
// Creamos la clave primaria
Key := CoKey.Create;
Key.Name := 'ClavePrimaria';
Key.Type_ := adKeyPrimary;
// Columna que forma parte de la PK
Key.Columns.Append('ClavePrimaria', adInteger, 0 );
// Añadirla a la tabla
Table.Keys.Append(Key, 0, EmptyParam, Unassigned, Unassigned); |
var
Catalog : _Catalog;
Table : _Table;
BaseName : String;
DS : String;
col : _Column;
key : _Key;
begin
// Nombre de la Base de Datos
BaseName := 'C:\Temp\MiBaseDatos.mdb';
// Create a Catalog Object
Catalog := CreateCOMObject(StringToGUID('ADOX.Catalog'))
as _Catalog;
// Set the Connection String
DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
// Check if we already have such a file and delete it
if FileExists(BaseName) Then begin
DeleteFile(BaseName);
end;
// Create new Access database
Catalog.Create(DS);
// Create a Table Object
Table := CreateCOMObject(StringToGUID('ADOX.Table')) as _Table;
// Set the name of a table
Table.Name := 'MiTabla';
// Append Table into the base
Catalog.Tables.Append(Table);
// Now add two columns (fields) into the table
// Both are Text fields up to 128 characters
Table.Columns.Append('Nombre', adVarWChar, 128);
Table.Columns.Append('Apellido', adVarWChar, 128);
// Creamos el objeto columna para el autoIncremental
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'Auntoincremental';
// Tipo del campo
col.Type_ := adInteger;
// Asignamos que es un AutoIncremental
col.Properties['AutoIncrement'].Value := True;
// Añadimos la columna
Table.Columns.Append(col, adInteger, col.DefinedSize);
// Columna para la clave primaria
col := CoColumn.Create;
// BD a la que pertenece
col.ParentCatalog := Catalog;
col.Name := 'ClavePrimaria';
col.Type_ := adInteger;
// Añadirla
Table.Columns.Append(col, adInteger, col.DefinedSize);
// Creamos la clave primaria
Key := CoKey.Create;
Key.Name := 'ClavePrimaria';
Key.Type_ := adKeyPrimary;
// Columna que forma parte de la PK
Key.Columns.Append('ClavePrimaria', adInteger, 0 );
// Añadirla a la tabla
Table.Keys.Append(Key, 0, EmptyParam, Unassigned, Unassigned);
Primero se crea la tabla, posteriormente se crean los objetos columna (coColumn) y se modifican sus propiedades, para finalmente añadirlo a la tabla. Finalmente se crea el objeto coKey para definir la clave primaria, se añade la columna que la compone y este objeto se añade también a la tabla creada.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…