none
Comando UPDATE com nome da coluna variável RRS feed

  • Pergunta

  • Preciso atualizar uma tabela, mas o nome da coluna varia, tenho o nome dela em uma variável. Mas não tá deixando passar.

    Erro: 

    An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll

    Additional information: Dados de cadeia ou binários seriam truncados.

    A instrução foi finalizada.

    SqlCommand cmd = new SqlCommand("UPDATE horarios SET @vaga=@nome WHERE id=@id", conn);

    cmd.Parameters.AddWithValue("@vaga", vagaa);

    cmd.Parameters.AddWithValue("@nome", nome);

    cmd.Parameters.AddWithValue("@id", id);            



    Bruno Barbosa - Futuro MCPD

    quarta-feira, 2 de abril de 2014 19:33

Respostas

  • Realmente não vai dar certo porque ele vai achar que @vaga vai ficar assim na SQL 'nomedacoluna' e ai a sua SQL vai ta errada!!!

    Então você deve alterar de outra forma por exemplo!

    SqlCommand cmd = new SqlCommand(String.Format("UPDATE horarios SET {0}=@nome WHERE id=@id", vagaa), conn);            
    cmd.Parameters.AddWithValue("@nome", nome);
    cmd.Parameters.AddWithValue("@id", id);

     

    Fulvio Cezar Canducci Dias

    quarta-feira, 2 de abril de 2014 20:01
  • Deleted
    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quinta-feira, 3 de abril de 2014 09:26
  • Desculpa a pergunta, você precisa aprender o que ?

    Fúlvio, preciso aprender C#. Ou, caso não seja C#, a linguagem em que está o código postado pelo Bruno.

       


        José Diz     Belo Horizonte, MG - Brasil



    Opa José, mas, você é ferá em SQL Server, já vejo seus post aqui e são fantásticos, a linguagem é C# mesmo ...

    Ali na hora que ele fez:

    SqlCommand cmd = new SqlCommand("UPDATE horarios SET @vaga=@nome WHERE id=@id", conn);

    e passou os parametros:

    cmd.Parameters.AddWithValue("@vaga", vagaa);
    cmd.Parameters.AddWithValue("@nome", nome);
    cmd.Parameters.AddWithValue("@id", id);

    A SQL Gerada seria mais ou menos assim:

    Vamos supor que vagga seria campo1 e nome seria nome1 e id seria 1

    UPDATE horarios set 'campo1' = 'nome1' WHERE id = 1, causando um erro ... 

    Vlw ... Jose


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quarta-feira, 2 de abril de 2014 21:00
  • Vamos supor que vagaa seria campo1 e nome seria nome1 e id seria 1
    UPDATE horarios set 'campo1' = 'nome1' WHERE id = 1, causando um erro ...

    O comando enviado para o mecanismo de banco de dados do SQL Server seria esse, com as colunas entre apóstrofos?

    O Bruno cita que a execução do comando T-SQL retorna a mensagem de erro "Dados de cadeia ou binários seriam truncados". Seria algo como armazenar "1234567890" em coluna char/varchar com tamanho menor do que 10 caracteres ou então tentar armazenar 12345 em coluna tinynit.


        José Diz     Belo Horizonte, MG - Brasil



    Sim ... na verdade o Parameter ele faz conversão dos dados enviados como você enviou um texto, ele vai colocar apóstrofos por isso que eu dei a solução com String.Format para que ele troque dinamicamente o nome e consequentemente seria um replace ... 

    Exemplo

    USE [Db]
    GO
    
    /****** Object:  Table [dbo].[tabela1]    Script Date: 03/04/2014 10:31:21 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[tabela1](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[nome] [nvarchar](50) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    

    Tenho essa estrutura de tabela:

    Vou fazer o mesmo código do que foi colocado como pergunta:

    SqlConnection conexao = null;
    SqlCommand comando = null;
    try
    {
    	using (conexao = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=Db;Persist Security Info=True;User ID=sa;Password=senha"))
    	using (comando = conexao.CreateCommand())
    	{
    		conexao.Open();
    		comando.CommandText = "UPDATE tabela1 set @campo1=@valor1 WHERE id=@id";
    		comando.Parameters.AddWithValue("@campo1", "nome");
    		comando.Parameters.AddWithValue("@valor1", "nome de teste do erro de truncate");
    		comando.Parameters.AddWithValue("@id", 1);
    		comando.ExecuteNonQuery();
    		conexao.Close();
    	}
    }
    catch (SqlException ex)
    {
    	if (comando != null)
    	{
    		comando.Dispose();
    	}
    	if (conexao != null && conexao.State == System.Data.ConnectionState.Open)
    	{
    		conexao.Close();
    		conexao.Dispose();
    	}
    	System.Console.WriteLine(ex.Message);
    }
    System.Console.ReadKey();

    Olha o debug que rolou!!!

    Porque o Parameter só deve ser usado nas variaveis enviadas para a SQL que ele faz as devidas conversões String, DateTime, TimeSpan ... 


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quinta-feira, 3 de abril de 2014 13:34

Todas as Respostas

  • Deleted
    quarta-feira, 2 de abril de 2014 19:54
  • Realmente não vai dar certo porque ele vai achar que @vaga vai ficar assim na SQL 'nomedacoluna' e ai a sua SQL vai ta errada!!!

    Então você deve alterar de outra forma por exemplo!

    SqlCommand cmd = new SqlCommand(String.Format("UPDATE horarios SET {0}=@nome WHERE id=@id", vagaa), conn);            
    cmd.Parameters.AddWithValue("@nome", nome);
    cmd.Parameters.AddWithValue("@id", id);

     

    Fulvio Cezar Canducci Dias

    quarta-feira, 2 de abril de 2014 20:01
  • Deleted
    quarta-feira, 2 de abril de 2014 20:17
  • Eu preciso aprender isso...   

        José Diz     Belo Horizonte, MG - Brasil



    Desculpa a pergunta, você precisa aprender o que ?

    Fulvio Cezar Canducci Dias

    quarta-feira, 2 de abril de 2014 20:45
  • Deleted
    quarta-feira, 2 de abril de 2014 20:54
  • Desculpa a pergunta, você precisa aprender o que ?

    Fúlvio, preciso aprender C#. Ou, caso não seja C#, a linguagem em que está o código postado pelo Bruno.

       


        José Diz     Belo Horizonte, MG - Brasil



    Opa José, mas, você é ferá em SQL Server, já vejo seus post aqui e são fantásticos, a linguagem é C# mesmo ...

    Ali na hora que ele fez:

    SqlCommand cmd = new SqlCommand("UPDATE horarios SET @vaga=@nome WHERE id=@id", conn);

    e passou os parametros:

    cmd.Parameters.AddWithValue("@vaga", vagaa);
    cmd.Parameters.AddWithValue("@nome", nome);
    cmd.Parameters.AddWithValue("@id", id);

    A SQL Gerada seria mais ou menos assim:

    Vamos supor que vagga seria campo1 e nome seria nome1 e id seria 1

    UPDATE horarios set 'campo1' = 'nome1' WHERE id = 1, causando um erro ... 

    Vlw ... Jose


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quarta-feira, 2 de abril de 2014 21:00
  • Deleted
    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quinta-feira, 3 de abril de 2014 09:26
  • Vamos supor que vagaa seria campo1 e nome seria nome1 e id seria 1
    UPDATE horarios set 'campo1' = 'nome1' WHERE id = 1, causando um erro ...

    O comando enviado para o mecanismo de banco de dados do SQL Server seria esse, com as colunas entre apóstrofos?

    O Bruno cita que a execução do comando T-SQL retorna a mensagem de erro "Dados de cadeia ou binários seriam truncados". Seria algo como armazenar "1234567890" em coluna char/varchar com tamanho menor do que 10 caracteres ou então tentar armazenar 12345 em coluna tinynit.


        José Diz     Belo Horizonte, MG - Brasil



    Sim ... na verdade o Parameter ele faz conversão dos dados enviados como você enviou um texto, ele vai colocar apóstrofos por isso que eu dei a solução com String.Format para que ele troque dinamicamente o nome e consequentemente seria um replace ... 

    Exemplo

    USE [Db]
    GO
    
    /****** Object:  Table [dbo].[tabela1]    Script Date: 03/04/2014 10:31:21 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[tabela1](
    	[id] [int] IDENTITY(1,1) NOT NULL,
    	[nome] [nvarchar](50) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    

    Tenho essa estrutura de tabela:

    Vou fazer o mesmo código do que foi colocado como pergunta:

    SqlConnection conexao = null;
    SqlCommand comando = null;
    try
    {
    	using (conexao = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=Db;Persist Security Info=True;User ID=sa;Password=senha"))
    	using (comando = conexao.CreateCommand())
    	{
    		conexao.Open();
    		comando.CommandText = "UPDATE tabela1 set @campo1=@valor1 WHERE id=@id";
    		comando.Parameters.AddWithValue("@campo1", "nome");
    		comando.Parameters.AddWithValue("@valor1", "nome de teste do erro de truncate");
    		comando.Parameters.AddWithValue("@id", 1);
    		comando.ExecuteNonQuery();
    		conexao.Close();
    	}
    }
    catch (SqlException ex)
    {
    	if (comando != null)
    	{
    		comando.Dispose();
    	}
    	if (conexao != null && conexao.State == System.Data.ConnectionState.Open)
    	{
    		conexao.Close();
    		conexao.Dispose();
    	}
    	System.Console.WriteLine(ex.Message);
    }
    System.Console.ReadKey();

    Olha o debug que rolou!!!

    Porque o Parameter só deve ser usado nas variaveis enviadas para a SQL que ele faz as devidas conversões String, DateTime, TimeSpan ... 


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
    quinta-feira, 3 de abril de 2014 13:34