IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vložení null DateTime do SQL přes DataSet

Aktivity
Avatar
Poggy
Člen
Avatar
Poggy:9.5.2017 17:14

Ahoj, snažím se vytvořit nový řádek přes dataset a tabulce. V databázi mám položku DatumVypujceni a povolenou null hodnotu. Bohužel mi nejde vytvořit nový řádek v DataTable, Visualko mi nedovolí založil řádek s null hodnotou. Ví někdo jak založit null hodnotu do DataTable, viz kód:

using System;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Pokus_null_v_datetime_SQL
{
    public partial class Form1 : Form
    {
        LokalniSada sada = new LokalniSada(); // vlastní DataSet - silně typová lokální sada
        LokalniSadaTableAdapters.PokusNullTableAdapter adapter = new LokalniSadaTableAdapters.PokusNullTableAdapter();
        LokalniSada.PokusNullDataTable tabulka = new LokalniSada.PokusNullDataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void btnVloz_Click(object sender, EventArgs e)
        {
            DateTime? datum1 = Convert.ToDateTime(txtDatum.Text);
            DateTime datum = Convert.ToDateTime(txtDatum.Text);
            string text = txtText.Text;
            // ani jeden z následujících kódů co jsem vygooglil nefunguje, mám povolenou null hodnotu pro oba sloupce:
            LokalniSada.PokusNullRow novyRadek = tabulka.AddPokusNullRow(Convert.DBNull, text); // nelze
            LokalniSada.PokusNullRow novyRadek2 = tabulka.AddPokusNullRow(null, null);          // nelze
            LokalniSada.PokusNullRow novyRadek3 = tabulka.AddPokusNullRow(datum1, text);        // nelze
            LokalniSada.PokusNullRow novyRadek4 = tabulka.AddPokusNullRow(datum, null); // funguje jen toto
            adapter.Update(tabulka);
            MessageBox.Show("Uloženo.");
        }
    }
}

Děkuji za případnou radu.

 
Odpovědět
9.5.2017 17:14
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 13:46

Hodilo by se vidět tělo metody PokusNullData­Table() a AddPokusNullRow() :)

 
Nahoru Odpovědět
10.5.2017 13:46
Avatar
Poggy
Člen
Avatar
Odpovídá na termostat
Poggy:10.5.2017 16:01

Kódy z designera ADO.NET:
PokusNulldata­Table():

public PokusNullDataTable() {
                this.TableName = "PokusNull";
                this.BeginInit();
                this.InitClass();
                this.EndInit();
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            internal PokusNullDataTable(global::System.Data.DataTable table) {
                this.TableName = table.TableName;
                if ((table.CaseSensitive != table.DataSet.CaseSensitive)) {
                    this.CaseSensitive = table.CaseSensitive;
                }
                if ((table.Locale.ToString() != table.DataSet.Locale.ToString())) {
                    this.Locale = table.Locale;
                }
                if ((table.Namespace != table.DataSet.Namespace)) {
                    this.Namespace = table.Namespace;
                }
                this.Prefix = table.Prefix;
                this.MinimumCapacity = table.MinimumCapacity;
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            protected PokusNullDataTable(global::System.Runtime.Serialization.SerializationInfo info, global::System.Runtime.Serialization.StreamingContext context) :
                    base(info, context) {
                this.InitVars();
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public global::System.Data.DataColumn IdColumn {
                get {
                    return this.columnId;
                }
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public global::System.Data.DataColumn DatumColumn {
                get {
                    return this.columnDatum;
                }
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public global::System.Data.DataColumn TextColumn {
                get {
                    return this.columnText;
                }
            }

PokusNullRow():

internal PokusNullRow(global::System.Data.DataRowBuilder rb) :
                    base(rb) {
                this.tablePokusNull = ((PokusNullDataTable)(this.Table));
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public int Id {
                get {
                    return ((int)(this[this.tablePokusNull.IdColumn]));
                }
                set {
                    this[this.tablePokusNull.IdColumn] = value;
                }
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public System.DateTime Datum {
                get {
                    try {
                        return ((global::System.DateTime)(this[this.tablePokusNull.DatumColumn]));
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("The value for column \'Datum\' in table \'PokusNull\' is DBNull.", e);
                    }
                }
                set {
                    this[this.tablePokusNull.DatumColumn] = value;
                }
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public string Text {
                get {
                    try {
                        return ((string)(this[this.tablePokusNull.TextColumn]));
                    }
                    catch (global::System.InvalidCastException e) {
                        throw new global::System.Data.StrongTypingException("The value for column \'Text\' in table \'PokusNull\' is DBNull.", e);
                    }
                }
                set {
                    this[this.tablePokusNull.TextColumn] = value;
                }
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public bool IsDatumNull() {
                return this.IsNull(this.tablePokusNull.DatumColumn);
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public void SetDatumNull() {
                this[this.tablePokusNull.DatumColumn] = global::System.Convert.DBNull;
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public bool IsTextNull() {
                return this.IsNull(this.tablePokusNull.TextColumn);
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public void SetTextNull() {
                this[this.tablePokusNull.TextColumn] = global::System.Convert.DBNull;
            }
        }

AddPokuNullRow()

public void AddPokusNullRow(PokusNullRow row) {
                this.Rows.Add(row);
            }

            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
            public PokusNullRow AddPokusNullRow(System.DateTime Datum, string Text) {
                PokusNullRow rowPokusNullRow = ((PokusNullRow)(this.NewRow()));
                object[] columnValuesArray = new object[] {
                        null,
                        Datum,
                        Text};
                rowPokusNullRow.ItemArray = columnValuesArray;
                this.Rows.Add(rowPokusNullRow);
                return rowPokusNullRow;
            }

Ještě přídám screen ze SQL MS, kde je povoleno null. První screen byl z jiného projektu. Tam jsem se to snažil uskutečnit. DataSet jsem vytvářel až po vytvoření tabulky v SQL MS v obou případech. Doufám, že je to vše co potřebuješ.

 
Nahoru Odpovědět
10.5.2017 16:01
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 17:08

Ještě zkus takto:

LokalniSada.PokusNullRow novyRadek5 = tabulka.AddPokusNullRow(DBNull.Value, null);
 
Nahoru Odpovědět
10.5.2017 17:08
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 17:26

Oprava :) To nepůjde, ale můžeš vložit buď takto:

tabulka.Rows.Add(null, null, text); // První parametr je null, protože se jedná o identity.

Nebo si vytvořit prázdný row a naplnit mu jen potřebné sloupce:

var newRow = tabulka.NewRow();
newRow["Datum"] = null;
newRow["Text"] = text;
tabulka.Rows.Add(newRow);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
10.5.2017 17:26
Avatar
Poggy
Člen
Avatar
Odpovídá na termostat
Poggy:10.5.2017 18:37

Děkuji moc za radu. Takhle jsem to nezkoušel. Musel jsem tvůj kód malinko upravit. Program vyhodil vyjímku na hodnotě null u datumu, ale přes Convert.DBNull už vše proběhlo korektně. Chyba viz screen.

var newRow = tabulka.NewRow();
newRow["Datum"] = null; // zde upraveno
newRow["Text"] = text;
tabulka.Rows.Add(newRow);

Po úpravě již funguje:

var newRow = tabulka.NewRow();
newRow["Datum"] = Convert.DBNull;
newRow["Text"] = text;
tabulka.Rows.Add(newRow);
 
Nahoru Odpovědět
10.5.2017 18:37
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 19:13

Máš pravdu, musí to být DBNull.
A ještě pokud se chceš zbavit magic stringů, tak to můžeš zapsat takto:

var newRow = tabulka.NewPokusRow();
newRow.SetDatumNull(); // Tento řádek můžeš případně vynechat
newRow.Text = text;
tabulka.Rows.Add(newRow);
 
Nahoru Odpovědět
10.5.2017 19:13
Avatar
Poggy
Člen
Avatar
Odpovídá na termostat
Poggy:10.5.2017 19:40

Bohužel zápis newRow.Text = text nefunguje. Program spadne. I když by to bylo moc fajn. Je nutné to napsat takto:

var newRow = tabulka.NewRow();
            //newRow.SetDatumNull(); // Tento řádek lze vynechat
            newRow[2] = text; // eventuelně: newRow["Text"] = text;
            tabulka.Rows.Add(newRow);
            adapter.Update(tabulka);
            MessageBox.Show("Uloženo.");

Moc děkuji za rady a nové informace. :-)

 
Nahoru Odpovědět
10.5.2017 19:40
Avatar
termostat
Člen
Avatar
termostat:10.5.2017 19:57

Pozor, všimni si rozdílu, nevytvářej řádek takto:

var newRow = tabulka.NewRow();

ale takto:

var newRow = tabulka.NewPokusRow();

Pak budeš mít přístupné property Datum a Text a řádek můžeš vložit takto:

tabulka.AddPokusRow(newRow);
 
Nahoru Odpovědět
10.5.2017 19:57
Avatar
Poggy
Člen
Avatar
Odpovídá na termostat
Poggy:10.5.2017 20:18

Pravda. Já tvůj kód jen špatně implementoval. Já tam musím mít toto:

var newRow = tabulka.NewPokusNullRow(); // tabulka se jmenuje PokusNull a nikoliv jen Pokus

Moje chyba. To jsem při psaní přehlédl.

 
Nahoru Odpovědět
10.5.2017 20:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.