Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481

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

02.08.2009, 02:17. Показов 6196. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.08.2009, 02:17
Ответы с готовыми решениями:

Microsoft.Jet.OLEDB
Как проверить какой провайдер Microsoft.Jet.OLEDB.4.0 или Microsoft.ACE.OLEDB.12.0 стоит на компе?

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

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

6
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
03.08.2009, 03:05
При конвертации строки в "число с точкой" используются текущие региональные настройки. Т.е. на одной машине (примерно!) разделитель точка и в строке точка - конвертация проходит. На другой машине разделитель запятая, а в строке точка - конвертация не проходит.
row["FieldSrc"] - если это данные из БД, почему не привести столбец к нужному типу?
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
03.08.2009, 03:20  [ТС]
Цитата Сообщение от 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
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
03.08.2009, 04:13
Цитата Сообщение от Ex_Soft Посмотреть сообщение
А кто Вам сказал, что происходит конвертация из строки?
Это наиболее вероятный вариант из всех предполагаемых.

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

Цитата Сообщение от Ex_Soft Посмотреть сообщение
Какая конвертация? Из какой строки? Никакой ковертации не происходит.
Это из вашего примера:
Code
1
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
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
03.08.2009, 12:45  [ТС]
Цитата Сообщение от Green
Это наиболее вероятный вариант из всех предполагаемых.
/me думает: что-то Ваш хрустальный шар помутнел...
1. Я нигде не употребил "конвертации строки"
2. В тестовом примере, который отрабатывает без ошибок употреблен литерал
Code
1
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
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
04.08.2009, 04:58
А если проверить на другом провайдере?
Или указать параметру свойства Precision, Scale?
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
04.08.2009, 19:52  [ТС]
Цитата Сообщение от Green
А если проверить на другом провайдере?
vfpoledb.1 сволошЪ ругаецо на то, что поле не м.б. null'ом.
А, про ODBC'ишный Microsoft dBASE Driver (*.dbf), честно говоря, - забыл...
Цитата Сообщение от Green
Или указать параметру свойства Precision, Scale?
Тоже вариант. Доберусь до тела - попробую...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2009, 19:52
Помогаю со студенческими работами здесь

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

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

The conversion of a nvarchar data type to a datetime data type resulted in an out-of-range value
На моем компе программа работает, а на сервере получаю ошибкуThe conversion of a nvarchar data type to a datetime data type resulted in...

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru