#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).