CAMPO SEQUENCE NO VB.NET

ANDPAG 06/09/2017 04:07:16
#476330
Olá pessoal, bom dia a todos.

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.
MESTRE 06/09/2017 08:08:36
#476331
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:
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

ANDPAG 06/09/2017 15:19:03
#476344
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.
Tópico encerrado , respostas não são mais permitidas