Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C的强制转换异常无效#_C#_Ms Access 2007 - Fatal编程技术网

C# C的强制转换异常无效#

C# C的强制转换异常无效#,c#,ms-access-2007,C#,Ms Access 2007,我正在用C#开发一个应用程序和一个MS Access 2007数据库 myTable有3列:数字(整数)、名称(长文本)、日期(日期) 我正在尝试从myTable中读取一个值(整数),并尝试将其存储到TOT中以执行其他操作。 但我仍然有一个错误 TOT=reader.GetInt32(x)表示“无效强制转换异常” 使用即时窗口,问题似乎出现在reader.GetInt32(x)中 代码如下: OdbcConnection conn = new OdbcConnection("Dsn=My_Acc

我正在用C#开发一个应用程序和一个MS Access 2007数据库

myTable有3列:数字(整数)、名称(长文本)、日期(日期)

我正在尝试从myTable中读取一个值(整数),并尝试将其存储到TOT中以执行其他操作。 但我仍然有一个错误
TOT=reader.GetInt32(x)表示“无效强制转换异常”

使用即时窗口,问题似乎出现在
reader.GetInt32(x)

代码如下:

OdbcConnection conn = new OdbcConnection("Dsn=My_Access_Database; Pwd=1234");
OdbcCommand cmd;
OdbcDataReader reader;
int TOT = 0;

conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "Select SUM(Number) AS col1 From myTable WHERE Name = '" + label1.Text + "' AND Date=#" + label2.Text + "#;";
reader = cmd.ExecuteReader();
while (reader.Read())
{
   int x= reader.GetOrdinal("col1");
   if (reader.IsDBNull(x))
   {
     label3.Text = "0.0";
     label4.Text = "0.0";
     label5.Text = "0.0";
   }
   else
   {
      TOT = reader.GetInt32(x);
      //Other things 
   }
}
OdbcConnection conn = new OdbcConnection("Dsn=My_Access_Database; Pwd=1234");
OdbcCommand cmd;
OdbcDataReader reader;
int TOT = 0;

conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "Select SUM(Number) AS col1 From myTable WHERE Name = '" + label1.Text + "' AND Date=#" + label2.Text + "#;";
reader = cmd.ExecuteReader();
while (reader.Read())
{
   int x= reader.GetOrdinal("col1");
   if (reader.IsDBNull(x))
   {
     label3.Text = "0.0";
     label4.Text = "0.0";
     label5.Text = "0.0";
   }
   else
   {
      TOT = (int)(reader.GetInt32(x));
      //Other things 
   }
}

当我在Access上执行查询时,它会工作并提供我想要的值。

尝试使用
TryParse
方法:

var result = reader.GetString(x);
int.TryParse(result, out TOT);
更新:

尝试将您的总和转换为
int

cmd.CommandText = "Select CAST(SUM(Number) as INT) AS col1 From myTable WHERE Name = '" 
    + label1.Text + "' AND Date=#" + label2.Text + "#;";
// the other code is omitted for the brevity
else
{
    TOT = reader.GetInt32(x);
}

确定已解决:

看起来我的SUM(Number)返回了一个双精度值,即使该列是一个整型列并填充了整数值

因此,您应该将该值读取为双精度值,并将其转换为int。 代码如下:

OdbcConnection conn = new OdbcConnection("Dsn=My_Access_Database; Pwd=1234");
OdbcCommand cmd;
OdbcDataReader reader;
int TOT = 0;

conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "Select SUM(Number) AS col1 From myTable WHERE Name = '" + label1.Text + "' AND Date=#" + label2.Text + "#;";
reader = cmd.ExecuteReader();
while (reader.Read())
{
   int x= reader.GetOrdinal("col1");
   if (reader.IsDBNull(x))
   {
     label3.Text = "0.0";
     label4.Text = "0.0";
     label5.Text = "0.0";
   }
   else
   {
      TOT = reader.GetInt32(x);
      //Other things 
   }
}
OdbcConnection conn = new OdbcConnection("Dsn=My_Access_Database; Pwd=1234");
OdbcCommand cmd;
OdbcDataReader reader;
int TOT = 0;

conn.Open();
cmd = conn.CreateCommand();
cmd.CommandText = "Select SUM(Number) AS col1 From myTable WHERE Name = '" + label1.Text + "' AND Date=#" + label2.Text + "#;";
reader = cmd.ExecuteReader();
while (reader.Read())
{
   int x= reader.GetOrdinal("col1");
   if (reader.IsDBNull(x))
   {
     label3.Text = "0.0";
     label4.Text = "0.0";
     label5.Text = "0.0";
   }
   else
   {
      TOT = (int)(reader.GetInt32(x));
      //Other things 
   }
}

我猜想,
SUM(Number)
正在返回一个
double
或其他一些“非整数”类型。什么是Int?TOT是一种Int而不是Int的类型,你确定这是正确的吗?是的,绝对正确,在我的代码中它是Int,这里输入错误。整数之和是否可能返回非整数值?表示它无法从System.Double转换为System.String。所以我们得到的和(数)是双精度的。但Number是一个整数列,包含整数值。我猜
SUM()
总是返回一个double类型,即使它只是对整数求和。所以我要做的是TOT=read.GetDouble(),然后将TOT转换为int?