| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 20 Dic, 2007 8:51 am Asunto: Cómo saber si existe una tabla en Firebird |
|
|
¿Hay alguna forma de saber si una tabla está creda dentro de una base de datos Firebird? Cuando uso tablas Paradox me basta preguntar:
| Código: | if (!FileExists("Tabla.db")) ... |
pero no he encontardo algo equivalente para Firebird _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Ultima edición por Angel el Mie 26 Dic, 2007 10:06 am, editado 1 vez |
|
| Volver arriba |
|
 |
juanma Cmdr

Registrado: 17 Nov 2005Mensajes: 127Ubicación: Almeria - España
|
Publicado: Jue 20 Dic, 2007 10:51 am Asunto: |
|
|
Yo de momento estoy trabajando con los componentes ADO y a traves de ODBC, lo que me permite trabajar a la vez con multiples bases de datos (access mdb, informix, firebird, mysql, y postgress), para consultar las tablas utilizo el metodo que tiene el componente TADOConnetion:
GetTableNames(slTb, false);
slTb es un TStrinList que tiene que crear (TStringList * slTb = new ... y luego despues no olvidar el delete slTb)
(me imagino que en dbexpress esta tambien, ya que en un modulo que lo implementé apenes tuve q modificar codigo)
El codigo que indico es como lo utilizo yo pero hay muchas clases intermedias mias...
| Código: |
int __fastcall TfMain::CheckTables(XTDM *xDB, String cTC)
{
int nr = 0;
TStringList *slTb = new TStringList();
if (xDB->nTD == 4) { //Solo con postgresql
XRdSet * Rs = new XRdSet(DB);
if (Rs->OpenRs("pg_tables","schemaname = 'public'","","tablename")) {
while (Rs->NEof()) {
slTb->Add(Rs->FldAsStr(0));
Rs->Next();
}
}
delete Rs;
} else { //Resto DDBB
xDB->kCn->GetTableNames(slTb, false);
}
for (int i = 0; i <slTb>Count; i++) {
if (cTC.Pos(slTb->Strings[i])>0)
nr ++;
}
delete slTb;
return nr;
}
|
|
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 20 Dic, 2007 12:17 pm Asunto: |
|
|
En 'RDB$RELATIONS' tienes una lista de tablas de la base de datos, podrías hacer algo así:
| Código: | select count(RDB$RELATION_NAME) from RDB$RELATIONS
where RDB$RELATION_NAME = 'ANIMALS' |
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 20 Dic, 2007 12:37 pm Asunto: |
|
|
| _Leo escribió: | En 'RDB$RELATIONS' tienes una lista de tablas de la base de datos, podrías hacer algo así:
| Código: | select count(RDB$RELATION_NAME) from RDB$RELATIONS
where RDB$RELATION_NAME = 'ANIMALS' |
|
Perfecto, como siempre.
Gracias Leo _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 20 Dic, 2007 12:57 pm Asunto: |
|
|
También podrías usar algo como esto.. es similar al método que te ha puesto juanma, pero abreviándolo un poco:
| Código: | #include <memory>
template<class T> bool TableExists(T* database, String table)
{
std::auto_ptr<TStringList> sl(new TStringList);
database->GetTableNames(sl.get(), false);
return sl->IndexOf(table) != -1;
} |
Y para usarlo:
| Código: | // En el caso de que usemos IBX le pasamos un TIBDatabase
if (TableExists(IBDatabase1, "vendors"))
ShowMessage("Si existe");
// En el caso de dbExpress, TSQLConnection
if (TableExists(SQLConnection1, "vendors"))
ShowMessage("Si existe");
// Y en el caso del BDE, TDatabase
if (TableExists(Database1, "vendors"))
ShowMessage("Si existe"); |
Serviría para cualquier base de datos que tenga un componente de conexión como las anteriores y que tenga un método ‘GetTableNames’ con los mismos argumentos que las anteriores. |
|
| Volver arriba |
|
 |
|