void ButtonAddClick(object sender, EventArgs e)
{
//
StringBuilder strErrorMsg = new StringBuilder();
if(!Validator.checkRequired(this.textBoxQuantity.Text))
{
strErrorMsg.Append("必须填写医保卡号!\n");
}
            if ((!Validator.checkRequired(this.textBoxQuantity.Text) && !Validator.checkRequired(this.textBoxPrice.Text))||(!Validator.checkRequired(this.textBoxQuantity.Text) && !Validator.checkDouble(this.textBoxPrice.Text)))
            {
                strErrorMsg.Append("------------------------\n");
            }
            if (!Validator.checkRequired(this.textBoxPrice.Text) || !Validator.checkDouble(this.textBoxPrice.Text))
            {
                strErrorMsg.Append("必须填写医保优惠的金额,而且金额必须是浮点数!\n");
            }             string tB = textBoxQuantity.Text;
            string medicarenumberCount = ("select count(*) from medicare where medicare_number = '" + tB + "'");
            int medicarenumberRecord = AccessDBUtil.ExecuteScalar(medicarenumberCount);
            if (medicarenumberRecord >= 1)
            {
                strErrorMsg.Append("--------------------------------------\n");
                strErrorMsg.Append("非常抱歉,这位患者已经享受过医保优惠!\n");
                strErrorMsg.Append("--------------------------------------\n");
            }
            
            if (strErrorMsg.Length > 0)
            {
                MessageBox.Show(strErrorMsg.ToString(), "出错提示");
                return;
            }
//
Product p= new Product();
            p.Medicare_name = this.textBoxName.Text.Trim();
            p.Medicare_number = this.textBoxQuantity.Text.Trim();
            p.Medicare_price = Double.Parse(this.textBoxPrice.Text.Trim());
p.SaleDate=this.dateTimePicker1.Value;
            if (this.radioButtonChecked.Checked)
            {
                p.CheckedFlag = "男";
            }
            else
            {
                p.CheckedFlag = "女";
            }
            //p.CheckedFlag=this.radioButtonChecked.Checked;
int id = ProductDao.insert(p);
this.textBoxId.Text=id.ToString();
//
p = ProductDao.getById(id);
AddProduct(p);
}
private void AddProduct(Product p)
{
ListViewItem lvi = this.listView1.Items.Add(p.Id.ToString());
            lvi.SubItems.Add(p.Medicare_name);
            lvi.SubItems.Add(p.Medicare_number.ToString());
            lvi.SubItems.Add(p.Medicare_price.ToString());
lvi.SubItems.Add(p.SaleDate.ToString());
lvi.SubItems.Add(p.CheckedFlag);
}以上是我写的一段“提交”按钮的代码。在提交数据之前,将会对提交的内容做一些判断,以确定要输入的数据是否符合要求。上面代码的红色部分的作用是,当输入的新记录的【Medicare_number】字段,在数据库中已经存在,将不能将新纪录插入数据库,并且报错“非常抱歉,这位患者已经享受过医保优惠!”。至此,程序没有错误。===================================================现在,我想将错误的提示修改一下,在指出不能插入记录的同时,报错信息中显示数据库中已经存在的这条记录的ID号是多少,于是,我将红色部分的代码改为:
string tB = textBoxQuantity.Text;
            string medicarenumberCount = ("select count(*) from medicare where medicare_number = '" + tB + "'");
            string nochmalId = ("select id from medicare where medicare_number = '" + tB + "'");
            int medicarenumberRecord = AccessDBUtil.ExecuteScalar(medicarenumberCount);
            int nochmalidRecord = AccessDBUtil.ExecuteScalar(nochmalId);
            if (medicarenumberRecord >= 1)
            {
                strErrorMsg.Append("--------------------------------------\n");
                strErrorMsg.Append("非常抱歉,这位患者已经享受过医保优惠!\n请查看ID号为【" + nochmalidRecord + "】的记录!\n");
                strErrorMsg.Append("--------------------------------------\n");
            }再次运行程序的时候,当数据库中存在这条记录的时候,软件仍然正常,提示“非常抱歉,这位患者已经享受过医保优惠!\n请查看ID号为【6】的记录!”。
但是,当数据库中不存在这条新记录的话,即要插入的新数据完全符合要求的情况下,软件反而报错了。错误如下:
************** 异常文本 **************
System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 Common.AccessDBUtil.ExecuteScalar(String sql, OleDbParameter[] parameters) 位置 C:\WangYing\China\医保软件\MedicareApplication\AccessDBUtil.cs:行号 89
   在 Common.AccessDBUtil.ExecuteScalar(String sql) 位置 C:\WangYing\China\医保软件\MedicareApplication\AccessDBUtil.cs:行号 95
   在 AccessDBUtilDemo.MainForm.ButtonAddClick(Object sender, EventArgs e) 位置 C:\WangYing\China\医保软件\MedicareApplication\MainForm.cs:行号 72
   在 System.Windows.Forms.Control.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnClick(EventArgs e)
   在 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   在 System.Windows.Forms.Button.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

解决方案 »

  1.   

    当数据库中不存在这条新记录的话!此时运行sql:"select id from medicare where medicare_number = '" + tB + "'"
    得到的表一定是0行了,ExecuteScalar()的作用是结果集中第一行的第一列。出错!!!再取表中数据时,先确定表是否为null或者Rows.Count > 0
      

  2.   

    当数据库中不存在这条新记录的话,
    string medicarenumberCount = ("select count(*) from medicare where medicare_number = '" + tB + "'");
    medicarenumberCount 的值是0。
    下面的If语句中间的内容将跳过。string nochmalId = ("select id from medicare where medicare_number = '" + tB + "'");
    这一句nochmalId即使被赋值了,我们可不可以理解为程序中没有这一句?在数据库中不存在这条新记录的情况下。
      

  3.   

    直接select ID from ... where ...
    如果ExecuteScalar()得到的结果为空 就可以进行添加操作
    如果不为空 提示已经存在
      

  4.   


    不好意思,点错了扔板砖了。判断记录是否存在,开始要靠medicare_number的,因为这个是医保卡帐号,每个病人唯一的。病人来了,我也只能输入他的医保卡号来判断他是否已经登记过。但是查找这条 记录的位置的时候,我有需要select id了
      

  5.   

    string tB = textBoxQuantity.Text;
    string nochmalId = ("select id from medicare where medicare_number = '" + tB + "'");
    int nochmalidRecord = AccessDBUtil.ExecuteScalar(nochmalId);你的意思是不是这样写?
    然后条件语句判断nochmalidRecord 的返回值?前面就不要再select count了
      

  6.   

    添加新纪录的时候,如果数据库中没有重复记录,则会抛出异常。
    public static int ExecuteScalar(string sql,OleDbParameter[] parameters)
            {
             //Debug.WriteLine(sql);
                using (OleDbConnection connection = new OleDbConnection(connectionString))
                {
                    OleDbCommand cmd = new OleDbCommand(sql, connection);
                    try
                    {
                        connection.Open();
                        if(parameters!=null) cmd.Parameters.AddRange(parameters);
                        int value = Int32.Parse(cmd.ExecuteScalar().ToString());
                        return value;
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                }
            }