Ir para conteúdo

POWERED BY:

Arquivado

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

tuf®

[Resolvido] ASP + SQL Server

Recommended Posts

Olá a todos!

 

Iniciei meus estudos em asp + banco de dados e me deparei com uma dúvida.

 

Como eu faço para saber se uma instrução sql foi executada?

 

Por exemplo:

 

sql = "select * fom tabela"
objCon.Execute(sql)

Após isso, gostaria de saber se a instrução contida na variável sql foi executada ou não.

 

Agradeço a atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve usar dessa forma somente para UPDATE, INSERT e DELETE.

 

Para SELECT, deve ser feito assim:

set sql = objCon.Execute("select * fom tabela")

 

If Not sql.Eof Then
While Not sql.Eof
response.write sql("campo") & "<br />"
sql.movenext
Wend
End If
sql.Close
Set sql = Nothing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi muito bem sua dúvida, mas, se a instrução, tiver algum erro, não será executada, do resto, é fazer o loop que o Hargon, disse.

 

fiz um blog para uma empresa , onde ao fazer uma consulta, antes de exibir os dados procurados mostra a insturção SQL executada, assim:

 

 

 

<input type="text" class="input3" name="q" value="<%= Trim(strSearch) %>" />

 

onde strSearch, é:

 

 

SELECT * FROM tMessages WHERE (fDate LIKE '%varpesquisa%' OR fHeadline LIKE '%varpesquisa%' OR fMessage LIKE '%varpesquisa%' OR fAuthor LIKE '%varpesquisa%' OR fnota LIKE '%varpesquisa%' fnota LIKE '%varpesquisa%' ) AND (online = CBool(-1)) ORDER BY fdate DESC;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou descrever com mais detalhes o que estou fazendo.

 

Estou criando um sisteminha de cadastro (nome, login, senha e email) bem simples, estou usando interface em flash, conexão com o banco via asp e sql server como banco de dados.

Para evitar ficar escrevendo o código sql no asp, eu criei uma procedure no banco de dados que faz o cadastro (insert).

Só que para meu sistema ficar um pouco mais inteligente, na mesma procedure que faz o insert, eu criei um select para verificar se as informações já existem no banco, caso já existam, a procedure retorna o valor 1 e não faz o cadastro, caso não exista, aí sim a procedure faz o insert e retorna o valor 0.

Queria saber se tem como eu fazer algo parecido com isso...

 

SQL = "proc_cadastro" 'Essa procedure tem um valor de retorno (0 ou 1)
retorno = objCon.Execute(SQL) 'Gostaria de executar a procedure e armazenar o valor de retorno dela na variável retorno do asp

Com base no valor de retorno, no próprio asp eu iria criar uma mensagem.

 

IF retorno = 0 THEN
msg = "Cadastro efetuado!"
ELSE
msg = "Esse login já existe, escolha outro!"
END IF

Não sei se isso é possível e espero ter explicado melhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

em vez de

 

msg = "Cadastro efetuado!"

faça

 

response.write("Cadastro efetuado!")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Mario Monteiro, agradeço sua resposta tb.

 

Minha intenção é usar uma variável (no caso "msg") no lugar de Response.Write, pois a interface eu fiz em flash, então é só eu passar a variável "msg" para o flash.

 

Agora voltando a minha dúvida.

 

Tenho a seguinte procedure no meu banco:

 

create proc cadastro
@nome varchar(50),
@email varchar(50),
@login varchar(15),
@senha varchar(15)
as
declare @retorno int
SELECT login FROM tb_cadastro WHERE login = @login
IF @@rowcount > 0 -- se o select encontrar um login já cadastrado
begin
 set @retorno = 1
 return @retorno -- retorna o valor 1
end
ELSE -- caso não tenha o login cadastrado no banco, faz o cadastro
begin
 set @retorno = 0
 INSERT INTO tb_cadastro (Nome, Email, Login, Senha) 
 values (@nome, @email, @login, @senha)
 return @retorno -- retorna o valor 0
end
Agora no ASP, fiz a conexão com o banco e tenho o seguinte código:

nome = Request.Form("nome")
email = Request.Form("email")
login = Request.Form("login")
senha = Request.Form("senha")

SQL = "cadastro '" & nome & "','" & email & "','" & login & "','" & senha & "'" 'Passo os parâmetros para a procedure
objCon.Execute(SQL) 'mando executar a procedure
Agora que vem minha dúvida...pois eu programei a procedure para retornar um valor...como eu faço para pegar esse valor em ASP????

Já tentei:

retorno = objCon.Execute(SQL)
Mas não funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem que setar o objeto recordset

 

SET retorno = objCon.Execute(SQL)

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem que setar o objeto recordset

 

SET retorno = objCon.Execute(SQL)

Obrigado mais uma vez pela resposta.

 

Então, já fiz isso tb, usei:

 

set retorno = objCon.Execute(SQL)
Response.Write "retorno " & retorno
Só que uma msg de erro é emitida --> "Tipo de erro:

Erro de tempo de execução do Microsoft VBScript (0x800A000D)

Tipos incompatíveis"

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá uma olhada aqui...

 

Não me lembro a fonte.

Dando continuidade ao assunto abordado em meu artigo anterior intitulado “Stored Procedure - Passagem de parâmetros em SQL Server 2000”, trago agora neste texto, uma forma prática de como usar parâmetros de saídas, que é um recurso complementar ao trabalho com stored procedure.

Lembrando que continuamos usando como exemplo o Microsoft SQL Server 2000, mas os conceitos básicos podem ser aplicados em praticamente todos os bancos de dados relacionais do mercado.

Parâmetros de saída

O uso de parâmetros de saída em stored procedure possibilita que o engine do servidor de banco de dados utilize menos recursos de hardware para retornar e exibir os resultados de uma instrução SQL, possibilitando um aumento de performance em seu envio, processamento e saída.

Vale lembrar também, que o uso de parâmetros de saída, permite uma boa manipulação dos valores retornados.

O comando CREATE PROCEDURE (com o uso de OUTPUT)

Para especificar que um stored procedure terá uma variável do tipo saída, use a forma normal de sintaxe para criação de stored procedure adicionando o flag OUTPUT no final da declaração de cada variável, veja a sintaxe na Listagem 1:

create procedure NOME_DA_PROCEDURE (@VARIÁVEL TIPO_DE_DADO OUTPUT)

as

begin

Instrução SQL desejada atribuindo um valor ao parâmetro(variável)

end

Listagem 1. Sintaxe do comando CREATE PROCEDURE.

Executando uma procedure e recuperando seu valor de retorno.

Para invocar a execução de um stored procedure, é usado a mesma sintaxe simples EXEC NOMEPROCEDURE, porém, a diferença está na necessidade em declararmos uma variável com o mesmo tipo de dado do parâmetro, e especificarmos que ela receberá o valor retornado pelo parâmetro de saída através da função “output”. Veja na Listagem 2, a sintaxe básica para esse tipo de execução:

/*Declaração de variáveis que receberam o resultado da procedure */

declare @VARIÁVEL tipo ...

 

/*execução e atribuição do valor de retorno. */

exec NomeStoredProcedure @VARIÁVEL output …

 

/* Manipulação do resultado. */

PRINT 'O valor é: '+@VARIAVEL

Listagem 2. Sistaxe de execução de um stored procedure e recuperação do valor retornado através do uso da função output.

Lembrando que você pode aplicar todos os recursos de criação e execução de stored procedure, como por exemplo, as funções: alter procedure, drop procedure, with encryption, etc.

Exemplos práticos:

Veja aqui, alguns exemplos práticos que mostram como criar stored procedure com parâmetros de saída.

Nota 01

Você pode testar esses scripts em qualquer database, porém antes, é necessário criar e povoar uma tabela de exemplo conforme a Listagem 3.

/*Criação da tabela que será o objeto de nossos exemplos */

create table FUNCIONARIOS

(CODIGO varchar(5),

NOME varchar(80),

FUNCAO int,

DEPARTAMENTO int,

SALARIO money

CONSTRAINT PK_CODIGO PRIMARY KEY (CODIGO))

 

go

/*Inserções para povoamento da tabela de FUNCIONARIOS */

insert into FUNCIONARIOS (CODIGO, NOME,FUNCAO,DEPARTAMENTO, SALARIO )

values('00001','OSCAR ALHO DA SILVA', '5','30', 2500)

go

insert into FUNCIONARIOS (CODIGO, NOME,FUNCAO,DEPARTAMENTO, SALARIO )

values('00002','JOÃO DA SILVA SAURO', '5','30', 3500)

go

insert into FUNCIONARIOS (CODIGO, NOME,FUNCAO,DEPARTAMENTO, SALARIO )

values('00003','MARIA DA BOA MORTE', '7','20',1500)

go

insert into FUNCIONARIOS (CODIGO, NOME,FUNCAO,DEPARTAMENTO, SALARIO )

values('00004','BENEVENUTO LOPES ARAUJO', '7','10',1500)

go

insert into FUNCIONARIOS (CODIGO, NOME,FUNCAO,DEPARTAMENTO, SALARIO )

values('00005','MATUZALEM ALVES', '5','30',1500)

Listagem 3. Script SQL para Criação e povoamento da tabela de testes(FUNCIONARIOS).

Exemplo 02 - Implementação de um procedure com um parâmetro de saída

