Incorrect Syntax near nvarchar - Erro Asp.Net
Fala galera, boa tarde!
Estou tentando modificar uns programas do curso de Asp.Net, e estou fazendo um CRUD com uma console application e T/SQL (que corresponde a aula 44 do curso conhecendo o Asp.Net). Então eu resolvi criar uma mini interface pro usuário interagir para cadastrar cliente, deletar e listar. Então eu criei uma Store Procedure para deletar o usuário pelo nome.
Em seguida, fiz uma nova classe para ter somente coisas relacionada ao banco de dados, os métodos, conexões e etc. Esse é o código:
O erro que aparece quando compilo é: Incorrect Syntax near nvarchar alguém saberia o que é ?
Estou tentando modificar uns programas do curso de Asp.Net, e estou fazendo um CRUD com uma console application e T/SQL (que corresponde a aula 44 do curso conhecendo o Asp.Net). Então eu resolvi criar uma mini interface pro usuário interagir para cadastrar cliente, deletar e listar. Então eu criei uma Store Procedure para deletar o usuário pelo nome.
CREATE PROCEDURE [dbo].[DeletarCliente] @NomeCliente varchar(max), @Email varchar(max) AS begin DELETE FROM CLIENTE Where (@NomeCliente = NomeCliente); end
Em seguida, fiz uma nova classe para ter somente coisas relacionada ao banco de dados, os métodos, conexões e etc. Esse é o código:
public void DeleteCliente(string nmCliente) { Console.WriteLine("Digite o nome do cliente:"); nmCliente = Console.ReadLine(); var ConnectionString = GetConnectionStringFromConfig(); using (var con = new SqlConnection(ConnectionString)) { con.Open(); var trans = con.BeginTransaction(); try { var SQL = "DeletarCliente"; var cmd = con.CreateCommand(); cmd.CommandText = SQL; SqlParameter param = new SqlParameter("@NomeCliente", nmCliente); cmd.Parameters.Add(param); cmd.Parameters["@NomeCliente"].ParameterName = nmCliente; cmd.Transaction = trans; cmd.ExecuteNonQuery(); trans.Commit(); Console.WriteLine("Comandos executados com sucesso"); } catch (Exception E) { trans.Rollback(); Console.WriteLine("Erro na transação"); Console.WriteLine(E.GetType()); Console.WriteLine(E.Message); Console.ReadKey(); } }
O erro que aparece quando compilo é: Incorrect Syntax near nvarchar alguém saberia o que é ?
Fábio Carvalho
Curtidas 0
Respostas
Fabiano Carvalho
08/02/2015
procedure não seria assim o correto?
CREATE PROCEDURE [dbo].[DeletarCliente] @NomeCliente varchar(max), @Email varchar(max) AS begin DELETE FROM CLIENTE Where (@NomeCliente= @NomeCliente); end
GOSTEI 0
Fábio Carvalho
08/02/2015
procedure não seria assim o correto?
CREATE PROCEDURE [dbo].[DeletarCliente] @NomeCliente varchar(max), @Email varchar(max) AS begin DELETE FROM CLIENTE Where (@NomeCliente= @NomeCliente); end
Fábiano, obrigado por responder.
Então, eu tentei assim também e deu o mesmo erro, é a primeira vez que utilizo procedure então estou um pouco perdido.
GOSTEI 0
Soeuseijothaz
08/02/2015
SP:
Não é uma boa prática utilizar:
delimite o tamanho dos campos:
Se não for utilizar o campo "Email" é melhor não defini-lo como parâmetro, se quiser deixá-lo deve passá-lo na chamada da SP, nem que seja como "null".
Do contrário irá retornar erro.
CREATE PROCEDURE [dbo].[DeletarCliente] @NomeCliente varchar(100), @Email varchar(150) AS begin DELETE FROM CLIENTE Where NomeCliente = @NomeCliente; end
Não é uma boa prática utilizar:
varchar(max)
delimite o tamanho dos campos:
@NomeCliente varchar(100), @Email varchar(150)
Se não for utilizar o campo "Email" é melhor não defini-lo como parâmetro, se quiser deixá-lo deve passá-lo na chamada da SP, nem que seja como "null".
Do contrário irá retornar erro.
GOSTEI 0
Fábio Carvalho
08/02/2015
Jothaz, você por aí de novo! Bom dia!
Eu removi o e-mail como foi sugerido, deu um branco aqui que eu nem sei porque coloquei ele lá. Mas enfim, continuo com o mesmo problema, mesmo definindo varchar como 150 por exemplo.
Eu resolvi deixar ainda como Max, por causa que também to acompanhando pela vídeo aula. Não entendo como pode ter um erro próximo a nvarchar (que seria na procedure), o visual ia acusar caso tivesse alguma syntax errada.
Vou postar o restante do código abaixo, que talvez possa ser alguma coisa que eu não vi:
Eu removi o e-mail como foi sugerido, deu um branco aqui que eu nem sei porque coloquei ele lá. Mas enfim, continuo com o mesmo problema, mesmo definindo varchar como 150 por exemplo.
Eu resolvi deixar ainda como Max, por causa que também to acompanhando pela vídeo aula. Não entendo como pode ter um erro próximo a nvarchar (que seria na procedure), o visual ia acusar caso tivesse alguma syntax errada.
Vou postar o restante do código abaixo, que talvez possa ser alguma coisa que eu não vi:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace Aplicacao1 { class BdConnection { static void main(string[] args) { } public void DeleteCliente(string nmCliente) { Console.WriteLine("Digite o nome do cliente:"); nmCliente = Console.ReadLine(); var ConnectionString = GetConnectionStringFromConfig(); using (var con = new SqlConnection(ConnectionString)) { con.Open(); var trans = con.BeginTransaction(); try { var SQL = "DeletarCliente"; var cmd = con.CreateCommand(); cmd.CommandText = SQL; SqlParameter param = new SqlParameter("@NomeCliente", nmCliente); cmd.Parameters.Add(param); cmd.Parameters["@NomeCliente"].ParameterName = nmCliente; cmd.Transaction = trans; cmd.ExecuteNonQuery(); trans.Commit(); Console.WriteLine("Comandos executados com sucesso"); } catch (Exception E) { trans.Rollback(); Console.WriteLine("Erro na transação"); Console.WriteLine(E.GetType()); Console.WriteLine(E.Message); Console.ReadKey(); } } } public void InsereCliente(string nmCliente,string eMail) { Console.WriteLine("Digite o nome do cliente:"); nmCliente = Console.ReadLine(); Console.WriteLine("Digite o Email do cliente"); eMail = Console.ReadLine(); var ConnectionString = GetConnectionStringFromConfig(); //Conexão recebe a string de configuração var con = new SqlConnection(ConnectionString); //Instrução SQL em formato string de inserção de dados na tabela var SQL = "InserirCliente"; //Comando de sql que executa a instrução anterior var cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@NomeCliente", nmCliente); cmd.Parameters.AddWithValue("@Email", eMail); con.Open(); try { cmd.ExecuteNonQuery(); Console.WriteLine("Registro inserido com êxito!"); } finally { con.Close(); } } private static string GetConnectionStringFromConfig() { return ConfigurationManager.ConnectionStrings["Cadastro"].ConnectionString; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace Aplicacao1 { class Program { static void Main(string[] args) { string nmCliente = ""; string eMail = ""; BdConnection bdFuncao = new BdConnection(); var op = Menu(); if (op == "1") { Console.Clear(); bdFuncao.InsereCliente(nmCliente, eMail); } else if (op == "2") { Console.Clear(); bdFuncao.DeleteCliente(nmCliente); } else if (op == "3") { //Chama listagem } else { Console.WriteLine("Valor invalido!"); Menu(); } } private static string Menu() { Console.WriteLine("Seja bem vindo...\nInsira o número de acordo com a função \n" + "1 - Para Cadastro 2 - Para Deletar 3 - Para listar"); var op = Console.ReadLine(); return op; } } }
GOSTEI 0
Pjava
08/02/2015
Mas, onde dá o erro? Nos mostre em que momento o erro aparece?
GOSTEI 0
Fábio Carvalho
08/02/2015
Mas, onde dá o erro? Nos mostre em que momento o erro aparece?
Eu consigo rodar o código, e digitar o nome do cliente que quero apagar, mas em seguida da o erro.
[img]http://arquivo.devmedia.com.br/forum/imagem/365131-20150209-113617.jpg[/img]
GOSTEI 0
Soeuseijothaz
08/02/2015
Estou num projeto complicado e não tive tempo para acessar o fórum!
Vamos por partes.
Primeiro tente rodar a sotred procedure direto no Managemente Studio com o comando:
EXEC proc_name 'nome-para-deletar'
Se rodar a sotred procedure esta ok e o erro é no código, se não rodar e porque existe algum erro nela e devemos consertá-la.
Se você retirou o email da storede procedure dever retirá-lo do código.
Então isto:
Deve ficar assim:
Para facilitar coloque um breakpoint no código para ativar o degub e verificar em qual linha esta ocorrendo o erro.
Finalizando a questão do 'varchar(max)' foi um sugestao de melhor prática e não retornaria erro.
Vamos por partes.
Primeiro tente rodar a sotred procedure direto no Managemente Studio com o comando:
EXEC proc_name 'nome-para-deletar'
Se rodar a sotred procedure esta ok e o erro é no código, se não rodar e porque existe algum erro nela e devemos consertá-la.
Se você retirou o email da storede procedure dever retirá-lo do código.
Então isto:
var cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@NomeCliente", nmCliente); cmd.Parameters.AddWithValue("@Email", eMail); con.Open();
Deve ficar assim:
var cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@NomeCliente", nmCliente); con.Open();
Para facilitar coloque um breakpoint no código para ativar o degub e verificar em qual linha esta ocorrendo o erro.
Finalizando a questão do 'varchar(max)' foi um sugestao de melhor prática e não retornaria erro.
GOSTEI 0
Fábio Carvalho
08/02/2015
Estou num projeto complicado e não tive tempo para acessar o fórum!
Vamos por partes.
Primeiro tente rodar a sotred procedure direto no Managemente Studio com o comando:
EXEC proc_name 'nome-para-deletar'
Se rodar a sotred procedure esta ok e o erro é no código, se não rodar e porque existe algum erro nela e devemos consertá-la.
Se você retirou o email da storede procedure dever retirá-lo do código.
Então isto:
Deve ficar assim:
Para facilitar coloque um breakpoint no código para ativar o degub e verificar em qual linha esta ocorrendo o erro.
Finalizando a questão do 'varchar(max)' foi um sugestao de melhor prática e não retornaria erro.
Vamos por partes.
Primeiro tente rodar a sotred procedure direto no Managemente Studio com o comando:
EXEC proc_name 'nome-para-deletar'
Se rodar a sotred procedure esta ok e o erro é no código, se não rodar e porque existe algum erro nela e devemos consertá-la.
Se você retirou o email da storede procedure dever retirá-lo do código.
Então isto:
var cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@NomeCliente", nmCliente); cmd.Parameters.AddWithValue("@Email", eMail); con.Open();
Deve ficar assim:
var cmd = new SqlCommand(SQL, con); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@NomeCliente", nmCliente); con.Open();
Para facilitar coloque um breakpoint no código para ativar o degub e verificar em qual linha esta ocorrendo o erro.
Finalizando a questão do 'varchar(max)' foi um sugestao de melhor prática e não retornaria erro.
Vou tentar assim que voltar da faculdade, valeu!
GOSTEI 0
Fábio Carvalho
08/02/2015
o Deescobri onde estava o erro debugando o código, acontece que eu esqueci a linha:
Aí o código ficou assim:
Muito obrigado a todos que ajudaram! Tenham uma boa semana!
cmd.CommandType = CommandType.StoredProcedure;
Aí o código ficou assim:
var SQL = "DeletarCliente"; var cmd = con.CreateCommand(); cmd.CommandText = SQL; cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter("@NomeCliente", nmCliente); cmd.Parameters.Add(param); cmd.Parameters["@NomeCliente"].ParameterName = nmCliente; cmd.Transaction = trans; cmd.ExecuteNonQuery(); trans.Commit(); Console.WriteLine("Comandos executados com sucesso");
Muito obrigado a todos que ajudaram! Tenham uma boa semana!
GOSTEI 0
Pjava
08/02/2015
Fábio, caso essa situação resolveu a sua dúvida, pedimos por gentileza que marque sua resposta como resolvido. Vá no painel à esquerda da sua resposta e lá marque a opção que possui a imagem de um Check.
GOSTEI 0