Porque este sp no genera error en cliente?

03/06/2008 - 03:48 por CHAR72 | Informe spam
Hola compañeros! tenia un sp que debia generar cierto error por cierta
accion y resulta que mi aplicacion no obtenia dicho error, revise el sp
hasta que saque al comienzo algo parecido al contenido del sp que expongo
como ejemplo, y recien comenzo a mostrar los errores, lo probaba con vb6 y
ASP3.
Cree el sp de prueba y lo ejecutan del QA si genera el error pero desde vb6
o ASP3 no.

Y me quedo la pregunta porque, (despues de perder mucho tiempo)?

Saludos

Carlos



create proc sp_Prueba AS

SELECT * FROM USUARIOS
RAISERROR ('No muestra este error',16,1)

Preguntas similare

Leer las respuestas

#1 Jorge Gallego
04/06/2008 - 14:46 | Informe spam
Buenas tardes Carlos,

El problema es el siguiente, para OLE DB cada sentencia SQL devuelve un
estado, lo que significa que incluso si tu procedimiento almacenado genera
un error con RAISERROR, ADO no lo proporciona dentro de la colección Errors.

A menudo la solución es introducir la siguiente sentencia en la primera
línea del procedimiento almacenado:
SET NOCOUNT ON

En tu caso, no funcionará porque tienes una sentencia SELECT que te devuelve
resultados antes que el RAISERROR. Prueba por ejemplo a escribir antes el
RAISERROR y verás cómo si te devuelve el error.

'Código ejemplo procedimiento almacenado
ALTER PROCEDURE SP_ERROR
AS
SET NOCOUNT ON
RAISERROR ('ERROR A MOSTRAR',11,2)
SELECT campo FROM TABLA
GO

'Código ejemplo Visual Basic
Private Sub Command1_Click()
Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rcd As New ADODB.Recordset
On Error GoTo EndError:
With conn
.ConnectionString = "Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False;Initial Catalog=JORGE;Data
Source=DSJORGE"
.Open
End With
With cmd
.CommandType = adCmdStoredProc
.ActiveConnection = conn
.CommandText = "SP_ERROR"
Set rcd = .Execute
End With
rcd.MoveFirst
MsgBox "Primer registro: " & rcd!campo
conn.Close
Exit Sub
EndError:
Call ErrHandler(conn)
Resume Next
End Sub
Private Sub ErrHandler(adoConn As Object)
Dim adoErr As ADODB.error
For Each adoErr In adoConn.Errors
MsgBox adoErr.Description & vbCrLf & adoErr.Source, vbCritical, "Error
ADO", adoErr.HelpFile, adoErr.HelpContext
Next
adoConn.Errors.Clear
End Sub

Saludos

Jorge

"CHAR72" <char72[nos pa m]@gmail.com> wrote in message
news:
Hola compañeros! tenia un sp que debia generar cierto error por cierta
accion y resulta que mi aplicacion no obtenia dicho error, revise el sp
hasta que saque al comienzo algo parecido al contenido del sp que expongo
como ejemplo, y recien comenzo a mostrar los errores, lo probaba con vb6 y
ASP3.
Cree el sp de prueba y lo ejecutan del QA si genera el error pero desde
vb6 o ASP3 no.

Y me quedo la pregunta porque, (despues de perder mucho tiempo)?

Saludos

Carlos



create proc sp_Prueba AS

SELECT * FROM USUARIOS
RAISERROR ('No muestra este error',16,1)


Respuesta Responder a este mensaje
#2 CHAR72
05/06/2008 - 01:05 | Informe spam
Mmmm...

No entendi muy bien, pero si tu lo dices, asi sera! ya lo habia solucionado
pero me quedo la espina (bronca) de saber porque!

Salduso y gracias

Carlos

"Jorge Gallego" escribió en el mensaje
news:
Buenas tardes Carlos,

El problema es el siguiente, para OLE DB cada sentencia SQL devuelve un
estado, lo que significa que incluso si tu procedimiento almacenado genera
un error con RAISERROR, ADO no lo proporciona dentro de la colección
Errors.

A menudo la solución es introducir la siguiente sentencia en la primera
línea del procedimiento almacenado:
SET NOCOUNT ON

En tu caso, no funcionará porque tienes una sentencia SELECT que te
devuelve resultados antes que el RAISERROR. Prueba por ejemplo a escribir
antes el RAISERROR y verás cómo si te devuelve el error.

'Código ejemplo procedimiento almacenado
ALTER PROCEDURE SP_ERROR
AS
SET NOCOUNT ON
RAISERROR ('ERROR A MOSTRAR',11,2)
SELECT campo FROM TABLA
GO

'Código ejemplo Visual Basic
Private Sub Command1_Click()
Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rcd As New ADODB.Recordset
On Error GoTo EndError:
With conn
.ConnectionString = "Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist Security Info=False;Initial Catalog=JORGE;Data
Source=DSJORGE"
.Open
End With
With cmd
.CommandType = adCmdStoredProc
.ActiveConnection = conn
.CommandText = "SP_ERROR"
Set rcd = .Execute
End With
rcd.MoveFirst
MsgBox "Primer registro: " & rcd!campo
conn.Close
Exit Sub
EndError:
Call ErrHandler(conn)
Resume Next
End Sub
Private Sub ErrHandler(adoConn As Object)
Dim adoErr As ADODB.error
For Each adoErr In adoConn.Errors
MsgBox adoErr.Description & vbCrLf & adoErr.Source, vbCritical, "Error
ADO", adoErr.HelpFile, adoErr.HelpContext
Next
adoConn.Errors.Clear
End Sub

Saludos

Jorge

"CHAR72" <char72[nos pa m]@gmail.com> wrote in message
news:
Hola compañeros! tenia un sp que debia generar cierto error por cierta
accion y resulta que mi aplicacion no obtenia dicho error, revise el sp
hasta que saque al comienzo algo parecido al contenido del sp que expongo
como ejemplo, y recien comenzo a mostrar los errores, lo probaba con vb6
y ASP3.
Cree el sp de prueba y lo ejecutan del QA si genera el error pero desde
vb6 o ASP3 no.

Y me quedo la pregunta porque, (despues de perder mucho tiempo)?

Saludos

Carlos



create proc sp_Prueba AS

SELECT * FROM USUARIOS
RAISERROR ('No muestra este error',16,1)






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida