Diskuze: Vložení null DateTime do SQL přes DataSet
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Poggy:10.5.2017 16:01
Kódy z designera ADO.NET:
PokusNulldataTable():
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š.
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);
+20 Zkušeností
+2,50 Kč
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);
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);
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.
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.
Zobrazeno 10 zpráv z 10.