VB.NET - проблема Visual Foxpro OLE DB с числовым десятичным столбцом - PullRequest
3 голосов
/ 19 февраля 2011

Короче говоря: Я использую VB.NET 2008 для подключения к базе данных Visual Foxpro 6 с помощью драйвера vfpoledb.1.Когда я пытаюсь заполнить OleDbDataAdapter таблицей набора данных, содержащей один из числовых столбцов, я получаю следующее сообщение об ошибке:

Поставщик не может определить десятичное значение.Например, строка была только что создана, значение по умолчанию для столбца «Десятичное число» было недоступно, а потребитель еще не установил новое значение «Десятичное число».

Я хочу получить этот столбец из VB.NET 2008 и сохраните его в числовом формате.

Длинная версия:

Я использую VB.NET для подключения к базе данных Visual Foxpro 6.Несколько столбцов в таблице предназначены для числового типа данных длиной до 8 цифр.Я не уверен, как работают типы данных Visual Foxpro, но похоже, что это поле позволяет кому-то ввести любое из следующих значений примера:

99999999  
99999.99  
    9.99  
    9.00
{nothing} 

Из Visual Foxpro: у меня есть доступ к небольшой программе под названием Foxwin, котораяпозволяет просматривать таблицы VFP в собственной среде VFP.Это то, что я использую для доступа к данным, чтобы получить мои примеры для того, что я опубликовал выше.Отсюда я вижу, что некоторые строки вообще не содержат значений в этом поле, хотя они кажутся заполненными пробелами, когда данных нет.Я пытался выполнить запросы на обновление, чтобы заполнить каждую строку действительными данными, но мои запросы на обновление завершаются без обновления каких-либо строк.Я пробовал ISNULL (bal_qty) и bal_qty IS NULL, и ни один из них не работает.

Из MS Access 2007: Использование того же драйвера, который я использую в VB.NET, и я могу загрузить набор записей ADO и связатьэто в форме без проблем.Десятичные значения, кажется, удалены, вероятно, потому что все они - ".00".Я предпочитаю создавать эту небольшую программу в VB.NET, поэтому я использую MS Access только для тестирования.

Из VB.NET: Мой оператор SQL работает, если я преобразую bal_qty в String, но это вызывает проблемы с сортировкой.Я пробовал VAL (STR (bal_qty)), и он терпит неудачу с тем же сообщением об ошибке, которое я отправил выше.Вот код, который я использую:

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)

    Private Function FetchData()

        con.Open()
        Dim ds As DataSet = New DataSet()
        Dim sSQL As String
        'This SQL statement works but the data doesn't sort properly.
        'sSQL = "SELECT item_cd, item_desc, STR(bal_qty) FROM invent;"

        sSQL = "SELECT item_cd, item_desc, bal_qty FROM invent;"

        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        Dim daInv As OleDbDataAdapter = New OleDbDataAdapter(cmd)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent") 'The error occurs here.
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Function

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        con.Close()
        con = Nothing
    End Sub
End Class

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Я нашел проблему, которая была причиной этого. В столбце / поле bal_qty введены числовые данные, которые не соответствуют определению типа данных столбца.

Мое поле bal_qty имеет определение данных Visual Foxpro:
Тип: Числовой
Ширина: 8
Десятичное число: 2

Программное обеспечение Visual Foxpro, очевидно, позволяло пользователю вводить значение 1000987 в это поле, которое, насколько я могу судить, не вызывает проблем в Visual Foxpro. Однако это вызывает проблемы при доступе к данным, использующим что-либо, кроме Visual Foxpro, поскольку нарушает настройки этого поля.

Дальнейшее тестирование показало, что MS Access 2007 также имеет проблему с этим значением. После загрузки набора записей в форму просмотра таблицы я получаю сообщение об ошибке: «Поставщик данных или другой сервис вернул статус E_FAIL». Если я включу следующее предложение WHERE, я не получу сообщение об ошибке: WHERE bal_qty <9999 </p>

Теперь я решил проблему, выполнив инструкцию SQL UPDATE, чтобы изменить значение bal_qty в записи, которая нарушает работу.

Я также обнаружил неверные данные в столбце под названием разметка. Сотни записей показывают только звездочки, где они должны показывать числовые данные. Включение этого столбца разметки в мои запросы наборов записей также приводит к сбою моих запросов с ошибками.

См. Этот пост о звездочках в числовых столбцах и о том, как с ними обращаться в .NET: Как прочитать поля звездочки (***) из базы данных .DBF?

Если вы пытаетесь решить эту проблему, вы можете просматривать и редактировать данные VFP с помощью Visual RunFox 6, который можно бесплатно загрузить с веб-сайта Ed Leafe: http://leafe.com/dls/vfp Вы также можете редактировать структуру таблицы здесь. Этот инструмент далеко не интуитивен, если вы не опытный программист VFP. Вы должны вводить команды VFP из командного окна для большинства всего, что вы хотите сделать.

3 голосов
/ 25 сентября 2014

У нас проблема с приложением .NET, которое читает foxpro dbf.Нашим решением было использовать следующее в операторе выбора:

SELECT PropertyID, VAL(STR(SaleAmt)) as SaleAmt FROM MyTable

Это преобразует десятичный столбец (SaleAmt) в строку, а затем обратно в числовое значение.Кроме того, если требуется целое число, вы можете использовать INT (SaleAmt) в вашем операторе SELECT.

1 голос
/ 20 февраля 2011

Я работал с VFP через C # и VB со многими таблицами с / без десятичных знаков без проблем. Что касается упорядочения данных, вы можете добавить к заказу предложение «упорядочить по», чтобы его значение по умолчанию передавалось из VFP в VB в предварительно отсортированном режиме.

Кроме того, в версии, которую я создал, я не запрашиваю набор данных и не знаю, может ли это быть проблемой где-то ...

dim dt as DataTable
dim sSQL as String
sSQL = "Select item_cd, item_desc, bal_qty from invent order by bal_qty"

then, your data adapter...

daInv.Fill( dt )

then you would still be able to bind directly to your grid...

Me.DataGridView1.DataSource = dt

Что касается числового содержимого, из вашей утилиты DBF Viewer маска ввода структуры таблицы должна по умолчанию соответствовать ожидаемым значениям ... перейти к любой записи, войти в это поле и начать вводить "9.99999", поэтому "9 «. заставит вас перейти к известному десятичному знаку, а затем продолжать вводить цифры после десятичной дроби, чтобы узнать, сколько фактических мест доступно. Я мог видеть, как это может раздражать вас, если вы попытаетесь ввести значение с большей десятичной точностью, чем это позволяет.

...