С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
Ex_Soft
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
1

Microsoft.Jet.OLEDB.4.0 + dbf = Data type mismatch

02.08.2009, 02:17. Просмотров 4728. Ответов 6
Метки нет (Все метки)

C#
1
2
3
4
5
con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;User ID=;Password=;Data Source="+System.IO.Directory.GetCurrentDirectory());
...
cmd.CommandText="insert into TableName (FieldChar, FieldNumeric) values (?, ?)";
CommandDest.Parameters.Add("FieldChar",OleDbType.VarChar); //1
CommandDest.Parameters.Add("FieldNumeric",OleDbType.Numeric); //2
Как видите - ничего космического.
C#
1
2
CommandDest.Parameters["FieldChar"].Value="A";
CommandDest.Parameters["FieldNumeric"].Valie=1;
Проходит на ура. Но мне необходимо запихнуть данные из DataRow. И тут
C#
1
2
3
4
5
CommandDest.Parameters["FieldNumeric"].Valie=row["FieldSrc"];
// ||
CommandDest.Parameters["FieldNumeric"].Valie=Convert.ToDecimal(row["FieldSrc"]);
// ||
CommandDest.Parameters["FieldNumeric"].Valie=Convert.ToDouble(row["FieldSrc"]);
все три варианта дают:
C#
1
CommandDest.Parameters["FieldNumeric"].Valie=Convert.ToDecimal(row["FieldSrc"]);
Причем на одной маше - все сухо. А на другой, как раз где позарез нужно, - вот такая беда. google'l. Но в основном данная проблема вылазит у тех, кто собирает запрос.
Сакраментальный вопрос: Кто виноватЪ? Что делатЪ? Ну до позарезу нужно впихнуть в numeric поле число с точкой.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2009, 02:17
Ответы с готовыми решениями:

Microsoft.Jet.OLEDB
Как проверить какой провайдер Microsoft.Jet.OLEDB.4.0 или...

Как зарегистрировать Microsoft.Jet.OLEDB.4.0
Пишу программу с C# Access при компиляции вылазите ошибка "Поставщик...

Поставщик "Microsoft.Jet.OLEDB.4.0" не зарегистрирован на локальном компьютере
Необходимо подключить базу данных (access) к проекту, причем через интерфейс...

Поставщик "Microsoft.Jet.OLEDB.4.0" не зарегистрирован на локальном компьютере
Всем доброго дня Создала Class Library для подгрузки в AutoCAD, назначение...

Поставщик "Microsoft.Jet.OLEDB.4.0" не зарегистрирован на локальном компьютере.
Как исправить? (на Win7 64-bit)

6
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
03.08.2009, 03:05 2
При конвертации строки в "число с точкой" используются текущие региональные настройки. Т.е. на одной машине (примерно!) разделитель точка и в строке точка - конвертация проходит. На другой машине разделитель запятая, а в строке точка - конвертация не проходит.
row["FieldSrc"] - если это данные из БД, почему не привести столбец к нужному типу?
0
Ex_Soft
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
03.08.2009, 03:20  [ТС] 3
Цитата Сообщение от Green
При конвертации строки
А кто Вам сказал, что происходит конвертация из строки? Проблема, IMHO, четко, ясно и однозначно описана. По коду видно, что юзаются параметры. Какая конвертация? Из какой строки? Никакой ковертации не происходит. В row лежит object и как object присваивается Value.
Цитата Сообщение от Green
row["FieldSrc"] - если это данные из БД, почему не привести столбец к нужному типу?
Да патамушта этих полей - куча. Типи разные. Вдобавок нуна тогда проверку на NULL еще делать. Вот сами сравните:
C#
1
2
FieldName="SmthFieldName";
CommandDest.Parameters[FieldName].Valie=row[FieldName];
vs
C#
1
2
FieldName="SmthFieldName";
CommandDest.Parameters[FieldName].Valie = !row.IsNull(FieldName) ? (object)Convert.To...(row[FieldName]) : DBNull.Value;
+ еще разгребать какой Convert.To... выбрать в зависимости от типа...
0
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
03.08.2009, 04:13 4
Цитата Сообщение от Ex_Soft Посмотреть сообщение
А кто Вам сказал, что происходит конвертация из строки?
Это наиболее вероятный вариант из всех предполагаемых.

Цитата Сообщение от Ex_Soft Посмотреть сообщение
Проблема, IMHO, четко, ясно и однозначно описана.
Верно, это ваше ИМХО.

