none
enviar textbox com null para a bd RRS feed

  • Pergunta

  • Olá,

    Tenho varios campos datetime na bd. Tenho no projecto que estou a fazer varias textboxs que são preenchidas com datas. O problema é que as textboxs não são de preenchimento obrigatorio, e por exempl,  quando preencho uma para gravar na bd, a que eu preencho grava bem e os outros campos ficam 0000-00-00 00:00:00.

    Como posso mantelos como null? 

    domingo, 15 de dezembro de 2013 13:11

Respostas

  • Exemplo:

    Tenho uma classe com esse Layout:

    public class Datas
    {
    	public int Id { get; set; }
    	public DateTime? Data { get; set; }
    }

    Ou seja a Data pode ser do tipo null ou com valor DateTime

    Logo Abaixo a rotina com property:

    Datas dta = new Datas();
    dta.Data = null;
    using (MySqlConnection Connection = new MySqlConnection("Server=localhost;Database=estagio;Uid=root;Pwd=senha;"))
    using (MySqlCommand Command = Connection.CreateCommand())
    {
    	Connection.Open();
    	Command.CommandType = CommandType.Text;
    	Command.CommandText = "INSERT INTO datas (data) VALUES(@data);";
    	Command.Parameters.Add("@data", MySqlDbType.DateTime).Value = (object)dta.Data ?? DBNull.Value;
    	Command.ExecuteNonQuery();
    	Connection.Close();
    }

    Perceba que nessa linha é toda a charada a questão:

    Command.Parameters.Add("@data", MySqlDbType.DateTime).Value = (object)dta.Data ?? DBNull.Value;

    ali no ?? (null Coalescing) ele vai mandar se a data for diferente de NULL manda a dta.Data se não o DBNull.Value ( esse cara é o responsável de dizer ao MysqlCommand que é para gravar null)

    é assim que se trabalha com valores de banco que pode conter null ou o próprio valor!

    Veja na imagem que o id = 2 é null e o id = 1 tem a data!!!

    acredito ser isso sua dúvida!


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr segunda-feira, 23 de dezembro de 2013 14:23
    terça-feira, 17 de dezembro de 2013 13:04

