Incorrect Syntax near nvarchar - Erro Asp.Net

08/02/2015

0

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.

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

Fábio Carvalho

Responder

Posts

09/02/2015

Fabiano Carvalho

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
Responder

09/02/2015

Fábio Carvalho

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.
Responder

09/02/2015

Soeuseijothaz

SP:

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.
Responder

09/02/2015

Fábio Carvalho

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:

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;
        }


    }
}
Responder

09/02/2015

Pjava

Mas, onde dá o erro? Nos mostre em que momento o erro aparece?
Responder

09/02/2015

Fábio Carvalho

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]
Responder

09/02/2015

Soeuseijothaz

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:

            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.
Responder

09/02/2015

Fábio Carvalho

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:

            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!
Responder

10/02/2015

Fábio Carvalho

o Deescobri onde estava o erro debugando o código, acontece que eu esqueci a linha:

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!
Responder

13/02/2015

Pjava

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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar