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

C# 如果数据库sum命令中没有行,则返回错误,c#,asp.net,sql-server,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 = nu

将字符串值转换为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:输入字符串的格式不正确

  • 用于检查空值
  • 创建并销毁在使用块中实现
    IDisposable
    的所有类型实例。这可确保始终释放连接并清理资源
  • 不要跨类使用连接。在需要时创建它们,然后处置它们。Sql Server将处理连接池
  • 直接获取本机类型,而不是等效的字符串!请参见数据读取器上对字符串的更改,而不是
    ToString
  • 您应该重构它以使用
    SqlParameter
    ,并使检索语句成为泛型语句,或者在一个sql调用中获取两个总和值
  • 如果(!Page.IsPostBack)语句中有
    if(!Page.IsPostBack)
    语句,如果是回发,则此代码中的任何代码都不会执行任何操作,然后在页面顶部进行检查,如果是回发,则不执行sql语句。否则代码会无缘无故地进行(可能)昂贵的sql调用

  • 试着替换这个

    SELECT SUM(Credited_amount) 
    

    在转换贷记金额值时,也会发现一个令人困惑的代码

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

    我不知道您的业务需求,但我认为应该使用
    公司信用额
    而不是
    公司信用额
    来显示
    公司信用额
    变量的价值,对吗?

    您应该做两件事:

  • 字符串companya_credit_amount=“”,comapnyb_credit_amount=“”

  • 在将值分配给这些字符串变量之前,应检查db null,如下所示:

    while (drc.Read())
    {
    companya_credit_amount = (drc[0] != DbNull.Value) ? drc[0].ToString() :    "" ;
    }
    
  • 相似地

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

    试试看。

    您需要将信用卡金额初始化为空,并检查db值是否为空,如下所示:

        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(); }
    

    哪一行引发异常?在转换为所需的数据类型之前,您需要检查所有可空列上的空值。为什么不将companya\u credit\u amount和companyb\u credit\u amount初始化为“0”而不是null?int total=(companya+companyb)//这里我得到了这条线上的错误你确定你得到了那条线上的错误吗?我非常怀疑这一行是否会给您带来格式异常,您确定这不是上面的Convert.ToInt32行吗?while(drc.Read()){companya_credit_amount=drc.IsDBNull(0)?“0”:drc.GetString(0);//error line}drc.Close();con.Close();无法将类型为“System.Int32”的对象强制转换为类型为“System.String”@ManoharKumar-您阅读了我的答案吗?不要使用字符串,因为您正在使用数字(整数)。使用本机类型(数字),而不是字符串。在bullet#4和我提供的代码中都有。@ManoharKumar-一个错误,
    GetInt
    应该是
    GetInt32
    ,上面的代码已经更新。错误已经消失,但在标签中看不到值。输出为0。当我有一些价值的时候DB@ManoharKumar-直接在SSMS中运行查询并查看输出。如果按原样使用上述代码,标签将填充。我无法猜测您的版本现在是什么样子,但您必须逐步完成并调试代码。可能是您放错了
    或未选中
    Read()
    (以推进数据读取器)。是,我想显示金额的总和。特定公司的
        while (drcp.Read())
        {
           companyb_credit_amount = (drcp[0] != DbNull.Value) ? drcp[0].ToString() : "";
        }
    
        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(); }