PDA

Ver la Versión Completa : Comprobar si existe una BD


darkamerico
26-10-2014, 16:07:00
saludos amigos, estoy realizando una aplicación usando la librería UNIDAC (de devart) sobre Delphi 2010, y requiero comprobar si una base de datos existe a fin de evitar que la aplicación colapse y se cierre. Agradezco cualquier ayuda que puedan darme.

Atte
Americo

FGarcia
26-10-2014, 19:45:31
Tal vez te falto decir que BD estas usando y en que sistema operativo y su versión y tipo

Neftali [Germán.Estévez]
27-10-2014, 11:31:37
Depende de si la Base de Datos es de "tipo fichero" o de "otro tipo".
Siempre puedes intentar la conexión y capturar el correspondiente error.

darkamerico
27-10-2014, 17:24:39
Estoy usando un servidor de bd mysql.

Neftali [Germán.Estévez]
27-10-2014, 17:36:31
Utiliza Open/Connect con un Try..Except.

roman
27-10-2014, 18:21:35
Prácticamente cualquier biblioteca de conexión a bases de datos incluirá métodos para listar las bases y tablas de un servidor. Unidac no es la excepción:


TCustomDAConnection.GetDatabaseNames (http://www.devart.com/unidac/docs/index.html?devart_dac_tcustomdaconnection_getdatabasenames%28borland_vcl_tstrings%29.htm)
TCustomDAConnection.GetTableNames (http://www.devart.com/unidac/docs/devart_dac_tcustomdaconnection_gettablenames(borland_vcl_tstringssystem_booleansystem_boolean).htm)


Así que, sin importar el motor específico, puedes usar estos métodos y buscar en la lista (TStrings) que te devuelven, la base o tabla en cuestión.

Otra opción, específica de MySQL, es usar una consulta del tipo:


show databases like "nombre de la base"


y ver si te devuelve algún regitro o no.

// Saludos

camiz
27-10-2014, 18:31:08
Hola darkamerico,
Prueba con esto yo lo uso así en PostgreSQL, solo cambia algunas cositas y devería funcionar, suerte...


var
List: TStringList;
i :string;
posicion :integer;
comprobacion :boolean;
begin
with UniConnection1 do
begin
Connected := False;
ProviderName := 'PostgreSQL';
UserName := 'postgres';
Password := '1234';
Server := '127.0.0.1';
Port := 5432;
LoginPrompt := False;
List := TStringList.Create;
try
GetDatabaseNames(List);
posicion := 0;
List.Sort;
comprobacion := List.Find('MyBasedeDatos',posicion);
if comprobacion = True then
MessageBox(0,'Base de datos encontrada','Mensaje', MB_ICONINFORMATION or MB_OK)
else
MessageBox(0,'La base de datos indicada no existe','Mensaje', MB_ICONSTOP or MB_OK);
finally
List.Free;
end;
end;

darkamerico
04-11-2014, 02:37:29
Gracias a todos por responder, lo que estoy implementando son unos indicadores gráficos en el formulario de login que me indican :
1. Si el servidor mysql esta On/Off

Lo que quería era agregar otro indicador grafico que este en verde si la BD se encuentra presente en el servidor mysql. Por eso, mi preocupación era de que forma utilizar las funciones de verificación en el OnActivate() del formulario de Login, como lo hice con el primer indicador:

procedure TForm1.FormActivate(Sender: TObject);
begin
if(TestMySQLServer('127.0.0.1',3306)) then
statusServer.Active:=true
else
statusServer.Active:=false;
end;

donde TestMySQLServer es:

function TForm1.TestMySQLServer(ipAddressStr:AnsiString; dwPort : Word):boolean;
var
client : sockaddr_in;
sock : Integer;
ret : Integer;
wsdata : WSAData;

begin
Result:=False;
ret := WSAStartup($0002, wsdata); //Inicializa Winsock
if ret<>0 then exit;
try
client.sin_family := AF_INET; //Establece el protocolo a usar en este caso (IPv4)
client.sin_port := htons(dwPort);
client.sin_addr.s_addr := inet_addr(PAnsiChar(ipAddressStr));
sock :=socket(AF_INET, SOCK_STREAM, 0); //crea un socket
Result:=connect(sock,client,SizeOf(client))=0; //Estable conexión con un socket
finally
WSACleanup;
end;
end;

Si trato de usar un método de UniConnection es posible que aun no haya sido creado en ese momento y obtenga error.

Agradeceria luces en este sentido. Muchas gracias.