C# 如果数据库sum命令中没有行,则返回错误
将字符串值转换为int时,如果数据库中没有数据,则会引发错误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
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
的所有类型实例。这可确保始终释放连接并清理资源ToString
SqlParameter
,并使检索语句成为泛型语句,或者在一个sql调用中获取两个总和值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(); }