/*Procedure simples para recuperar a soma dos salários da tabela FUNCIONARIOS */

create procedure sp_BuscaSalario (@SOMA money OUTPUT)

as

begin

select @SOMA=sum(SALARIO) from FUNCIONARIOS

end

 

 

/*Execução do stored procedure */

 

/*Declaração de variáveis que receberam o resultado do procedure */

declare @SALARIO_TOTAL money

 

/*execução*/

exec sp_BuscaSalario @SALARIO_TOTAL output

 

/* Manipulação do resultado*/

PRINT 'Salário total R$'+(CAST(@SALARIO_TOTAL AS varchar(20)))

Listagem 4. Recuperando o valor de uma soma de consulta.

Exemplo 03 - Recuperando um valor e aplicando uma estrutura de decisão

/*Procedure simples para recuperar a soma dos salários e aplicar uma estrutura de decisão*/

create procedure sp_BuscaSalario2 (@SOMA money OUTPUT)

as

begin

select @SOMA=sum(SALARIO) from FUNCIONARIOS

end

 

 

/*Execução do procedure */

declare @SALARIO_TOTAL money

exec sp_BuscaSalario2 @SALARIO_TOTAL output

 

if @SALARIO_TOTAL < 20000

begin

print '***SALÁRIO BAIXO***** '

print 'Salário total R$'+(CAST(@SALARIO_TOTAL AS varchar(20)))

end

else

begin

print '***SALÁRIO ALTO***** '

print 'Salário total R$'+(CAST(@SALARIO_TOTAL AS varchar(20)))

end

Listagem 5. Parâmetros e estrutura IF ..ELSE..

Exemplo 04 - Passando e Recuperando parâmetros

/*Procedure com passagem de parâmetro como critério de seleção para

recuperar a soma dos salários da tabela FUNCIONARIOS através de parâmetro de saída*/

 

create procedure sp_BuscaSalario_porDepto (@DEPTO int, @SOMA money OUTPUT)

as

begin

select @SOMA=sum(SALARIO) from FUNCIONARIOS

where

DEPARTAMENTO=@DEPTO

end

 

 

/*Execução do procedure */

 

/*Variável de saída */

declare @SALARIO_TOTAL money

 

/*Variável para passagem de parâmetro*/

declare @DEPARTAMENTO int

set @DEPARTAMENTO=30

 

/*execução*/

exec sp_BuscaSalario_porDepto @DEPARTAMENTO, @SALARIO_TOTAL output

PRINT 'Salário total do departamento '+ cast(@DEPARTAMENTO as varchar)+ ' é R$'+(CAST(@SALARIO_TOTAL AS varchar(20)))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!

 

Nem sei o que estou fazendo aqui... http://forum.imasters.com.br/public/style_emoticons/default/assobiando.gif uhauahauahau Mas vamos lá

 

Seguinte cara tenta fazer o seguinte:

 

Troca sua procedure por esta

 

create proc cadastro
@nome varchar(50),
@email varchar(50),
@login varchar(15),
@senha varchar(15)
as
declare @retorno int
SELECT login  into #tbl FROM tb_cadastro WHERE login = @login
IF @@rowcount > 0 -- se o select encontrar um login já cadastrado
begin
set @retorno = 1
select  @retorno as retorno-- retorna o valor 1
end
ELSE -- caso não tenha o login cadastrado no banco, faz o cadastro
begin
set @retorno = 0
select @retorno as retorno
INSERT INTO tb_cadastro (Nome, Email, Login, Senha)
values (@nome, @email, @login, @senha)
end

Pega os dados com request.form

 

 

No asp que executa a procedure faz assim

sql = "EXEC cadastro '" &nome& "','" &email& "','" &login& "','" &senha& "'" '

Agora para pegar o resultado eu faço assim:

Set conexao = Server.CreateObject("ADODB.Connection")
	banco ="Driver={SQL Native Client};	Server=seu_servidor;Database=banco;Uid=login;Pwd=senha"
	conexao.Open banco
	Set linha = Server.CreateObject("ADODB.Recordset")
	sql = "EXEC cadastro '" &nome& "','" &email& "','" &login& "','" &senha& "'" '
	linha.Open sql, conexao , 3,3
			while not linha.eof
					 retorno=linha("retorno")
					response.write "retorno.:"&retorno& "<br>"
			linha.MoveNext
		wend

Aí tenta implementar ai.....

Que versão do SQL SERVER você usa?? SQL server 7 ? 2005 ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troca sua procedure por esta

