Array
(
)

Incorrect Syntax near nvarchar - Erro Asp.Net

Fcarvalho
   - 08 fev 2015

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.
#CódigoCREATE 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:
#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 é ?

Fabiano Carvalho
   - 09 fev 2015

procedure não seria assim o correto?
#CódigoCREATE PROCEDURE [dbo].[DeletarCliente]
@NomeCliente varchar(max),
@Email varchar(max)
AS
begin
DELETE FROM CLIENTE Where (@NomeCliente= @NomeCliente);
end

Fcarvalho
   - 09 fev 2015


Citação:
procedure não seria assim o correto?
#CódigoCREATE 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.

Jothaz
   - 09 fev 2015

SP:
#Código

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:
#Código
varchar(max)


delimite o tamanho dos campos:
#Código
@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.

Fcarvalho
   - 09 fev 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:

#Códigousing 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;

}

}

}


#Códigousing 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;
}

}
}

Pjava
   - 09 fev 2015

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

Fcarvalho
   - 09 fev 2015


Citação:
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.

Clique na imagem para abrir em uma nova janela

Jothaz
   - 09 fev 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:

#Código
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:

#Código
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.

Fcarvalho
   - 09 fev 2015


Citação:
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:

#Código
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:

#Código
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!

Fcarvalho
   - 10 fev 2015

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

#Códigocmd.CommandType = CommandType.StoredProcedure;

Aí o código ficou assim:

#Códigovar 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!

Pjava
   - 13 fev 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.