«Входная строка была не в правильном формате». при загрузке данных из Oracle на C#

#c# #oracle

Вопрос:

Мне нужно создать программу, которая может отображать данные по запросу. Программа была написана на C#, данные находятся на Oracle.

 OdbcCommand cmd1 = new OdbcCommand(sql);
cmd1.Connection = conn;
OdbcDataReader dr = cmd1.ExecuteReader();
DataRow dr1;

while (dr.Read())
{
    dr1 = dt.NewRow();

    for (int i = 0; i < dr.FieldCount; i  )
    {
        *dr1[i] = dr.getValue(i);*
    }
    dt.Rows.Add(dr1);
}
dataGridView1.DataSource = dt;
 

dt является доступным для данных, в нем 27 столбцов. Когда я запускаю программу, она показывает ошибку dr1[i]=dr.getValue(i) . Но я могу выполнить этот запрос непосредственно в базе данных.

Он пытается преобразовать строку в целое число, значение «-3.45», я попытался проверить, является ли это типом числа , а затем преобразовать в целое число int32.parse , но не получилось. И я попытался проверить, соответствует ли это типу номера, затем dr1[i] = dr.getInt32(i) , dr.getFloat(i), dr.getDouble(i) , dr.getDecimal(i) . Все это не сработало.

Когда я попытался сделать dr.getFloat(i) или dr.getDouble(i) , ошибка изменилась на «Указанный приведение недопустимо».

Пожалуйста, помогите мне, как я могу исправить эти ошибки.

Комментарии:

1. каков ваш текущий регион? это что-то с , десятичным разделителем?

2. Привет и добро пожаловать в SO. Скорее всего, у вас возникли проблемы с культурой, в которой работает ваше приложение. Например, это значение может быть записано как -3,45 в одном языковом стандарте, и это может быть то, что он ожидает в данном случае. Если возможно, вы можете преобразовать строку в целое число с помощью InvariantCulture , которое даст вам ожидаемые результаты независимо от культуры, для которой настроена среда выполнения.

3. текущая локаль-Россия, **,** используется для десятичного разделителя. Вы правы, возможно, в этом причина этой ошибки. Но как я могу исправить это в программе? Могу ли я установить языковой стандарт по коду?

4. Каков тип данных в базе данных? Попробуй Convert.ToDouble(dr[i], System.Globalization.CultureInfo.InvariantCulture)

Ответ №1:

Вам не нужно делать цикл while. Вы можете напрямую назначить данные считывателя для DataTable.

 // Given a DataReader called "dr"
 DataTable dt = new DataTable();
 dt.Load(dr)
 

Я проверил это с помощью Sqlite (SQLiteDataReader), но попробуйте с помощью Oracle (OdbcDataReader).