Principales respuestas
SCOPE_IDENTITY DEVUELVE FALTA PUNTO Y COMA

Pregunta
-
Buenas Tardes:
Tengo el siguiente procedimiento, y quiero recuperar el ID (autoincrement) del registro creado pero siempre me dice que falta el ; al final de la consulta, y lo he insertado en distintos lugares, pero algo estoy haciendo mal Agradecería vuestra colaboración.
Function NuevoElemento(ByVal Ruta As String) As Integer
Try
Conexión = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Ruta _
& "\AP20.accdb" & "; Jet OLEDB:DataBase Password=amfprogram")
Conexión.Open()
Consulta = "INSERT INTO Aparatos " _
& "(Electrodoméstico, Serie, Medida, Revisión, Caducidad, Documentación, Titular)" _
& " VALUES ('" _
& ArrayComp(1) & "', '" _
& ArrayComp(2) & "', '" _
& ArrayComp(3) & "', '" _
& ArrayComp(4) & "', '" _
& ArrayComp(5) & "', '" _
& ArrayComp(6) & "', '" _
& ArrayComp(7) & "') SCOPE_IDENTITY()"
CmdOle = New OleDb.OleDbCommand(Consulta, Conexión)
CmdOle.CommandType = CommandType.Text
CmdOle.ExecuteNonQuery()
Return Convert.ToInt32(CmdOle.ExecuteScalar())
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return 0
Finally
Conexión.Close()
End Try
End Function
Respuestas
-
Hola Angelnovato:
Lo primero es conocer tú escenario.
Pegas un código de visual basic en un foro de Sql Server, donde te conectas mediante oleDb a una base de datos de access, solicitando un identity de Sql server.
De la cadena de conexión entiendo que es access u otro sistema, pero no Sql Server
Conexión = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source
Scope_Identity es una función de SQL Server, que al menos, yo creo que acces no tiene. Es posible que te sirva @@Identity (pero no te lo puedo asegurar).
Lo que es seguro, es que deberías de usar parámetros, y no concatenar las cadenas directamente a las querys.
OleDb Parameters
https://docs.microsoft.com/es-es/dotnet/api/system.data.oledb.oledbparameter?view=netframework-4.8
https://stackoverflow.com/questions/23689213/adding-parameters-to-oledbconnection
Si es sql server, confirma, pero sino quizás, tengas más apoyo en:
Foro de Excel/Access
Foro Vb.Net
https://social.msdn.microsoft.com/forums/es-es/home?forum=vbes&filter=alltypes&sort=lastpostdesc
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
-
Hola Angelnovato:
si Sql Server es un lenguaje de programación para bases de datos desarrollado por Microsoft
No SQL Server es un sistema de gestión de base de datos. Simplificando, la base de datos, o el motor.
Tienes su propio lenguaje que es una basa en las especificaciones definidas en el lenguaje estructurado de consultas (SQL), que se llama TSQL
access es de Microsofot,
Si es de Microsoft, esotro sistema de gestión de bases de datos.
Conceptos básicos
(incongruente no?)
No para nada, son dos herramientas, que vienen de caminos diferentes y que se utilizan con fines diferentes.
entonces cual es el lenguaje de programación para Access?.
Para este motor el lenguaje es Access Sql.
Access Sql
Tanto TSQL como Access SQL, son dos lenguajes que parten de las definiciones que marca el estandar SQL, pero que han ido definiendo mejoras, potenciando todas las capacidades que se definen en el mismo.
Cada SGBD de base de datos, utiliza su propio lenguaje.
Y hay muchas cosas que son comunes y funcionan en ambos lenguajes, pero hay otras que no.
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
-
siempre me dice que falta el ; al final de la consulta
Aparte de lo que ya te han comentado en cuando a que el SCOPE_IDENTITY es para Transact-SQL (TSQL) y no para Access-SQL, incluso aunque estuvieses usando TSQL tu sentencia es incorrecta. Le falta un "select" antes del scope_identity:
Consulta = "INSERT INTO Aparatos (...) VALUES (...); SELECT SCOPE_IDENTITY();"
En TSQL esos dos ";" son opcionales, pero lo que no es opcional es el SELECT.
Ojo, insisto, esto es para SQL Server, no vale para el SQL de Access (que es otro producto distinto y usa un dialecto del lenguaje SQL que es ligeramente diferente).
Y si quieres recuperar el valor devuelto, tienes que usar ExecuteScalar en lugar de ExecuteNonQuery.
Dim identity as Integer = CType(CmdOle.ExecuteScalar(), Integer)
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
- Editado Alberto PoblacionMVP sábado, 18 de abril de 2020 7:53
Todas las respuestas
-
-
Hola Angelnovato:
Lo primero es conocer tú escenario.
Pegas un código de visual basic en un foro de Sql Server, donde te conectas mediante oleDb a una base de datos de access, solicitando un identity de Sql server.
De la cadena de conexión entiendo que es access u otro sistema, pero no Sql Server
Conexión = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source
Scope_Identity es una función de SQL Server, que al menos, yo creo que acces no tiene. Es posible que te sirva @@Identity (pero no te lo puedo asegurar).
Lo que es seguro, es que deberías de usar parámetros, y no concatenar las cadenas directamente a las querys.
OleDb Parameters
https://docs.microsoft.com/es-es/dotnet/api/system.data.oledb.oledbparameter?view=netframework-4.8
https://stackoverflow.com/questions/23689213/adding-parameters-to-oledbconnection
Si es sql server, confirma, pero sino quizás, tengas más apoyo en:
Foro de Excel/Access
Foro Vb.Net
https://social.msdn.microsoft.com/forums/es-es/home?forum=vbes&filter=alltypes&sort=lastpostdesc
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
-
Buenas Tardes.
Gracias por tu respuesta, pero entonces tengo términos equivocados, si Sql Server es un lenguaje de programación para bases de datos desarrollado por Microsoft, y access es de Microsofot, y no es lo mismo (incongruente no?) entonces cual es el lenguaje de programación para Access?.
uF! que lio.
-
Hola Angelnovato:
si Sql Server es un lenguaje de programación para bases de datos desarrollado por Microsoft
No SQL Server es un sistema de gestión de base de datos. Simplificando, la base de datos, o el motor.
Tienes su propio lenguaje que es una basa en las especificaciones definidas en el lenguaje estructurado de consultas (SQL), que se llama TSQL
access es de Microsofot,
Si es de Microsoft, esotro sistema de gestión de bases de datos.
Conceptos básicos
(incongruente no?)
No para nada, son dos herramientas, que vienen de caminos diferentes y que se utilizan con fines diferentes.
entonces cual es el lenguaje de programación para Access?.
Para este motor el lenguaje es Access Sql.
Access Sql
Tanto TSQL como Access SQL, son dos lenguajes que parten de las definiciones que marca el estandar SQL, pero que han ido definiendo mejoras, potenciando todas las capacidades que se definen en el mismo.
Cada SGBD de base de datos, utiliza su propio lenguaje.
Y hay muchas cosas que son comunes y funcionan en ambos lenguajes, pero hay otras que no.
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
-
siempre me dice que falta el ; al final de la consulta
Aparte de lo que ya te han comentado en cuando a que el SCOPE_IDENTITY es para Transact-SQL (TSQL) y no para Access-SQL, incluso aunque estuvieses usando TSQL tu sentencia es incorrecta. Le falta un "select" antes del scope_identity:
Consulta = "INSERT INTO Aparatos (...) VALUES (...); SELECT SCOPE_IDENTITY();"
En TSQL esos dos ";" son opcionales, pero lo que no es opcional es el SELECT.
Ojo, insisto, esto es para SQL Server, no vale para el SQL de Access (que es otro producto distinto y usa un dialecto del lenguaje SQL que es ligeramente diferente).
Y si quieres recuperar el valor devuelto, tienes que usar ExecuteScalar en lugar de ExecuteNonQuery.
Dim identity as Integer = CType(CmdOle.ExecuteScalar(), Integer)
- Marcado como respuesta Angelnovato sábado, 18 de abril de 2020 7:53
- Editado Alberto PoblacionMVP sábado, 18 de abril de 2020 7:53
-
-
-