Тема: DatePicker не передає NULL до БД

Виникла проблема, при передачі інформації з DatePicker (WPF) до БД MS Sql. Якщо значення DatePicker дорівнює NULL отримую помилку. Як треба передати це значення, щоб якщо не потрібно заповнювати ту чи іншу дату, до БД передавалося значення NULL.

private void btnsave_Click(object sender, RoutedEventArgs e)
{
    FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);
    byte[] imgByteArr = new byte[fs.Length];
    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
    fs.Close();

    if (iDTextBox.Text != "")
    {

        using (con = new SqlConnection(constr))
        {
            con.Open();
            string sql = "insert into OKP(ID,Data_zap,Stat,Vid_rob,Sname,Name,Pobat,Day_nar,Gromad,Osvita,Prof_Pidgotov,Prof_Pidgotov_Name,Prof_Pidgotov_Diplom,Prof_Pidgotov_rik_zakin,Prof_Pidgotov_Nayk_styp,Ostan_misce_rob,Ostan_prof,Stag_rob_zadal_day,Stag_rob_zadal_month,Stag_rob_zadal_year,Vislyga_day,Vislyga_month,Vislyga_year,Zvil_date,Zvil_prich,Vidomist_pensi_viplat,Family_stan,Telephone,Tel_dodatkov,Email,Fakt_prog_oblast,Fakt_prog_misto_rayon,Fakt_prog_misto_selo,Fakt_prog_tip_vyl,Fakt_prog_name_vyl,Fakt_prog_bydinoc,Fakt_prog_kvartira,Fakt_prog_pochtov_index,Propisk_prog_oblast,Propisk_prog_misto_rayon,Propisk_prog_misto_selo,Propisk_prog_tip_vyl,Propisk_prog_name_vyl,Propisk_prog_bydinoc,Propisk_prog_kvartira,Propisk_prog_pochtov_index,Pas_seria,Pas_nom,Pas_kim_vidan,Pas_data_vidachi,Image_Prac,V_Grupa_oblic,V_Kategoria,V_Sklad,V_Zvannya,V_Spesial,V_Predatnist,V_Name_viyskomat_reestracia,V_Name_viyskomat_fact,V_Spec_oblic,Dodat_vidom,Zvil_rob_date,Zvil_rob_prich) Values(@ID,@Data_zap,@Stat,@Vid_rob,@Sname,@Name,@Pobat,@Day_nar,@Gromad,@Osvita,@Prof_Pidgotov,@Prof_Pidgotov_Name,@Prof_Pidgotov_Diplom,@Prof_Pidgotov_rik_zakin,@Prof_Pidgotov_Nayk_styp,@Ostan_misce_rob,@Ostan_prof,@Stag_rob_zadal_day,@Stag_rob_zadal_month,@Stag_rob_zadal_year,@Vislyga_day,@Vislyga_month,@Vislyga_year,@Zvil_date,@Zvil_prich,@Vidomist_pensi_viplat,@Family_stan,@Telephone,@Tel_dodatkov,@Email,@Fakt_prog_oblast,@Fakt_prog_misto_rayon,@Fakt_prog_misto_selo,@Fakt_prog_tip_vyl,@Fakt_prog_name_vyl,@Fakt_prog_bydinoc,@Fakt_prog_kvartira,@Fakt_prog_pochtov_index,@Propisk_prog_oblast,@Propisk_prog_misto_rayon,@Propisk_prog_misto_selo,@Propisk_prog_tip_vyl,@Propisk_prog_name_vyl,@Propisk_prog_bydinoc,@Propisk_prog_kvartira,@Propisk_prog_pochtov_index,@Pas_seria,@Pas_nom,@Pas_kim_vidan,@Pas_data_vidachi,@Image_Prac,@V_Grupa_oblic,@V_Kategoria,@V_Sklad,@V_Zvannya,@V_Spesial,@V_Predatnist,@V_Name_viyskomat_reestracia,@V_Name_viyskomat_fact,@V_Spec_oblic,@Dodat_vidom,@Zvil_rob_date,@Zvil_rob_prich)";
            using (cmd = new SqlCommand(sql, con))
            {
                cmd.Parameters.AddWithValue("@ID", iDTextBox.Text);
                cmd.Parameters.AddWithValue("@Data_zap", data_zapDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Stat", statComboBox.Text);
                cmd.Parameters.AddWithValue("@Vid_rob", vid_robComboBox.Text);
                cmd.Parameters.AddWithValue("@Sname", snameTextBox.Text);
                cmd.Parameters.AddWithValue("@Name", nameTextBox.Text);
                cmd.Parameters.AddWithValue("@Pobat", pobatTextBox.Text);
                cmd.Parameters.AddWithValue("@Day_nar", day_narDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Gromad", gromadTextBox.Text);
                cmd.Parameters.AddWithValue("@Osvita", osvitaComboBox.Text);
                cmd.Parameters.AddWithValue("@Prof_Pidgotov", prof_PidgotovComboBox.Text);
                cmd.Parameters.AddWithValue("@Prof_Pidgotov_Name", prof_Pidgotov_NameTextBox.Text);
                cmd.Parameters.AddWithValue("@Prof_Pidgotov_Diplom", prof_Pidgotov_DiplomTextBox.Text);
                cmd.Parameters.AddWithValue("@Prof_Pidgotov_rik_zakin", prof_Pidgotov_rik_zakinDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Prof_Pidgotov_Nayk_styp", prof_Pidgotov_Nayk_stypTextBox.Text);
                cmd.Parameters.AddWithValue("@Ostan_misce_rob", ostan_misce_robTextBox.Text);
                cmd.Parameters.AddWithValue("@Ostan_prof", ostan_profTextBox.Text);
                cmd.Parameters.AddWithValue("@Stag_rob_zadal_day", stag_rob_zadal_dayTextBox.Text);
                cmd.Parameters.AddWithValue("@Stag_rob_zadal_month", stag_rob_zadal_monthTextBox.Text);
                cmd.Parameters.AddWithValue("@Stag_rob_zadal_year", stag_rob_zadal_yearTextBox.Text);
                cmd.Parameters.AddWithValue("@Vislyga_day", vislyga_dayTextBox.Text);
                cmd.Parameters.AddWithValue("@Vislyga_month", vislyga_monthTextBox.Text);
                cmd.Parameters.AddWithValue("@Vislyga_year", vislyga_yearTextBox.Text);
                cmd.Parameters.AddWithValue("@Zvil_date", zvil_dateDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Zvil_prich", zvil_prichTextBox.Text);
                cmd.Parameters.AddWithValue("@Vidomist_pensi_viplat", vidomist_pensi_viplatTextBox.Text);
                cmd.Parameters.AddWithValue("@Family_stan", family_stanComboBox.Text);
                cmd.Parameters.AddWithValue("@Telephone", telephoneTextBox.Text);
                cmd.Parameters.AddWithValue("@Tel_dodatkov", tel_dodatkovTextBox.Text);
                cmd.Parameters.AddWithValue("@Email", emailTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_oblast", fakt_prog_oblastTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_misto_rayon", fakt_prog_misto_rayonTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_misto_selo", fakt_prog_misto_seloTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_tip_vyl", fakt_prog_tip_vylComboBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_name_vyl", fakt_prog_name_vylTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_bydinoc", fakt_prog_bydinocTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_kvartira", fakt_prog_kvartiraTextBox.Text);
                cmd.Parameters.AddWithValue("@Fakt_prog_pochtov_index", fakt_prog_pochtov_indexTextBox.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_oblast", propisk_prog_oblastTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_misto_rayon", propisk_prog_misto_rayonTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_misto_selo", propisk_prog_misto_seloTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_tip_vyl", propisk_prog_tip_vylComboBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_name_vyl", propisk_prog_name_vylTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_bydinoc", propisk_prog_bydinocTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_kvartira", propisk_prog_kvartiraTextBox1.Text);
                cmd.Parameters.AddWithValue("@Propisk_prog_pochtov_index", propisk_prog_pochtov_indexTextBox1.Text);
                cmd.Parameters.AddWithValue("@Pas_seria", pas_seriaTextBox.Text);
                cmd.Parameters.AddWithValue("@Pas_nom", pas_nomTextBox.Text);
                cmd.Parameters.AddWithValue("@Pas_kim_vidan", pas_kim_vidanTextBox.Text);
                cmd.Parameters.AddWithValue("@Pas_data_vidachi", pas_data_vidachiDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Image_Prac", imgByteArr);
                cmd.Parameters.AddWithValue("@V_Grupa_oblic", v_Grupa_oblicTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Kategoria", v_KategoriaTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Sklad", v_SkladTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Zvannya", v_ZvannyaTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Spesial", v_SpesialTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Predatnist", v_PredatnistTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Name_viyskomat_reestracia", v_Name_viyskomat_reestraciaTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Name_viyskomat_fact", v_Name_viyskomat_factTextBox.Text);
                cmd.Parameters.AddWithValue("@V_Spec_oblic", v_Spec_oblicTextBox.Text);
                cmd.Parameters.AddWithValue("@Dodat_vidom", dodat_vidomTextBox.Text);
                cmd.Parameters.AddWithValue("@Zvil_rob_date", zvil_rob_dateDatePicker.SelectedDate);
                cmd.Parameters.AddWithValue("@Zvil_rob_prich", zvil_rob_prichTextBox.Text);
                cmd.ExecuteNonQuery();
                con.Close();

                MessageBox.Show("Користувач '" + snameTextBox.Text + "' '" + nameTextBox.Text + "' доданий", "Сповіщення", MessageBoxButton.OK, MessageBoxImage.Information);
            }
        }
    }
    else MessageBox.Show("Введіть Ідентифікаційний код!", "Помилка", MessageBoxButton.OK, MessageBoxImage.Error);
}
Post's attachments

Безымянный.png 305.47 kb, 289 downloads since 2016-05-18 

2

Re: DatePicker не передає NULL до БД

1900-01-01

3

Re: DatePicker не передає NULL до БД

Можливо не зрозуміли, але якщо мені потрібна пуста комірка в БД (далі для використання звітів) то потрібно щоб ну не було жодних даних. При заповнені вручну MS SQL  дає таку можливість.

4

Re: DatePicker не передає NULL до БД

select
...
if fielddate is null or fielddate = '1900-01-01' then '' else fielddate ...

5 Востаннє редагувалося koala (18.05.2016 12:31:24)

Re: DatePicker не передає NULL до БД

C#-івський null - це не SQL-ний NULL. Робіть

.AddWithValue("@Data_zap", data_zapDatePicker.SelectedDate ?? DBNull.Value)

чи ще краще

.AddWithValue("@Data_zap", data_zapDatePicker.SelectedDate ?? SqlDateTime.Null)

щоб уникнути зайвого перетворення.
Крім того, AddWithValue повертає this, тому можна робити так:

cmd.Parameters.AddWithValue(...)
              .AddWithValue(...)
              .AddWithValue(...)
              ...
              .AddWithValue(...);

що значно естетичніше.

А ще можна прив'язувати елементи форми до таблиці, що часто дозволяє взагалі уникати коду в тривіальних випадках.

Подякували: lichmanmaksim, leofun012

6

Re: DatePicker не передає NULL до БД

koala написав:

C#-івський null - це не SQL-ний NULL. Робіть

.AddWithValue("@Data_zap", data_zapDatePicker.SelectedDate ?? DBNull.Value)

чи ще краще

.AddWithValue("@Data_zap", data_zapDatePicker.SelectedDate ?? SqlDateTime.Null)

+1
Використовуйте спеціальні типи для SQLних NULL

декілька зауважень до коду TC. Хорошим стилем програмування є відділення UI layer від Business Logic Layeyer і тим більше від Data Access Layer.
Я розумію, що це може буди якась учбова робота, де це все не потрібно. Але навіть в цьому випадку можна заюзати якийсь LINQ2SQL або EF, щоб не дрочитися з передачею параметрів та полів в ADO.NET

Звичайно, краще юзати ADO.NET, якщо для вас критична швидкість роботи з БД, але і в цьому випадку можна пошукати якусь ORM, або попробувати і самому зліпити якусь псевдо ORM на ADO.NET   :[ , якщо маєте більш-менш серйозний проект з базою даних.

Подякували: lichmanmaksim, leofun012

7 Востаннє редагувалося lichmanmaksim (21.05.2016 13:57:32)

Re: DatePicker не передає NULL до БД

З DatePicker все працює, дякую! Тепер виникло питання з полем image. Як передати Null SQL-лівський до БД? Пробую тим же методом але замість sqlDatatin використовую sqlbyte так, як конвертується в масив байтів.
_______________________________________________________________________________________
знайшов на теренах інтернету

if (btnBrowseClick == false)
{
    cmd.Parameters.Add("@Image_Prac", SqlDbType.VarChar).Value = SqlChars.Null;
}
else
{
    FileStream fs = new FileStream(imageName, FileMode.Open, FileAccess.Read);
    byte[] imgByteArr = new byte[fs.Length];
    fs.Read(imgByteArr, 0, Convert.ToInt32(fs.Length));
    fs.Close();
    cmd.Parameters.AddWithValue("@Image_Prac", imgByteArr);
}