我无法将我的int值转换为双精度值。我知道我必须施展他们,我正在努力做到这一点;但是C#仍然给我一个错误,将int转换为double并说我需要一个演员。此外,它在尝试获取值下的totalunits值时出错。它说:“ ** 一个名为'values'的局部变量不能在这个范围内声明,因为它会给'值'赋予不同的含义,它已在父或当前作用域中用来表示某些其他。 我对此错误感到困惑,因为我希望totalunits也能改变数值.Somweone可以帮助我吗?谢谢。
贾斯汀
以下是我的一些代码:
//Get the Refurb_Rate for the day
private double GetRefurbRate()
{
string sql = "";
double Refurb_Rate = 0;
int totalRefurb = 0;
int totalUnits = 0;
string error_msg = "";
//Getting the value for sql for totalRefurb
sql = "SELECT COUNT(distinct rp.repair_ord) " +
"FROM " + schema + ".repair_part rp " +
"WHERE rp.repair_type = 'REFURB' and rp.created_date > '" + DateTime.Now.ToString("d-MMM-yyyy") + "' ";
while (true)
{
if (!myDb.RunSql(sql, true))
{
error_msg = "DBError for getting Refurb Rate";
break;
}
if (myDb.dbRdr.HasRows)
{
if (myDb.dbRdr.Read())
{
object[] values = new object[myDb.dbRdr.FieldCount];
myDb.dbRdr.GetValues(values);
Console.WriteLine(values[0].ToString());
totalRefurb = Convert.ToDouble(values[0].ToString());());// This is where convert to double error comes in.
//Getting the value from sql for totalUnits
sql = "SELECT count(distinct rp.repair_ord) " +
"FROM " + schema + ".repair_part rp " +
"WHERE rp.repair_type = 'REFURB' and rp.ref_desig is null and rp.created_date > '" + DateTime.Now.ToString("d-MMM-yyyy") + "' ";
while (true)
{
if (!myDb.RunSql(sql, true))
{
error_msg = "DBError for getting Refurb Rate";
break;
}
if (myDb.dbRdr.HasRows)
{
if (myDb.dbRdr.Read())
{
// This is where the values error comes in
object[] values = new object[myDb.dbRdr.FieldCount];
myDb.dbRdr.GetValues(values);
Console.WriteLine(values[1].ToString());
totalUnits = Convert.ToDouble(values[1].ToString());// This is where convert to double error comes in.
try
{
//Formula for Refurb Rate
Refurb_Rate = totalRefurb / totalUnits * 100;
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
break;
}
myDb.dbRdr.Close();
if (error_msg != String.Empty)
{
MessageBox.Show(error_msg, "Get Refurb Rate",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
return Refurb_Rate;
}
}
}
}
答案 0 :(得分:4)
更改第二个object[] values = new object[myDb.dbRdr.FieldCount];
到values = new object[myDb.dbRdr.FieldCount];
或object[] values2 = new object[myDb.dbRdr.FieldCount];
第一个是否要替换values
的内容,第二个是否要声明一个自变量..
答案 1 :(得分:2)
您的问题与投射无关。这是因为您使用了两个名为values
的不同变量:
object[] values = new object[myDb.dbRdr.FieldCount];
// ... snipped ...
// This is where the values error comes in
object[] values = new object[myDb.dbRdr.FieldCount];
答案 2 :(得分:2)
totalRefurb
需要声明一个双倍:double totalRefurb = 0;
values
问题已经得到解答。答案 3 :(得分:2)
您并没有尝试将int转换为该行中的double; ToString()的结果是一个字符串,而不是一个int。如果values [1]中的对象是int,那么请改为:
totalUnits = (double)(int)values[1];
当然,如果将totalUnits实际声明为double而不是int,则效果会更好。
关于其他错误
名为“values”的局部变量无法在此范围内声明,因为它会为“值”赋予不同的含义,“值”已在父级或当前范围中用于表示其他值。
这是一个棘手的错误,会给很多人带来麻烦。 真正的问题是名为'values'的局部变量不能在此范围内声明,因为它会给'values'赋予不同的含义,'values'已经在父作用域中用来表示其他内容。如果你处理这个问题,那么编译错误就会消失。
换句话说,“值”指的是声明的代码大约三分之一的变量。您正试图在代码的一半处创建另一个名为“values”的变量。如果允许第二个声明,那么相同的名称(“值”)将引用此方法中的两个不同的东西。
答案 4 :(得分:0)
问题是您第二次声明变量值。这是不可能的,因为在相同的范围内,您已经拥有相同的变量。因此在第二种情况下只需使用:
values = new object[myDb.dbRdr.FieldCount];
答案 5 :(得分:0)
第二个对象[] values =
应该是
values =
要么
object [] values2 =
int to double conversion:
int i = 123; 双配音;
dub =(double)i;
来自数据库的数据类型是什么?
将DB数据类型转换为.Net,然后进行转换(如果可能)。
例如,SQL Server nvarchar列是字符串,int是Int32,bigint是Int64。
int i =(int)myDb.dbRdr [“IntColumnName”]; //如果允许空值,可能要进行空检查。
double d =(double)i;