CAMPO SEQUENCE NO VB.NET
Estou passando um sistema que tenho em VB6 para VB.NET. Acontece que acabei esbarrando em um questão que até então era simples para mim, mas no VB.net estou meio perdido.
Preciso ter o controle de sequence. No VB6 eu tenho uma função que criei que é a seguinte:
===================================================================================
Public Function NroSequenceSQL(ByRef aoConexao As ADODB.Connection, ByVal asNomeTabelaSequence As String) As Long
Dim voRs As ADODB.Recordset, viA As Integer
Set voRs = New ADODB.Recordset
voRs.CursorLocation = adUseServer
voRs.Open [Ô]SELECT NEXTVAL FROM [Ô] & asNomeTabelaSequence, aoConexao, adOpenDynamic, adLockPessimistic, adCmdText
voRs!NEXTVAL.Value = voRs!NEXTVAL.Value + 1
voRs.Update
NroSequenceSQL = voRs!NEXTVAL.Value
voRs.Close
Set voRs = Nothing
End Function
===================================================================================
Esta função dentro do VB6 eu uso da seguinte maneira
minhavariavel = NroSequenceSQL(aoConexao, [Ô]S_NRO_CLIENTE[Ô])
Se na tabela S_NRO_CCLIENTE o numero esta parado no 8 ele muda para 9 e me retorna este valor dentro da variavel.
===================================================================================
Agora no VB.NET me perdi.
Para resolver isso seria por meio de procedure dentro do banco? Eu pensei em usar este esquema mas teria que criar uma procedure para cada tabela que eu queira controlar a sequencia porque o nome da tabela dentro dela é fixo. Abaixo a procedure que testei:
===================================================================================
CREATE procedure sp_NroSequenceSQL
@Id int output
as
select NEXTVAL FROM S_NRO_CLIENTE (updlock)
update S_NRO_PESQIMOTEMP set NEXTVAL = NEXTVAL +1
select @id as NEXTVAL
return
GO
===================================================================================
Seria este o caminho? Alguém utiliza uma forma melhor, mais pratica?
Estou usando SQL 2008
OBS: Sei que no SQL 2008 como nos anteriores tem o esquema de IDENTITY para o campo que é praticamente o auto-numeração do access. Mas prefiro controlar por código mesmo.
Obrigado mais uma vez pela atenção de todos. Valeu.
ao AUTO_NUMERIC do MySQL.. já no Oracle existem Sequences porém não tem AUTO_NUMERIC muito menos IDENTITY ou seja você fica obrigado a trabalhar
com sequences no oracle usando start value, minvalue, maxvalue etc etc..
pra que reinventar a roda ?
Com algumas googladas achei essa procedure:
Citação:CREATE PROCEDURE [GetNext]
@Name VARCHAR(50)
AS
BEGIN
DECLARE @sql VARCHAR(200);
SET @Name = QUOTENAME(@Name, [ô][[ô]);
SET @sql = [ô]SELECT NEXT VALUE FOR [ô] + @Name;
EXEC (@sql);
END
Citação::
Venho do MySQL más não entendo o motivo de criar manualmente, por ex no SQLServer apesar de não trabalhar com SqlServer sei que possui o IDENTITY que equivale
ao AUTO_NUMERIC do MySQL.. já no Oracle existem Sequences porém não tem AUTO_NUMERIC muito menos IDENTITY ou seja você fica obrigado a trabalhar
com sequences no oracle usando start value, minvalue, maxvalue etc etc..
pra que reinventar a roda ?
Com algumas googladas achei essa procedure:
CREATE PROCEDURE [GetNext]
@Name VARCHAR(50)
AS
BEGIN
DECLARE @sql VARCHAR(200);
SET @Name = QUOTENAME(@Name, [ô][[ô]);
SET @sql = [ô]SELECT NEXT VALUE FOR [ô] + @Name;
EXEC (@sql);
END
Citação::
Venho do MySQL más não entendo o motivo de criar manualmente, por ex no SQLServer apesar de não trabalhar com SqlServer sei que possui o IDENTITY que equivale
ao AUTO_NUMERIC do MySQL.. já no Oracle existem Sequences porém não tem AUTO_NUMERIC muito menos IDENTITY ou seja você fica obrigado a trabalhar
com sequences no oracle usando start value, minvalue, maxvalue etc etc..
pra que reinventar a roda ?
Com algumas googladas achei essa procedure:
CREATE PROCEDURE [GetNext]
@Name VARCHAR(50)
AS
BEGIN
DECLARE @sql VARCHAR(200);
SET @Name = QUOTENAME(@Name, [ô][[ô]);
SET @sql = [ô]SELECT NEXT VALUE FOR [ô] + @Name;
EXEC (@sql);
END
Obrigado pelo retorno. Eu faço via codigo para poder controlar melhor se perder algum numero na hora da geração. Em relação ao IDENTITY eu comentei que tbm nao queria usa-lo ja que na versão do sql 2012 incluiram as sequences igual no oracle, não sei se no futuro irei trabalhar com sql 2012 mas o problema é usar IDENTITY e esta propriedade não ter no sql 2012 ja que ainda nao o testei.
Em relação a sua procedure eu tinha montado uma que coloquei na minha pergunta. Ela segura o SELECT para que não tenho problema de mais de um usuario pegar o mesmo valor na hora da geração.
O problema é que para procedures eu teria que criar uma para cada controle de tabela, ja que fazer uma dinamica tem o problema de SQL injection.
Ainda estou pensando qual seria a melhor solução, se alguem tiver mais ideia é só mandar.
Obrigado.