Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lab Design

insert

Recommended Posts

Eu postei no topico php mas ninguem respondeu então talvez aqui eu encontre a resposta para a minha dúvida.Tenho um projeto sendo desenvolvido em php com SQL server 2005.1) Alguem perguntaria porque sql server se ja tem o mysql que casa perfeitamente com o php.- Porque o projeto da web trabalha em conjunto com um programa VB.NET que roda na intranet e usa essa mesma base de dados. Uma vez que o programa já está em funcionamento e portanto a parte de web é que está sendo desenvolvida, as tabelas foram criadas de acordo com o programa e não com o web site. Na definição das tabelas todos os campos IDs foram criados com autoincremento e o programa se utiliza desse recurso pra fazer as inserções.Devido a isso o web site tambem tem que seguir essa mesma regra porém existem casos em que preciso saber de imediato o ID do registro inserido para colocar em algum link e daí vem a minha dificuldade (existem várias opções é claro) mas to partindo do princípio de que possa existir uma solução mais prática.Simulando...Um usuario efetua o cadastro e faz sua matrícula num determinado curso pelo site:O site grava o usuário na tabela cadastro, grava o ID do curso junto com o ID do usuário numa tabela de aluno_cursos, grava um lançamento na tabela financeiro e precisa criar um link para impressão do boleto cujos dados serão pegos da tabela financeiro.Eu desativei o autoincremento na tabela e gero ele antes de gravar o registro usando o max(id) e portanto já tenho o ID necessário para as duas tabelas e para o link, porém isso irá dar problemas para o programa que não grava o ID já que o mesmo é autoincrement.Então pensei: Se eu ativar o autoincremento no campo ID do cadastro, eu posso fazer o insert e um select com algum campo chave pra pegar o ID - talvez essa seja a melhor solução para nao ter que mudar o programa VB.NET que roda na intranet.Só comparando, quando eu uso o mysql eu tenho uma função chamada inserted_id que retorna o ID inserido pelo comando insertex.:$query=mysql_query("insert into cadastro(nome, ender....) values('$nome','$ender'...) - neste caso o ID é autoincrement, em seguida eu faço:$ID= mysql_insert_id($query) ou seja o mysql retorna o ID inserido, sem que eu precise fazer um selectEu procurei pela net mas não consegui uma solução satisfatória, então eu pergunto:Existe no sql server alguma função que retorne o numero do ultimo registro inserido na tabela sem ser o max(id)?Porque: Imagine dois usuarios efetuando um cadastro ao mesmo tempo, o user 1 grava, em seguida o user grava justamente no tempo em que o user 1 ta fazendo um max(id) pra pegar o ID. Ele vai pegar o ID do user2 e nao do user1 que seria o correto.Será que existe algo? Eu não sou expert em sql server, minha plataforma diária é php/mysql, ali eu me sinto em casa mas no sql server to apanhando um bocado.Só pra registrar os acessos são feito através da freeDts, uma biblioteca do linux que faz interface com o sql server e segundo a documentação, nessa interface nao exite qualquer função similar ao mysql_insert_id.Para evitar ter que fazer um select logo apos um insert somente pra pegar o ID do registro inserido, uma forma de incluir uma variavel de retorno na query de insert seria possível?Talvez os mais experientes conheçam alguma função existente no sql server ou seria necessario criar uma procedure pra não ter que dar tantas voltas a cada vez que precisar inserir um campo numa tabela com ID autoincrement.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A propriedade @@IDENTITY, permite identificar o último identity inserido em uma tabela.

 

Vai aí um exemplo...

 

set nocount oncreate table #Tabela(CampoID int identity (1,1), Descricao char(20))goinsert #Tabela values ('Teste')select @@Identity as LastCampoIDdrop table #Tabelaset nocount off

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado MisterPe, vou testar imediatamente. Não querendo abusar da sua boa vontade só mais uma dúvida. Qual a melhor collation que eu poderia utilizar na base de dados para evitar problemas de acentuação, visto que os dados serão inseridos tanto pelo site (plataforma linux com freeDts) quando por um programa VB.NET rodando na intranet local.Eu pergunto porque está acontecendo o seguinte:Na locaweb através do manager do express eu constatei que a base de dados estava setado para o SQL_Latin1_General_CP850_CI_AI, não sei sé é padrão da locaweb já instalar com essa collation. Sei que quando instalei o express veio como default outro padrão que não lembro agora.No meu express eu também deixei com o mesmo collation pra manter a compatibilidade so que mudei a collation depois que as tabelas já estavam preenchidas e seguindo alguns post de outros forums isso pode acarretar problemas, porem seriam somente no express já que para a locaweb eu exportei os dados iniciais pelo access usando odbc. O que ocorre: Se eu insiro um registro através do site, os caracteres acentuados aparecem no programa VB.NET, no manager do express e da locaweb trocados porém vistos corretamente no site. Agora se eu corrijo esses caracteres ou insiro um registro pelo manager ou pelo VB.NET, eles aparecem corretamente no manager, porém no site ficam trocados olha o exemplo abaixo: Registro gravado pelo site: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project) no visual studio mostra: Inscr. Curso: Gerenciamento de Projetos com AplicaþÒo para o Microsoft Project no site mostra: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project) ou seja mostra corretamente o 'ça' da forma que foi digitado. Agora, editando o registro tanto pelo programa quanto pelo visual studio: no visual mostra: Inscr. Curso: Gerenciamento de Projetos com Aplicação para o Microsoft Project (Editei o registro corrigindo os acentos) o site mostra: Inscr. Curso: Gerenciamento de Projetos com Aplica‡Æo para o Microsoft Project) Veja como o site mostra o 'Aplica‡Æo ', inclusive diferente do primeiro exemplo 'AplicaþÒo':Se não for abusar muito da sua boa vontade, já agradeço pela ajuda anterior que vai resolver totalmente problema do ID autoincrement. Eu tentei inserir alguns registros usando o utf_8 encode~, urlencode, rawurlencode mas nenhum deles gravou na tabela de forma correta.Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na configuração do collation procuro sempre trabalhar com o padrão do sql server (SQL_Latin1_General_CP1_CI_AS).

 

Agora, cada caso é um caso... acho que uma pesquisa na WEB vai te permitir identificar uma série de aspectos que não estão relacionados somente a questões de acentuação (case sensitive, padrões de data, etc, ...).

 

Lembrando que ajustar o collation de um banco ou de uma tabela específica poder ser feito a qualquer momento, o quê permite ir testando e ajustando ao padrão que fica mais adequado pro teu ambiente. Dá uma olhada no post abaixo, só pra ter uma idéia...

 

http://forum.imasters.com.br/index.php?sho...amp;hl=colation

 

Boa pesquisa !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu to numa briga com a locaweb la porque aqui no meu servidor eu coloco o collations Latin1_general_CI_AS e vejo tudo perfeito, tanto no manager como importando a tabela para o access ou em qualquer pagina do site, já a versão que está publicada na internet mesmo com essa collation na tabela agora correto, portanto deduzo que vai aparecer corretamente no programa da internet mas no site ferra toda a acentuação. Eu deduzi o seguinte: O PHP envia os dados atraves do freetds que aparentemente não codifica nada e o sql grava corretamente, porém no select o freetds deve codificar pra passar de volta para o php e aí é que vem a m.Eu vou tentar resolver da seguinte forma: Como são poucos os acesso para inclusão via intranet, voltei a base de dados para o collations original que era cp850 e vou tentar que o programador use uma tabela de conversão no programa para caso precise editar ou incluir algum registro. Não sei como ele vai resolver isso, pois pra mim, o CP850 ta funfando sem problema algum, agora se eu importo essa tabela para o access, vem tudo ferrado igual eu vejo no manager do sql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.