create proc cadastro
@nome varchar(50),
@email varchar(50),
@login varchar(15),
@senha varchar(15)
as
declare @retorno int
SELECT login  into #tbl FROM tb_cadastro WHERE login = @login
IF @@rowcount > 0 -- se o select encontrar um login já cadastrado
begin
set @retorno = 1
select  @retorno as retorno-- retorna o valor 1
end
ELSE -- caso não tenha o login cadastrado no banco, faz o cadastro
begin
set @retorno = 0
select @retorno as retorno
INSERT INTO tb_cadastro (Nome, Email, Login, Senha)
values (@nome, @email, @login, @senha)
end
Bem, só mudou esse #tbl, o que é isso?

 

Que versão do SQL SERVER você usa?? SQL server 7 ? 2005 ?

Estou usando o SQL Server 2000.

 

Agradeço a ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai você testou?

:unsure:

 

 

Mudei esta linha também:

return @retorno -- retorna o valor 1
por esta
select @retorno as retorno-- retorna o valor 1

 

Quanto ao #tbl dê uma olhada aqui

 

Falow!

Compartilhar este post


Link para o post
Compartilhar em outros sites

você verificou o que postei acima...

Compartilhar este post


Link para o post
Compartilhar em outros sites

novato_php --> ainda não testei, vou testar. Obrigado pelo artigo das tabelas temporárias =D

 

xanburzum --> vou ler com mais calma seu post, obrigado =D

 

Agradeço a ajuda de todos, estou aprendendo bastante.

 

----------------------------------------------------------------------------------------------------------------------

 

Então, testei do jeito que você me mostrou novato_php, mas ainda não deu certo.

Não sei o porque que o Recorset não está funcionando...está exibindo a seguinte msg:

 

"Tipo de erro:

ADODB.Recordset (0x800A0E78)

Operação não permitida quando o objeto está fechado."

 

Vou postar meu código completo:

 

A procedure está do jeito que você me explicou

 

create proc_cadastro

@nome varchar(50),
@email varchar(50),
@login varchar(15),
@senha varchar(15)
as
declare @retorno bit
select Login into #tbl from tb_cadastro where Login = @login
if @@rowcount > 0
begin
 set @retorno = 1
 select @retorno as retorno
end
else
begin
 set @retorno = 0
 insert into tb_cadastro_professor (Nome, Email, Disciplina, Login, Senha)
 values (@nome, @email, @disciplina, @login, @senha)
 select @retorno as retorno
end
O código asp está assim:

<!--#include file="conexao.asp"-->
<%
nome = "teste"
email = "teste@teste.com"
login = "teste"
senha = "teste"

SQL = "EXEC proc_cadastro " & "'" & nome & "', '" & email & "', '" & login & "', '" & senha & "'"
Set objRs = Server.CreateObject("ADODB.Recordset")
objRs.Open SQL, objCon
while not objRs.EOF
	retorno = objRs("retorno")
	Response.Write "Retorno: " & retorno & "<br>"
	objRs.moveNext
wend
Set objRs = nothing
Set objCon = nothing
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você verificou o que postei acima...

Sim, já estudei o que você postou, só estou com problemas com o Recordset.

Postei acima meu código completo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifique se neste arquivo você não está fechando o recordset, e poste o numero da linha...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu vi, não estou fechando o recordset, somente tenho um "Set objRs = nothing" depois do looping while.

 

Desculpe a ignorância, mas como eu faço um if para verificar se o recordset está fechado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual a linha do erro ????

Compartilhar este post


Link para o post
Compartilhar em outros sites

qual a linha do erro ????

Desculpe, vou postar o meu código, pois fiz uma alteração e a linha do erro.

<!--#include file="conexao.asp"-->
<%
nome = Request.Form("nome")
email = Request.Form("email")
login = Request.Form("login")
senha = Request.Form("senha")

SQL = "EXEC proc_cadastro " & "'" & nome & "', '" & email & "', '" & login & "', '" & senha & "'"
set objRs = objCon.Execute(SQL)
while not objRs.EOF
	teste = objRs("retorno")
	Response.Write "Retorno: " & teste & "<br>"
	objRs.moveNext
wend
Set objRs = nothing
Set objCon = nothing
%>
O erro acontece nessa linha:

while not objRs.EOF
Já a minha procedure está da forma como o novato_php me instruiu. Assim, no meu código ASP eu pegaria a coluna "retorno" da proc.

create proc proc_cadastro
@nome varchar(50),
@email varchar(50),
@login varchar(15),
@senha varchar(15)
as
declare @retorno bit
select Login into #temp from tb_cadastro where Login = @login
if @@rowcount > 0
begin
 set @retorno = 1
 select @retorno as retorno
end
else
begin
 set @retorno = 0
 insert into tb_cadastro_professor (Nome, Email, Login, Senha)
 values (@nome, @email, @login, @senha)
 select @retorno as retorno
end

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.