Пишу приложение на C# работающее в БД, которая лежит на SQL 2005 сервере.
Первый класс использую для создания соединения с БД, формирования DataSet и все что с этим связано.
Второй класс использую для описания товара и формирование запросов INSERT или UPDATE.
Третий класс(форма) ввод и отображение данных. (UI)
Так вот проблема следующая.
Одно их полей таблицы, содержащей данные на товар, имеет тип данных integer, но не обязательно к заполнению.
Это значит что там может содержаться целое число или "ничего"(я так понимаю это DBNull).
Если мне надо считать или добавить запись в таблицу, где это поле заполнено, то проблем нет. Происходит нормальная конвертация значения из типа string в тип int и все. Но если в поле таблицы ничего нет или я не заполняю это поле, то Студия ругается(и совершенно обосновано) на то что невозможно конвертировать string "" в int.
Как в такой ситуации поступают грамотные люди?
Привожу для наглядности соответствующие куски кода из класса описывающего товар и класса формы.
Класс описывающий товар (сокращенный вариант, только четыре поля)
- Код: Выделить всё
using System;
using System.Collections.Generic;
using System.Text;
namespace TestLuc.Classen
{
class Artikel
{
#region Declaration.
private AccessDB m_ArtikelDb;
private string m_Code;
private string m_Categorie;
private string m_Naam;
private int m_AantalMaandenGarantie;
#endregion
#region Constructors.
public Artikel()
{
m_ArtikelDb = new AccessDB(); // экземпляр класса доступа к БД
}
public Artikel(string ArtCode)
{
m_Code = ArtCode;
m_ArtikelDb = new AccessDB();
FillData();
}
#endregion
#region Methodes.
//средствами первого класса соединяемся с БД и создаем ДатаСет, в нем таблицу.
//Присваиваем значения свойствам данного класса значения из таблицы ДатаСет.
public void FillData()
{
string sql = "SELECT * FROM [tblArtikels_(verkoop)]";
sql += " WHERE [Code artikel] = '" + m_Code + "';";
m_ArtikelDb.fillDataSet("artikel", sql);
m_Categorie = m_ArtikelDb.DS.Tables["artikel"].Rows[0]["Categorie"].ToString();
m_Naam = m_ArtikelDb.DS.Tables["artikel"].Rows[0]["Naam artikel"].ToString();
m_AantalMaandenGarantie = Convert.ToInt32(m_ArtikelDb.DS.Tables["artikel"].Rows[0]["Aantal maanden garantie"]);
// при пустом поле в таблице возникает проблема присвоения значения этому свойству (КОНВЕРТАЦИЯ).
}
public void Update()
{
string sql = "UPDATE [tblArtikels_(verkoop)] SET ";
sql += "Categorie = '" + m_Categorie + "', ";
sql += "[Naam artikel] = '" + m_Naam + "', ";
sql += "[Aantal maanden garantie] = " + m_AantalMaandenGarantie;
sql += "WHERE [Code artikel] = '" + m_Code + "';";
m_ArtikelDb.doNonQuery(sql);
}
public void Insert()
{
string sql = "INSERT INTO [tblArtikels_(verkoop)] ([Code artikel], Categorie,";
sql += " [Naam artikel], [aantal maanden garantie])";
sql += " VALUES ('" + m_Code + "', '" + m_Categorie + "', '" ;
sql += m_Naam + "', " + m_AantalMaandenGarantie +")";
m_ArtikelDb.doNonQuery(sql);
}
#endregion
#region Properties.
public string Code
{
get { return m_Code; }
set { m_Code = value; }
}
public string Categorie
{
get { return m_Categorie; }
set { m_Categorie = value; }
}
public string Naam
{
get { return m_Naam; }
set { m_Naam = value; }
}
public int AantalMaandenGarantie // С этим свойством ПРОБЛЕМА !!!
{
get { return m_AantalMaandenGarantie; }
set { m_AantalMaandenGarantie = value; }
}
#endregion
}
}
Класс формы
- Код: Выделить всё
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace TestLuc.Artikelen
{
public partial class frmArtNieuw : Form
{
public frmArtNieuw()
{
InitializeComponent();
}
TestLuc.Classen.Artikel artikel;
private void btnToevoegen_Click(object sender, EventArgs e)
{
artikel = new TestLuc.Classen.Artikel();
artikel.Code = txtArtCode.Text;
artikel.Categorie = txtArtCat.Text;
artikel.Naam = txtArtNaam.Text;
artikel.AantalMaandenGarantie = Convert.ToInt32(txtArtGar.Text); // ВОТ ТУТ ПРОБЛЕМА !!!
artikel.Insert();
MessageBox.Show("Done");
}
private void btnWijzigen_Click(object sender, EventArgs e)
{
artikel = new TestLuc.Classen.Artikel();
artikel.Code = txtArtCode.Text;
artikel.Categorie = txtArtCat.Text;
artikel.Naam = txtArtNaam.Text;
artikel.AantalMaandenGarantie = Convert.ToInt32(txtArtGar.Text); // ВОТ ТУТ ПРОБЛЕМА !!!
artikel.Update();
MessageBox.Show("Done");
}
private void btnOpnieuw_Click(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
if (ctrl.Name.Substring(0, 3) == "txt")
{
ctrl.Text = "";
}
}
private void btnSluiten_Click(object sender, EventArgs e)
{
this.Close();
}
// поиск и отображение данных на товар по коду, ввели код - нажали Enter
private void txtArtCode_KeyPress(object sender, KeyPressEventArgs e)
{
if(txtArtCode.Text!="")
if (e.KeyChar == 13)
{
string artCode = txtArtCode.Text;
artikel = new TestLuc.Classen.Artikel(artCode);
txtArtCat.Text = artikel.Categorie;
txtArtNaam.Text = artikel.Naam;
txtArtGar.Text = artikel.AantalMaandenGarantie.ToString();
}
}
}
}
Всем заранее спасибо.
ЗЫ Надеюсь вопрос понятен. Надо что-то сообразить чтобы можно было записывать/считывать либо число, либо поле оставалось пустым.
ЗЫЗЫ И извиняюсь что код на Фламандском.