Usuário com melhor resposta
Comando UPDATE com nome da coluna variável

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
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);
- Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 3 de abril de 2014 00:05
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
Deleted
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
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
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
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 ...
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
Todas as Respostas
-
Deleted
- Sugerido como Resposta Wennder SantosMVP quarta-feira, 2 de abril de 2014 20:03
-
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);
- Sugerido como Resposta Samuel Rodrigues dos Anjos quinta-feira, 3 de abril de 2014 00:05
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
-
-
-
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
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
Deleted
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11
-
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 ...
- Marcado como Resposta Giovani Cr terça-feira, 8 de abril de 2014 19:11