Todas as Respostas

  • DiogoMBM,

    Textbox não aceitam valores Null ele fica como "", para você gravar null tem que fazer um tratamento, tenta assim :

    GravarNoBanco = String.IsNullOrWhiteSpace(SeuTextBox.Text) ? null : SeuTextBox.Text;



    Diego Almeida Barreto
    System Analyst / Software Developer

    domingo, 15 de dezembro de 2013 13:24
  • Não funcionou

    Eu tenho o codigo assim:

    É um exemplo, estou a usar

     if (txtBM3.Text != "")
                        {
                            dtBM3 = Convert.ToDateTime(txtBM3.Text).ToString("yyyy/MM/dd");
                        }
                        else
                        {
                            dtBM3 = String.IsNullOrWhiteSpace(txtBM3.Text) ? null : txtBM3.Text;
                        }

    mais textboxs.

    domingo, 15 de dezembro de 2013 14:13
  • Se for colocar valores Null no banco é com 

    DBNull.Value

    Nesse video criado por mim tem um item que é gravado dessa forma!

    http://www.youtube.com/watch?v=N6NEo8zf60c

    Além da nomeclatura DAO!


    Fulvio Cezar Canducci Dias

    domingo, 15 de dezembro de 2013 14:50
  • como ficaria no meu caso
    domingo, 15 de dezembro de 2013 14:57
  • if (String.IsNullORWhiteSpace(txtBM3.Text) == false)
    {
    	dtBM3 = Convert.ToDateTime(txtBM3.Text).ToString("yyyy/MM/dd");
    }
    else
    {
    	dtBM3 = null;
    }

    Só que na hora que chega no banco na instrução se vai ter que usar DBNull.Value se o DtBM3 for do tipo null, se não vai dar um exception!

    Outra coisa não precisa converter na mão eu to achando que ta usando MySQL e por isso ta fazendo assim:

    Convert.ToDateTime(txtBM3.Text).ToString("yyyy/MM/dd")

    ou seja, formatando a data.

    Assisti meu video que se vai entender serve para qualquer banco:

    http://www.youtube.com/watch?v=N6NEo8zf60c


    Fulvio Cezar Canducci Dias


    domingo, 15 de dezembro de 2013 15:03
  • estou a usar o mysql.

    Continua a gravar os zeros na mesma.

    domingo, 15 de dezembro de 2013 15:12
  • Como ta gravando ?

    Qual seu conjunto de código de gravação?


    Fulvio Cezar Canducci Dias

    domingo, 15 de dezembro de 2013 15:15
  • AS texboxs preenchidads com datas grava as datas, as outras que não sao preenchidas grava assim 0000-00-00 00:00:00
    • Editado DiogoMBM domingo, 15 de dezembro de 2013 15:32
    domingo, 15 de dezembro de 2013 15:32
  • AS texboxs preenchidads com datas grava as datas, as outras que não sao preenchidas grava assim 0000-00-00 00:00:00

    Então, por favor, cade seu código SQL ? como ta gravando o MysqlCommand ???

    Se você não disser isso fica dificil ajudar a partir de agora !!!


    Fulvio Cezar Canducci Dias

    domingo, 15 de dezembro de 2013 19:41
  • Não funcionou

    Eu tenho o codigo assim:

    É um exemplo, estou a usar

     if (txtBM3.Text != "")
                        {
                            dtBM3 = Convert.ToDateTime(txtBM3.Text).ToString("yyyy/MM/dd");
                        }
                        else
                        {
                            dtBM3 = String.IsNullOrWhiteSpace(txtBM3.Text) ? null : txtBM3.Text;
                        }

    mais textboxs.


    Cara não era pra fazer assim não, vc ta fazendo uma salada de conversões..... posta seu código todo ai pra gente conseguir fazer de acordo com o que vc tem blxxx


    Diego Almeida Barreto
    System Analyst / Software Developer

    domingo, 15 de dezembro de 2013 20:31
  • Olá,

    Desculpem a demora.

     if (btnBM.Text.Trim() == "Gravar")
                    {
                        string dtBM1 = Convert.ToDateTime(txtBM1.Text).ToString("yyyy/MM/dd");
                        if (txtBM2.Text != "")
                        {
                            dtBM2 = Convert.ToDateTime(txtBM2.Text).ToString("yyyy/MM/dd");
                        }
                        else
                        {
                            dtBM2 = null;
                        }
                        if (String.IsNullOrWhiteSpace(txtBM3.Text) == false)
                        {
                            dtBM3 = null;
                        }
                        else
                        {
                            dtBM3 = null;
                        }
                        if (txtBM4.Text != "")
                        {
                            dtBM4 = Convert.ToDateTime(txtBM4.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM5.Text != "")
                        {
                            dtBM5 = Convert.ToDateTime(txtBM5.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM6.Text != "")
                        {
                            dtBM6 = Convert.ToDateTime(txtBM6.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM7.Text != "")
                        {
                            dtBM7 = Convert.ToDateTime(txtBM7.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM8.Text != "")
                        {
                            dtBM8 = Convert.ToDateTime(txtBM8.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM9.Text != "")
                        {
                            dtBM9 = Convert.ToDateTime(txtBM9.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM10.Text != "")
                        {
                            dtBM10 = Convert.ToDateTime(txtBM10.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM11.Text != "")
                        {
                            dtBM11 = Convert.ToDateTime(txtBM11.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM12.Text != "")
                        {
                            dtBM12 = Convert.ToDateTime(txtBM12.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM13.Text != "")
                        {
                            dtBM13 = Convert.ToDateTime(txtBM13.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM14.Text != "")
                        {
                            dtBM14 = Convert.ToDateTime(txtBM14.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM15.Text != "")
                        {
                            dtBM15 = Convert.ToDateTime(txtBM15.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM16.Text != "")
                        {
                            dtBM16 = Convert.ToDateTime(txtBM16.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM17.Text != "")
                        {
                            dtBM17 = Convert.ToDateTime(txtBM17.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM18.Text != "")
                        {
                            dtBM18 = Convert.ToDateTime(txtBM18.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM19.Text != "")
                        {
                            dtBM19 = Convert.ToDateTime(txtBM19.Text).ToString("yyyy/MM/dd");
                        }
                        if (txtBM20.Text != "")
                        {
                            dtBM20 = Convert.ToDateTime(txtBM20.Text).ToString("yyyy/MM/dd");
                        }
    
                        //string sql = "UPDATE mferias SET diaBM1='" + dtBM1 + "',diaBM2='" + dtBM2 + "',diaBM3='" + dtBM3 + "',diaBM4='" + dtBM4 + "',diaBM5='" + dtBM5 + "',diaBM6='" + dtBM6 + "',diaBM7='" + dtBM7 + "',diaBM8='" + dtBM8 + "',diaBM9='" + dtBM9 + "',diaBM10='" + dtBM10 + "',diaBM11='" + dtBM11 + "',diaBM12='" + dtBM12 + "',diaBM13='" + dtBM13 + "',diaBM14='" + dtBM14 + "',diaBM15='" + dtBM15 + "',diaBM16='" + dtBM16 + "',diaBM17='" + dtBM17 + "',diaBM18='" + dtBM18 + "',diaBM19='" + dtBM19 + "',diaBM20='" + dtBM20 + "'WHERE user = '" + userTB.Text + "'";
                        string sql = "UPDATE mferias SET diaBM1='" + dtBM1 + "',diaBM2='" + dtBM2 + "',diaBM3='" + dtBM3 + "',diaBM4='" + dtBM4 + "',diaBM5='" + dtBM5 + "',diaBM6='" + dtBM6 + "',diaBM7='" + dtBM7 + "',diaBM8='" + dtBM8 + "',diaBM9='" + dtBM9 + "',diaBM10='" + dtBM10 + "',diaBM11='" + dtBM11 + "',diaBM12='" + dtBM12 + "',diaBM13='" + dtBM13 + "',diaBM14='" + dtBM14 + "',diaBM15='" + dtBM15 + "',diaBM16='" + dtBM16 + "',diaBM17='" + dtBM17 + "',diaBM18='" + dtBM18 + "',diaBM19='" + dtBM19 + "',diaBM20='" + dtBM20 + "'WHERE user = '" + userTB.Text + "'and tpmarca='" + tpmarca + "'";
                        //System.Threading.Thread.Sleep(3000);
                        GetData(sql);

    segunda-feira, 16 de dezembro de 2013 14:44
  • é o que eu sempre digo!

    Use Paramenters ...

    http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqlcommand.parameters(v=vs.110).aspx

    Você fazendo da maneira correta não vai ter tanto trabalho como ta tendo!

    Agora do seu jeito tem a gambiarra de SQL (desculpa essa forma me deixa com uma sensação de impotência mediante uma ferramenta tão completa)

    DateTime Data;
    if (String.IsNullORWhiteSpace(txtBM20.Text) == false && DateTime.TryParse(txtBM20.Text, out Data))
    {
    	dtBM20 = "'" + Convert.ToDateTime(txtBM20.Text).ToString("yyyy/MM/dd") + "'";
    } else {
    	dtBM20 = "NULL";
    }
    
    string sql = "UPDATE mferias SET diaBM1=" + dtBM1 + " WHERE user = '" + userTB.Text + "' and tpmarca='" + tpmarca + "'";

    Isso seria para um campo, inclusive as aspas simples são colocadas dentro da variavel se a data é verdade

    e quando for NULL sem aspas!

    Teste


    Fulvio Cezar Canducci Dias

    segunda-feira, 16 de dezembro de 2013 14:57
  • DiogoMBM,

    Tenta seguir essa linha pra ver se funciona:

                string dtBM2,dtBM3;
    
                dtBM2 = string.IsNullOrWhiteSpace(txtBM2.Text) ? null : Convert.ToDateTime(txtBM2.Text).ToShortDateString();
    
                dtBM3 = string.IsNullOrWhiteSpace(txtBM3.Text) ? null : Convert.ToDateTime(txtBM2.Text).ToShortDateString();
    
                string sql = "UPDATE mferias SET diaBM2=" + dtBM2 + ",diaBM3=" + dtBM3 + "";



    Diego Almeida Barreto
    System Analyst / Software Developer

    segunda-feira, 16 de dezembro de 2013 15:08
  • Na bd vou ter que alterar o tipo do campo?. Tenho os campos do tipo datetime.
    segunda-feira, 16 de dezembro de 2013 15:19
  • NÃO , deixa o banco do jeito que esta..... vc já fez o teste ???????????????


    Diego Almeida Barreto
    System Analyst / Software Developer

    segunda-feira, 16 de dezembro de 2013 15:31
  • só vou poder testar daqui a 3 horas.

    Dp digo como correu. Obrigado.

    segunda-feira, 16 de dezembro de 2013 15:33
  • Só pra reforçar isso é web utilize Parameters ou vai ter problemas futuros.
    segunda-feira, 16 de dezembro de 2013 15:44
  • Só pra reforçar isso é web utilize Parameters ou vai ter problemas futuros.
    Na verdade Caro Daniel Brito system, ele já ta tendo esses problemas pela não utilização do Parameters e isso deveria ser usado em qualquer ambiente de desenvolvimento (web, desktop ...)

    Fulvio Cezar Canducci Dias

    segunda-feira, 16 de dezembro de 2013 15:47
  • Continua sem dar das duas maneiras.
    terça-feira, 17 de dezembro de 2013 08:56
  • Então usa parameters como o Daniel e o Fúlvio falaram e acaba de uma vez com o problema!!!! ficar concatenando variável vai so atrasar o seu lado


    Diego Almeida Barreto
    System Analyst / Software Developer

    terça-feira, 17 de dezembro de 2013 12:29
  • Exemplo:

    Tenho uma classe com esse Layout:

    public class Datas
    {
    	public int Id { get; set; }
    	public DateTime? Data { get; set; }
    }

    Ou seja a Data pode ser do tipo null ou com valor DateTime

    Logo Abaixo a rotina com property:

    Datas dta = new Datas();
    dta.Data = null;
    using (MySqlConnection Connection = new MySqlConnection("Server=localhost;Database=estagio;Uid=root;Pwd=senha;"))
    using (MySqlCommand Command = Connection.CreateCommand())
    {
    	Connection.Open();
    	Command.CommandType = CommandType.Text;
    	Command.CommandText = "INSERT INTO datas (data) VALUES(@data);";
    	Command.Parameters.Add("@data", MySqlDbType.DateTime).Value = (object)dta.Data ?? DBNull.Value;
    	Command.ExecuteNonQuery();
    	Connection.Close();
    }

    Perceba que nessa linha é toda a charada a questão:

    Command.Parameters.Add("@data", MySqlDbType.DateTime).Value = (object)dta.Data ?? DBNull.Value;

    ali no ?? (null Coalescing) ele vai mandar se a data for diferente de NULL manda a dta.Data se não o DBNull.Value ( esse cara é o responsável de dizer ao MysqlCommand que é para gravar null)

    é assim que se trabalha com valores de banco que pode conter null ou o próprio valor!

    Veja na imagem que o id = 2 é null e o id = 1 tem a data!!!

    acredito ser isso sua dúvida!


    Fulvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr segunda-feira, 23 de dezembro de 2013 14:23
    terça-feira, 17 de dezembro de 2013 13:04