Andre2308 0 Denunciar post Postado Março 15, 2009 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
Oenning 0 Denunciar post Postado Março 15, 2009 Para enviar um valor nulo ao banco use: parameter.Value = DBNull.Value; Compartilhar este post Link para o post Compartilhar em outros sites
Andre2308 0 Denunciar post Postado Março 15, 2009 Oenning No meu caso como ficaria o DBType?? grato Compartilhar este post Link para o post Compartilhar em outros sites
Oenning 0 Denunciar post Postado Março 15, 2009 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
Andre2308 0 Denunciar post Postado Março 15, 2009 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
Oenning 0 Denunciar post Postado Março 15, 2009 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