Цитата Сообщение от Ex_Soft Посмотреть сообщение
Какая конвертация? Из какой строки? Никакой ковертации не происходит.
Это из вашего примера:
Код
Convert.ToDecimal(row["FieldSrc"])
Цитата Сообщение от Ex_Soft Посмотреть сообщение
В row лежит object и как object присваивается Value.
В row лежит object, а в БД? В бд object не засунешь. А во-вторых, это не object там лежит, в данном контексте, там лежит упакованный value-тип.

Цитата Сообщение от Ex_Soft Посмотреть сообщение
По коду видно, что юзаются параметры.
Что вы этим хотели сказать? Параметры - панацея? Ими еще правильно пользоваться надо..


Цитата Сообщение от Ex_Soft Посмотреть сообщение
Да патамушта этих полей - куча. Типи разные. Вдобавок нуна тогда проверку на NULL еще делать. Вот сами сравните:
Вот об этом и речи не было. Пытаетесь в одну строку свалить все поля таблицы.

Воспользуйтесь отладчиком. посмотрите какое значение у row["FieldSrc"] в момент выброса исключения.
0
Ex_Soft
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
03.08.2009, 12:45  [ТС] 5
Цитата Сообщение от Green
Это наиболее вероятный вариант из всех предполагаемых.
/me думает: что-то Ваш хрустальный шар помутнел...
1. Я нигде не употребил "конвертации строки"
2. В тестовом примере, который отрабатывает без ошибок употреблен литерал
Код
CommandDest.Parameters["FieldNumeric"].Value=1;
3. Если даже Вы и предположили, что в row["FieldSrc"] лежит строка, то мы бы получили
Цитата Сообщение от System.FormatException
Input string was not in a correct format
на Convert.ToDecimal()/Convert.ToDouble(), а не
Data type mismatch
от Microsoft.Jet.OLEDB.4.0 на OleDbCommand.ExecuteNonQuery()
Цитата Сообщение от Green
а в БД?
В БД лежит numeric(p, s), который OleDbDataAdapter'ом при Fill(DataTable) мапится в System.Decimal
Цитата Сообщение от Green
это не object там лежит, в данном контексте, там лежит упакованный value-тип
Тут я с Вами согласен. Да - System.ValueType==System.Decimal. Я просто имел в виду, что типы Parameters и типы Columns соотвтественно - совпадают.
Цитата Сообщение от Green
Параметры - панацея?
Да. Как раз параметры - панацея. От выше озвученной Вами проблемы зависимости от региональных настроек, от SQL injection и т.д.
Цитата Сообщение от Green
Ими еще правильно пользоваться надо..
Будьте так любезны, удовлетворите, пожалуйста мое любопытство и приведите пример "неправильного" использования параметров. А то я, чего-то, ну никак не могу себе такое представить.
Цитата Сообщение от Green
Воспользуйтесь отладчиком
Поверьте - отладчиком я, как раз, умею пользоваться. И именно в процессе отладки я и вышел на это одно-единственное злополучное поле.
Цитата Сообщение от Green
посмотрите какое значение у row["FieldSrc"] в момент выброса исключения.
Повторюсь: исключение возникает не на присвоении значения параметру, а на OleDbCommand.ExecuteNonQuery(). И значение параметра нормальное - System.Decimal.
0
Green
1919 / 424 / 40
Регистрация: 12.07.2007
Сообщений: 2,062
Завершенные тесты: 2
04.08.2009, 04:58 6
А если проверить на другом провайдере?
Или указать параметру свойства Precision, Scale?
0
Ex_Soft
107 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
04.08.2009, 19:52  [ТС] 7
Цитата Сообщение от Green
А если проверить на другом провайдере?
vfpoledb.1 сволошЪ ругаецо на то, что поле не м.б. null'ом.
А, про ODBC'ишный Microsoft dBASE Driver (*.dbf), честно говоря, - забыл...
Цитата Сообщение от Green
Или указать параметру свойства Precision, Scale?
Тоже вариант. Доберусь до тела - попробую...
0
04.08.2009, 19:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2009, 19:52

Запрос к файлу DBF через OleDB
Простой запрос с Select'ом возвращает только 8879 записей, хотя в файле их на...

Ошибка при работе с dbf через OLEDB
Доброго времени суток. Возникла такая проблема: из таблицы записываю данные в...

Необработанное исключение типа "System.Data.OleDb.OleDbException" в System.Data.dll
Добрый день, нашел код для вывода двух связанных таблиц данных в один элемент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru