WPF中datagridview控件中输入的数据在保存到SQL Server 2010 数据库时如何处理各个字段唯一性约束的异常情况,不想再通过查询语句及if语句判断了,太麻烦了,能不能利用try catch语句直接获取异常然后抛出呢?但是异常如何获取呢?还请大家告知~~~
datagridview控件数据保存的部分代码如下:
string code = txtCode.Text;
                    string date = txtDate.Text;
                    string Dep = cmbDep.SelectedValue.ToString();
                    string Jzcode = cmbJzCode.SelectedValue.ToString();
                    string JzName = txtJzName.Text;
                    string ProName = cmbProLName.SelectedValue.ToString();
                    string ProCompName = cmbCompe.Text;
                    string LryCode = txtLry.Text;
                    string LryName = txtLryName.Text;
                    int i = 0;
                    for (; i < dgPrint.Rows.Count - 1; i++)
                    {
                        string value1 = dgPrint.Rows[i].Cells[0].Value.ToString();
                        string value2 = dgPrint.Rows[i].Cells[1].Value.ToString();
                        string value3 = dgPrint.Rows[i].Cells[2].Value.ToString();
                        string value4 = dgPrint.Rows[i].Cells[3].Value.ToString();
                        string value5 = dgPrint.Rows[i].Cells[4].Value.ToString();
                        conn.Open();
                        string sql = "select count(*) from  table_BarcodePrint where Code='" + code + "' and DepartName='" + Dep + "' and JzCode='" + Jzcode + "' and ProLineName='" + ProName + "' and LCMCode='" + value1 + "' and [B/LCode]='" + value2 + "' and CellCode='" + value4 + "' and ZBDCode='" + value4 + "' and ScanDate='"+value5+"'";//判断记录是否存在
                        SqlCommand comm = new SqlCommand(sql, conn);
                        if (comm.ExecuteScalar().ToString() == "0")
                        {
                            conn.Close();
                            conn.Open();
                            string sql1 = "insert into table_BarcodePrint(Code,[Date],DepartName,JzCode,JzName,ProLineName,ProLineCompeName,TempCode,TempName,LCMCode,[B/LCode],CellCode,ZBDCode,ScanDate) " +
                                "values('" + code + "','" + date + "','" + Dep + "','" + Jzcode + "','" + JzName + "','" + ProName + "','" + ProCompName + "','" + LryCode + "','" + LryName + "','" + value1 + "','" + value2 + "','" + value3 + "','" + value4 + "','" + value5 + "')";
                            SqlCommand comm1 = new SqlCommand(sql1, conn);
                            comm1.ExecuteNonQuery();
                            conn.Close();
                        }
                        else
                        {
                            conn.Close();
                            continue;                           
                        }
                    }

解决方案 »

  1.   

    假如一个异常后面的都不执行,就把整个 for 循环包裹在 try catch 里,否则 try 从 conn.Open(); 开始,else 后面结束
      

  2.   


    可能不太清楚我的问题吧,再说明一下:for循环中执行insert语句时数据库可能会报插入异常错误(目前主要考虑某些字段不唯一的情况),我要在catch中捕捉这种异常并抛出让用户能看懂出了什么问题,我现在不知道如何捕捉数据库执行异常
      

  3.   

    看代码吧,另外我精简了下,整合了重复部分
    string code = txtCode.Text;
    string date = txtDate.Text;
    string Dep = cmbDep.SelectedValue.ToString();
    string Jzcode = cmbJzCode.SelectedValue.ToString();
    string JzName = txtJzName.Text;
    string ProName = cmbProLName.SelectedValue.ToString();
    string ProCompName = cmbCompe.Text;
    string LryCode = txtLry.Text;
    string LryName = txtLryName.Text;
    int i = 0;
    try
    {
        conn.Open();
        for (; i < dgPrint.Rows.Count - 1; i++)
        {
            string value1 = dgPrint.Rows[i].Cells[0].Value.ToString();
            string value2 = dgPrint.Rows[i].Cells[1].Value.ToString();
            string value3 = dgPrint.Rows[i].Cells[2].Value.ToString();
            string value4 = dgPrint.Rows[i].Cells[3].Value.ToString();
            string value5 = dgPrint.Rows[i].Cells[4].Value.ToString();
            string sql = "select count(*) from  table_BarcodePrint where Code='" + code + "' and DepartName='" + Dep + "' and JzCode='" + Jzcode + "' and ProLineName='" + ProName + "' and LCMCode='" + value1 + "' and [B/LCode]='" + value2 + "' and CellCode='" + value4 + "' and ZBDCode='" + value4 + "' and ScanDate='" + value5 + "'";//判断记录是否存在
            using (SqlCommand comm = new SqlCommand(sql, conn))
            {
                if (comm.ExecuteScalar().ToString() == "0")
                {
                    string sql1 = "insert into table_BarcodePrint(Code,[Date],DepartName,JzCode,JzName,ProLineName,ProLineCompeName,TempCode,TempName,LCMCode,[B/LCode],CellCode,ZBDCode,ScanDate) " +
                        "values('" + code + "','" + date + "','" + Dep + "','" + Jzcode + "','" + JzName + "','" + ProName + "','" + ProCompName + "','" + LryCode + "','" + LryName + "','" + value1 + "','" + value2 + "','" + value3 + "','" + value4 + "','" + value5 + "')";
                    comm.CommandText = sql1;
                    comm.ExecuteNonQuery();
                }
            }
        }
    }
    catch (Exception ex)
    {
        // 这里加上你要显示给用处的错误信息,比如弹个框什么的
        MessageBox.Show(ex.Message);
    }
    finally
    {
        conn.Close();
    }
      

  4.   

    catch (Exception ex)
    {
        // 这里加上你要显示给用处的错误信息,比如弹个框什么的
        MessageBox.Show(ex.Message);
    }
    只能捕获数据库给出的错误,而这种错误用户可能看不懂,怎么才能让用户能看懂呢?
      

  5.   

    具体数据库错误只能你懂,如果是数据库内部错误,比如类型不对,字符串太长,外键不匹配等,这就是程序的 Bug,你就得通过在入库前加校验等方式程序内部解决,不能告诉用户,只有断网的异常,才能通知用户,友好点说就是网络连接可能异常,请重试。你在调试时可以观察下如果执行到 catch 里,ex.Message 是什么内容,相应处理