Page 1 of 1

Ayuda con MS-SQL

Posted: Thu Jan 12, 2023 6:15 am
by jorge.posadas
Grupo
Me pidieron hacer una pequeña aplicación que Inserte/Borre/Actualice/Consulte una base de datos de SQL (me refiero a SQL de Microsoft),
ya tengo el 80% de avance, PEROO se me presentó dos problemas:
1- ¿cómo puedo saber si mi aplicación ya se conectó a la base de datos, por el momento sino se conecta manda un error y luego de sale de la aplicación y yo deseo mandar un mensaje al usuario de NO SE PUDO CONECTAR A LA BASE DE DATOS, INTENTE MÁS TARDE

2- Cuando hago un INSERT o un UPDATE, puede que me dé un error cuando intento insertar o actualizar, ¿Cómo le hago para "cachar" ese error de que no puedo ejecutar la acción?, para que de igual manera mandarle un mensaje al usuario.

De antemano muchas gracias por la ayuda

Re: Ayuda con MS-SQL

Posted: Thu Jan 12, 2023 2:42 pm
by serge_girard
1) When you make the connection; check return value
2) idem

Serge

Re: Ayuda con MS-SQL

Posted: Sun Apr 16, 2023 3:50 pm
by edufloriv
Hola Jorge,

Si estás usando ADO para conectarte me parece que buscas una función del propio objeto que atrape el error (como lo tiene Mysql). Me parece que en algún momento busque lo mismo y no lo encontré, yo uso esta función:

Code: Select all

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
* FUNCION   : INICONEXION
* COMENTARIO: CONEXION AL SERVIDOR MS-SQL.
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

PROC INICONEXION

LOCAL oError
LOCAL cIPConect   := ""
LOCAL cIPAddress  := ""
LOCAL cIPUsuario  := ""
LOCAL cIPPassword := ""
LOCAL cIPCatalogo := ""

PUBLIC oConexion
PUBLIC INI_CONEX    := .F.

   IF FILE('c:\farmacom\ipdata.txt')
      aIpData := Txt2Array('c:\farmacom\ipdata.txt')
      cIpAddress  := UNCRYPT( aIpData[1] )
      cIpUsuario  := UNCRYPT( aIpData[2] )
      cIpPassword := UNCRYPT( aIpData[3] )
      cIpCatalogo := UNCRYPT( aIpData[4] )
   ELSE
      msginfo('no existe el archivo de conexión al servidor.')
      Win_InfoFarma.Release
   ENDIF

   cIPConect := "Provider=SQLOLEDB;Network Library=DBMSSOCN;Data Source=" + cIpAddress + ";Initial Catalog=" + cIpCatalogo +";User Id=" + cIPUsuario + ";Password=" + cIpPassword + ";"

   BEGIN SEQUENCE
      oConexion := TOleauto():New('ADODB.Connection')
      oConexion:ConnectionTimeout := 120
      oConexion:Open(cIPConect)
      INI_CONEX := .T.
   RECOVER USING oError
      MsgStop('No se pudo conectar al servidor SQL '+chr(13)+;
              'el servidor retornó el siguiente error: '+chr(13)+;
              oError:Operation+CRLF+oError:Description,"Conexión Ado")
      Win_InfoFarma.Release
   END SEQUENCE

RETURN
Llegué a esta conclusión porque el propio microsoft pone un ejemplo para vb:

Code: Select all

    Dim Conn1 As New adodb.Connection
    Dim Cmd1 As New adodb.Command
    Dim Errs1 As Errors
    Dim Rs1 As New adodb.Recordset
    
    Dim i As Integer
    Dim AccessConnect As String
    
    ' Error Handling Variables
    Dim errLoop As Error
    Dim strTmp As String
    
    AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
    "Dbq=nwind.mdb;" & _
    "DefaultDir=C:\program files\devstudio\vb;" & _
    "Uid=Admin;Pwd=;"
    
    '---------------------------
    ' Connection Object Methods
    '---------------------------
    
    On Error GoTo AdoError ' Full Error Handling which traverses
    ' Connection object
    
    ' Connection Open method #1: Open via ConnectionString Property
    Conn1.ConnectionString = AccessConnect
    Conn1.Open
    Conn1.Close
    Conn1.ConnectionString = ""
    
    ' Connection Open method #2: Open("[ODBC Connect String]","","")
    Conn1.Open AccessConnect
    Conn1.Close
    
    ' Connection Open method #3: Open("DSN","Uid","Pwd")
    
Siendo AdoError:

Code: Select all

 AdoError:
    i = 1
    On Error Resume Next
    
    ' Enumerate Errors collection and display properties of
    ' each Error object (if Errors Collection is filled out)
    Set Errs1 = Conn1.Errors
    For Each errLoop In Errs1
        With errLoop
            strTmp = strTmp & vbCrLf & "ADO Error # " & i & ":"
            strTmp = strTmp & vbCrLf & " ADO Error # " & .Number
            strTmp = strTmp & vbCrLf & " Description " & .Description
            strTmp = strTmp & vbCrLf & " Source " & .Source
            i = i + 1
        End With
    Next
Si logras averiguar algo distinto te agradeceré me lo hagas saber, ya que me interesa también poder realizar el "trapping" de conectividad al server.

Re: Ayuda con MS-SQL

Posted: Mon Apr 17, 2023 4:47 am
by jparada
Hola Jorge,
No sé si no entendí el requerimiento, no te vale con Try... Cath?

Saludos,
Javier