Saber si una tabla existe !

Hola, he buscado como lograr saber por código si una tabla existe en una base de datos sql server y he llegado hasta esto:
oConexion = CreateObject("ADODB.Connection")
With oConexion
.ConnectionString = "dsn=Profit_a;uid=sa;pwd=051069ds"
.Open
endwith
oTablaAuxiliar = oConexion.Execute ("Select 'InvTemp' from SysObjects where xType='U'",oConexion)
---- Hasta acá va bien ya que esa selección dentro de SySObjects es correcta, ahora, se me enrolla el trompo cuando trato de saber si oTablaAuxiliar tiene un valor que pueda decirme por ejemplo 0 =no existe, 1=existe...
He probado con los siguientes códigos y no logro dar con un valor que me identifique ello:
Acá en el objeto recordcount() siempre me da valor -1 este creada, con registros, o no exista la tabla, ¿dónde esta mi error? He probado otros métodos y tampoco me funcionan una pequeña mano me caería bien... Gracias.
IF (otablaAuxiliar.recordcount()=-1) then
* ** no existe la tabla.... Ahora a crearla...
oConexion.Execute("create table InvTemp(Cod char(10),Can char(8),existe char(1))",oConexion)
*** agrego un registro en para evitar errores posteriores del ADO
oConexion.Execute("insert into InvTemp values('2V','2','2')",oConexion)
ELSE
* *existe la tabla, ahora a borrar sus datos...
* oConexion.Execute("delete * ",oConexion)
MESSAGEBOX( "Ya existe la tabla InventarioTemporal ")
Endif
oconexion.close

1 respuesta

Respuesta
1
La verdad no entiendo por qué utilizas el control ADODB en Visual FoxPro y de igual forma no te recomiendo utilizarlo pues es un control que se utiliza más que todo en lenguajes de programación (tales como Visual Basic) y no en gestores de bases de datos, no obstante Visual FoxPro no tiene necesidad de utilizar este control ya que es un gestor de bases de datos y tiene funciones nativas para obtener información de bases de datos, en este orden de ideas aquí te planteo una solución:
Local lcConexion, lcTablas
Store Sqlstringconnect("dsn=Profit_a;uid=sa;pwd=051069ds") To lcConexion
If lcConexion < 0
  =Messagebox('No se puede conectar.', 16, 'Error de conexión SQL')
  Return
Endif
Store Sqltables(lcConexion, 'TABLE', 'MiCursor') To lcTablas
If lcTables = 1 Then
  Select MiCursor
  Locate For Upper(Table_name) == "INVTEMP"
  If !Found() Then
    =SqlExec(lcConexion,"create table InvTemp(Cod char(10),Can char(8),existe char(1))")
    =SqlExec(lcConexion,"insert into InvTemp values('2V','2','2')")
    Else
       =Messagebox( "Ya existe la tabla InventarioTemporal ") 
   Endif
Endif
= Sqldisconnect(lcConexion)
Esa sería la solución al inconveniente.
Gracias por tu aclaratoria. Vengo de otros lenguajes y tengo poca experiencia en Fox ( aunque fui asiduo programador de Clipper Summer 86, Hasta el 5.3 !)
La información que existe en la red es muy ambigua, pero con tu respuesta se por donde inclinarme.
Un millón. Gracias
Hola, probé el procedimiento y:
1. - linea 8
    If lcTables = 1 Then  es lcTablas , tonteria!
2.- Siempre me aparece que la tabla no existe comprobé el valor de lcTablas y es 1 no se que ocurre!
Me da la impresión que el problema esta en :
  Locate For Upper(Table_name) == "INVTEMP"  reviso el valor de Table_Name y me dice que es otra tabla (ajuste ), de hecho es la primera tabla, quizas habra que colocarlos en un bucle pora que busque en todas las tablas?
Gracias
Coloque un bucle para buscar la tabla y depurando se pasa por alto dicha tabla...
Local lcConexion, lcTablas
Store Sqlstringconnect("dsn=Profit_a;uid=sa;pwd=051069ds") To lcConexion
If lcConexion < 0
=Messagebox('No se puede conectar.', 16, 'Error de conexión SQL')
Return
Endif
Store Sqltables(lcConexion, 'TABLE', 'MiCursor') To lcTablas
If lcTablas = 1 Then
Select MiCursor
GO top
DO WHILE !EOF()
IF upper(Table_name)==UPPER("InvTemp") then
    =Messagebox( "YA existe la tabla InventarioTemporal ")
RETURN 0
else
SKIP +1
endif
ENDDO
=Messagebox( "NO existe la tabla InventarioTemporal ")
= Sqldisconnect(lcConexion)
RETURN 0
Solucionado.
Use SCAN:
SCAN FOR UPPER(table_name)=UPPER('InvTemp')
=Messagebox( "YA existe la tabla InventarioTemporal ")
= Sqldisconnect(lcConexion)
CLOSE TABLES all
RETURN 0
Endscan
Y listo...
Más sin embargo, no estoy seguro de que esa sea la manera correcta!
Me das pistas.
Pero funciono-
Esta es la solución definitiva:
Local lcConexion, lcTablas
Store Sqlstringconnect("dsn=Profit_a;uid=sa;pwd=051069ds") To lcConexion
If lcConexion < 0
  =Messagebox('No se puede conectar.', 16, 'Error de conexión SQL')
  Return
Endif
Store Sqltables(lcConexion, 'TABLE', 'MiCursor') To lcTablas
If lcTables = 1 Then
  Select MiCursor
  Locate For Upper(Alltrim(Table_name)) == "INVTEMP"
  If !Found() Then
    =SqlExec(lcConexion,"create table InvTemp(Cod char(10),Can char(8),existe char(1))")
    =SqlExec(lcConexion,"insert into InvTemp values('2V','2','2')")
    Else
       =Messagebox( "Ya existe la tabla InventarioTemporal ") 
   Endif
   Use in MiCursor
Endif
= Sqldisconnect(lcConexion)
La razón es porque locate es mucho más rápido que scan, el código ya está corregido, probado y comprobado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas