Incorrect Syntax near nvarchar - Erro Asp.Net
08/02/2015
0
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
Posts
09/02/2015
Fabiano Carvalho
CREATE PROCEDURE [dbo].[DeletarCliente] @NomeCliente varchar(max), @Email varchar(max) AS begin DELETE FROM CLIENTE Where (@NomeCliente= @NomeCliente); end
09/02/2015
Fábio Carvalho
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.
09/02/2015
Soeuseijothaz
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.
09/02/2015
Fábio Carvalho
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; } } }
09/02/2015
Pjava
09/02/2015
Fábio Carvalho
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]
09/02/2015
Soeuseijothaz
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.
09/02/2015
Fábio Carvalho
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!
10/02/2015
Fábio Carvalho
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!
13/02/2015
Pjava
Clique aqui para fazer login e interagir na Comunidade :)