Foros del Web » Programando para Internet » ASP Clásico »

Concurrencia al crear una Id

Estas en el tema de Concurrencia al crear una Id en el foro de ASP Clásico en Foros del Web. He visto en el apartado de "Biblioteca de Clases,Funciones y Sub-rutinas." la siguiente codigo Código: Function GetMyMaxId(table, field) Set rsGetMyMaxId = Server.CreateObject("ADODB.Recordset") strSQLGetMyMaxId = "SELECT ...
  #1 (permalink)  
Antiguo 04/04/2006, 02:45
 
Fecha de Ingreso: mayo-2005
Mensajes: 36
Antigüedad: 19 años, 1 mes
Puntos: 0
Concurrencia al crear una Id

He visto en el apartado de "Biblioteca de Clases,Funciones y Sub-rutinas." la siguiente codigo

Código:
Function GetMyMaxId(table, field)
	Set rsGetMyMaxId = Server.CreateObject("ADODB.Recordset")
	strSQLGetMyMaxId = "SELECT MAX(" & field & ") AS myMax FROM " & table
	rsGetMyMaxId.Open strSQLGetMyMaxId, <B>ObjConn</B>, 3, 3
	fnctMyMaxId = rsGetMyMaxId("myMax")
	If IsNull(fnctMyMaxId) Then
		fnctMyMaxId = 0
	End If
	rsGetMyMaxId.Close
	Set rsGetMyMaxId = Nothing
	GetMyMaxId = fnctMyMaxId
End Function
Esta muy bien para obtener, por ejemplo, la id de una tabla. Pero que pasaria si dos usuarios entrasen a la vez y obtendrian el mismo Id. Tengo entendido que en .NET hay alguna manera de controlar esto pero en ASP 3.0 no lo se. ¿Sabeis de alguna forma de controlarlo?
  #2 (permalink)  
Antiguo 04/04/2006, 08:00
Avatar de Muzztein  
Fecha de Ingreso: agosto-2002
Ubicación: Hangar 18
Mensajes: 1.703
Antigüedad: 21 años, 9 meses
Puntos: 16
es muy pero muy poco proable que eso ocurra.

ahora si tu entras en paranoia. Lo mejor es olvidarse de los autonumericos como llave primaria y usar codigos compuestos que puedan crearse basados en atributos del registro, fecha de creacion, etc.

Asi la llave primaria lleva por si misma mas informacion que un simple numero autonumerico que no significa nada.

eso.
  #3 (permalink)  
Antiguo 04/04/2006, 08:34
Avatar de JuanRAPerez
Colaborador
 
Fecha de Ingreso: octubre-2003
Mensajes: 2.393
Antigüedad: 20 años, 7 meses
Puntos: 27
si lo que necesitas es retraer el ultimo para poder insertar el proximo correlativo

hace lo que te indican ponelo como autonumerico en access, int en SQL y le indicas que se incremente de uno en uno y no lo insertes, el solito ira incrementandose

saludos
__________________
JuanRa Pérez
San Salvador, El Salvador
  #4 (permalink)  
Antiguo 05/04/2006, 00:44
 
Fecha de Ingreso: mayo-2005
Mensajes: 36
Antigüedad: 19 años, 1 mes
Puntos: 0
Se que es casi imposible que se de el caso pero como en teoria un buen programador debe tener cualquier situacion controlada...

En cuanto a usar el autonumerico que tiene Access o SQL Sever, por lo que tengo entendido no es muy recomendable por tema de portabilidad a otras bases de datos.

He mejorado un poco la funcion que ponia antes:

Código:
Function GetId(tabla, nombreid, wherecampos, wherevalores)
	vsSQL = "SELECT ISNULL(MAX(" & nombreid & "),0)+1 FROM " & tabla
	if wherecampos<>"" AND wherevalores<>"" then
		campos=split(wherecampos,",")
		valores=split(wherevalores,",")
		if ubound(campos)=ubound(valores) then
			vsSQL = vsSQL & " WHERE"
			for i=0 to ubound(campos)
				if i<>0 then vsSQL = vsSQL & " AND" end if
				vsSQL = vsSQL & " " & campos(i) & "="
				if IsNumeric(valores(i)) then
					vsSQL = vsSQL & valores(i)
				else
					vsSQL = vsSQL & "'" & valores(i) & "'"
				end if
			next
		end if
	end if
	GetId = vsSQL
End Function
Esta funcion la he probado solo en SQL Server. No se si en Access dara algun problema.

De todas formas si alguien sabe como poder controlar la concurrencia sin usar el truco que propone Muzztein (que esta muy bien pensado) que lo comente por favor.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:07.