Неверное исключение броска с C# - PullRequest
0 голосов
/ 11 марта 2020

Я занимаюсь разработкой приложения на 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 
   }
}

Когда я выполняю запрос в Access, он работает и дает мне значение, которое я хочу.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

OK решено:

Похоже, мой SUM (Число) вернул значение Double, даже если столбец был целым и заполнен целыми значениями.

Таким образом, вы должны прочитать значение как двойное и привести его к типу 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 = (int)(reader.GetInt32(x));
      //Other things 
   }
}
0 голосов
/ 11 марта 2020

Попробуйте использовать TryParse метод:

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

ОБНОВЛЕНИЕ:

Попробуйте CAST вашу сумму до 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...