Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andre2308

[Resolvido] expects the parameter '@DATAALT', which was n

Recommended Posts

Bom...Espero que alguem possa me ajudar!!!

estou com um problema que eu envio uma instruçao de insercao sql para o servidor com seus respectivos parametros criados em código, sendo que eu nao envio todos, porque realmente alguns nao tem valores, ou seja, são nulls.

O erro está sendo acusado no parametro @DATAALT, que justamente é o primeiro campo que vai vazio.

Vai o código abaixo:

public void gravarInclusao(GrupoContasInformation obj)
		{
			try
			{
				string str = "INSERT INTO GRUPOCONTAS (DESCRICAO, STATUS, MARCA, DATA_INC, DATA_ALT, DATA_HAB)" +
				"VALUES (@DESCRICAO, @STATUS, @MARCA, @DATAINC, @DATAALT, @DATAHAB);  select @@IDENTITY;";
				DbCommand cmd = GenericDataAccess.CreateCommand(str);//eu crio as ligaçoes em outra camada, aqui eu só passo a instruçao, essa funçao retorna o command!
				cmd.Connection.Open();
				//
				DbParameter parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DESCRICAO";
				parameter.Value = obj.Descricao;
				parameter.DbType = DbType.String;
				cmd.Parameters.Add(parameter);

				//novo
				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@STATUS";
				parameter.Value = obj.Status;
				parameter.DbType = DbType.Boolean;
				cmd.Parameters.Add(parameter);
				//			
				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@MARCA";
				parameter.Value = obj.Marca;
				parameter.DbType = DbType.Boolean;
				cmd.Parameters.Add(parameter);
				//

				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DATAINC";
				parameter.Value = obj.Data_inc;
				parameter.DbType = DbType.DateTime;
				cmd.Parameters.Add(parameter);

				//if (obj.Data_alt != null)
			   // {
					parameter = cmd.CreateParameter();
					parameter.ParameterName = "@DATAALT";
					parameter.Value = obj.Data_alt;
					parameter.DbType = DbType.DateTime;
					cmd.Parameters.Add(parameter);
			   // }
			   // if (obj.Data_hab != null)
			   // {
					//
					parameter = cmd.CreateParameter();
					parameter.ParameterName = "@DATAHAB";
					parameter.Value = obj.Data_hab;
					parameter.DbType = DbType.DateTime;
					cmd.Parameters.Add(parameter);
			   // }	
					obj.id_grupoconta = Convert.ToInt32(cmd.ExecuteScalar());
					cmd.Connection.Close();
				
			}
			catch (DbException ex)
			{
				throw new Exception("Erro no Servidor: " + ex.Message);
			}
			catch (Exception ex)
			{
				throw new Exception("Erro genérico: " + ex.Message);
			}
	   
		}
Tentei de tudo até nao enviar os parametros quando fossem null, eu comentei as minhas tentativas!!!

Dá essa mensagem abaixo!

Erro no Servidor: The parameterized query '(@DESCRICAO nvarchar(16),@STATUS bit,@MARCA bit,@DATAINC datetim' expects the parameter '@DATAALT', which was not supplied.

 

 

Grato e aguardo com urgencia!!

 

Andre Raposo

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tipo não importa, pois nulo é nulo. No seu caso deixe o tipo DateTime já que é o tipo do campo na tabela.

 

Eu geralmente uso:

cmd.Parameters.AddWithValue("@NOME", minhaClasse.Nome)
cmd.Parameters.AddWithValue("@DATA", minhaClasse.DataAlteracao ?? DBNull.Value)
cmd.Parameters.AddWithValue("@EMAIL", minhaClasse.Email ?? DBNull.Value)
Faço um parâmetro por linha e não me preocupo com tipagem de dados, o próprio framework verifica o tipo de dado e faz o atribuição.

 

Obs.: Isso ai funciona 100% no SQL Server, nunca testei em outros bancos, mas deve funcionar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro amigo Oenning

Funcionou perfeitamente!!! coloquei o seguinte c''odigo!

public void gravarInclusao(GrupoContasInformation obj)
		{
			try
			{
				string str = "INSERT INTO GRUPOCONTAS (DESCRICAO, STATUS, MARCA, DATA_INC, DATA_ALT, DATA_HAB)" +
				"VALUES (@DESCRICAO, @STATUS, @MARCA, @DATAINC, @DATAALT, @DATAHAB);  select @@IDENTITY;";
				DbCommand cmd = GenericDataAccess.CreateCommand(str);
				cmd.Connection.Open();
				//
				DbParameter parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DESCRICAO";
				parameter.Value = obj.Descricao;
				parameter.DbType = DbType.String;
				cmd.Parameters.Add(parameter);

				//novo
				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@STATUS";
				parameter.Value = obj.Status;
				parameter.DbType = DbType.Boolean;
				cmd.Parameters.Add(parameter);
				//			
				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@MARCA";
				parameter.Value = obj.Marca;
				parameter.DbType = DbType.Boolean;
				cmd.Parameters.Add(parameter);
				//

				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DATAINC";
				parameter.Value = obj.Data_inc;
				parameter.DbType = DbType.DateTime;
				cmd.Parameters.Add(parameter);


				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DATAALT";
				if (obj.Data_alt != null)
					parameter.Value = obj.Data_alt;
				else
					parameter.Value = DBNull.Value;
				parameter.DbType = DbType.DateTime;
				cmd.Parameters.Add(parameter);

				parameter = cmd.CreateParameter();
				parameter.ParameterName = "@DATAHAB";
				if (obj.Data_hab != null)
					parameter.Value = obj.Data_hab;
				else
					parameter.Value = DBNull.Value;

				parameter.DbType = DbType.DateTime;
				cmd.Parameters.Add(parameter);

				obj.id_grupoconta = Convert.ToInt32(cmd.ExecuteScalar());
				cmd.Connection.Close();

			}
			catch (DbException ex)
			{
				throw new Exception("Erro no Servidor: " + ex.Message);
			}
			catch (Exception ex)
			{
				throw new Exception("Erro genérico: " + ex.Message);
			}
	   
		}

Quanto a usar a construçao do paramentro daquele jeito "cmd.Parameters.AddWithValue(.....)"

eu uso mas como estou usando DBCOmmand esse método nao habilita! habilita só o ADD

aí como eu já usei assim vou manter, já que você me explicou perfeitamente!! é que eu sou novo na linguagem C#

um imenso abraço e muito obrigado!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal.

 

Vai mais uma dica então, ao invés de:

if (obj.Data_hab != null)
	parameter.Value = obj.Data_hab;
else
	parameter.Value = DBNull.Value;

Você pode fazer:

 

parameter.Value = obj.Data_hab ?? DBNull.Value

O operador ?? vai atribuir o valor de obj.Data_hab para a propriedade parameter.Value apenas se obj.Data_hab não for nulo. Se for nulo, ele vai usar o valor DBNull.Value. Ou seja, os dois códigos fazer a mesma coisa, a diferença é que fica mais apresentável.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.