如果数据库sum命令中没有行,则返回错误

时间:2016-10-07 10:10:35

标签: c# asp.net sql-server

将字符串值转换为int时,如果数据库中没有数据,则会引发错误。

try {

        SqlCommand cmdc = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=1 AND Crdt_typ_id=1", con);
        string companya_credit_amount = null, comapnyb_credit_amount = null;
        con.Open();
        SqlDataReader drc = cmdc.ExecuteReader();

        if (drc.HasRows)
        {

            while (drc.Read())
            {
                companya_credit_amount = drc[0].ToString();
            }
            drc.Close();
            con.Close();
        }
        SqlCommand cmdcp = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=2 AND Crdt_typ_id=1", con);
        con.Open();
        SqlDataReader drcp = cmdcp.ExecuteReader();
        if (drcp.HasRows)
        {

            while (drcp.Read())
            {
                companyb_credit_amount = drcp[0].ToString();
            }
            drcp.Close();
            con.Close();
        }
        if (!Page.IsPostBack)
        {
            int companyA = 0,companyB=0;
            if (companya_credit_amount != "") { companyA = Convert.ToInt32(credit_amount.ToString()); }
            if (companyb_credit_amount != ""){ companyB = Convert.ToInt32(companyb_credit_amount); }
            int total = (companyA+companyB);
            count_total_lbl.Text = "Rs." + " " + total.ToString();
            count_comapnya_lbl.Text = "Rs." + " " + companya_credit_amount.ToString();
            count_companyb_lbl.Text ="Rs."+" "+ companyb_credit_amount.ToString();
        }
    }
    catch(Exception ex) { Label2.Text = ex.ToString(); }

如果有值,它的工作正常。但是当数据库中没有值时,会出现错误信息。

System.FormatException:输入字符串的格式不正确。

4 个答案:

答案 0 :(得分:2)

  1. 使用IsDBNull检查空值
  2. 使用块创建并销毁实现IDisposable的所有类型实例。这可确保始终释放连接并清理资源。
  3. 不要在班级中使用连接。在需要时创建它们然后处理它们。 Sql Server将处理连接池。
  4. 直接获取本机类型,而不是等效的字符串!请参阅数据阅读器上对GetInt32的更改,而不是ToString
  5. 您应该重构此操作以使用SqlParameter' s并使检索语句通用或在1 sql调用中获取两个SUM值。
  6. 有一个if (!Page.IsPostBack)语句,如果这个代码没有做任何事情,如果它是回发,那么请检查页面顶部,如果是回发,则不执行sql语句。否则代码无缘无故地进行(可能)昂贵的SQL调用。
  7. try
    {
        int companyA = 0,companyB=0;
        using(var con = new SqlConnection("connectionStringHere"))
        {
            con.Open();
    
            using(SqlCommand cmdc = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=1 AND Crdt_typ_id=1", con))
            using(SqlDataReader drc = cmdc.ExecuteReader())
            {
                if (drc.Read() && !drc.IsDBNull(0))
                    companyA = drc.GetInt32(0);
            }
    
            using(SqlCommand cmdcp = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=2 AND Crdt_typ_id=1", con))
            using(SqlDataReader drcp = cmdcp.ExecuteReader())
            {
                if (drcp.Read() && !drcp.IsDBNull(0))
                    companyB = drcp.GetIn32(0);
            }
        }
    
        // if you are not going to do anything with these values if its not a post back move the check to the top of the method
        // and then do not execute anything if it is a postback
        // ie:  // if (Page.IsPostBack) return;
        if (!Page.IsPostBack) 
        {
            int total = (companyA+companyB);
            count_total_lbl.Text = "Rs." + " " + total.ToString();
            count_comapnya_lbl.Text = "Rs." + " " + companyA.ToString();
            count_companyb_lbl.Text ="Rs."+" "+ companyB.ToString();
        }
    }
    catch(Exception ex) { Label2.Text = ex.ToString(); }
    

答案 1 :(得分:1)

尝试替换此

SELECT SUM(Credited_amount) 

WITH

SELECT ISNULL(SUM(Credited_amount),0)

在转换信用金额值时也会找到一个令人困惑的代码

if (companya_credit_amount != "") { companyA = Convert.ToInt32(credit_amount.ToString()); }
                                                         ---------^^^^^
if (companyb_credit_amount != ""){ companyB = Convert.ToInt32(companyb_credit_amount); }

我不了解您的业务需求,但我的想法应该使用credit_amountcompanya_credit_amount来显示companyA变量的值吗?

答案 2 :(得分:0)

你应该做两件事:

  1. 字符串companya_credit_amount =“”,comapnyb_credit_amount =“”;

  2. 在为这些字符串变量赋值之前,您应该检查db null,如下所示:

    while (drc.Read())
    {
    companya_credit_amount = (drc[0] != DbNull.Value) ? drc[0].ToString() :    "" ;
    }
    
  3. Similarely

        while (drcp.Read())
        {
           companyb_credit_amount = (drcp[0] != DbNull.Value) ? drcp[0].ToString() : "";
        }
    

    试试吧。

答案 3 :(得分:0)

您需要将credit_amount初始化为空并检查db值是否为null,如下所示:

    try {
            companya_credit_amount = string.Empty;
            companyb_credit_amount = string.Empty;
            SqlCommand cmdc = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=1 AND Crdt_typ_id=1", con);
        string companya_credit_amount = null, comapnyb_credit_amount = null;
        con.Open();
        SqlDataReader drc = cmd

c.ExecuteReader();

    if (drc.HasRows)
    {

        while (drc.Read())
        {
            companya_credit_amount = drcp.IsDBNull(0)?string.Empty:Convert.ToString(drcp[0]);
        }
        drc.Close();
        con.Close();
    }
    SqlCommand cmdcp = new SqlCommand("SELECT SUM(Credited_amount) FROM IMS_Credit_Dir WHERE Credit_comp_id=2 AND Crdt_typ_id=1", con);
    con.Open();
    SqlDataReader drcp = cmdcp.ExecuteReader();
    if (drcp.HasRows)
    {

        while (drcp.Read())
        {
            companyb_credit_amount = drcp.IsDBNull(0)?string.Empty:Convert.ToString(drcp[0]);
        }
        drcp.Close();
        con.Close();
    }
    if (!Page.IsPostBack)
    {
        int companyA = 0,companyB=0;
        if (companya_credit_amount != "") { companyA = Convert.ToInt32(credit_amount.ToString()); }
        if (companyb_credit_amount != ""){ companyB = Convert.ToInt32(companyb_credit_amount); }
        int total = (companyA+companyB);
        count_total_lbl.Text = "Rs." + " " + total.ToString();
        count_comapnya_lbl.Text = "Rs." + " " + companya_credit_amount.ToString();
        count_companyb_lbl.Text ="Rs."+" "+ companyb_credit_amount.ToString();
    }
}
catch(Exception ex) { Label2.Text = ex.ToString(); }