Доступ к dbf через VB

nightshine
Дата: 17.04.2006 09:26:07
Нужно работать с базой на FoxPro 2.6. Выбор языка еще не сделал (либо VB6, либо VB.NET). Что по вашему лучше, в смысле удобнее для работы. Круг задач таков: считать инфу из одной базы и слить в другую, по возможности разрешая коллизи.

Еще раз переформулирую вопрос: чем удобнее решить поставленные задачи (время работы не критично)

Большое спасибо всем ответившим за помощь, я с FoxPro раньше не сталкивался вообще, не говоря уже о FoxPro 2.6 и с dbf файлами не работал.
nightshine
Дата: 19.04.2006 09:51:40
Ну ответьте кто-нибудь, горю!!! Хоть где искать подскажите, хоть примерно!!!
Может вопрос не понятно сформулировал, так скажите что хоть непонятно! Неужели никто ничего сказать не может???
aleksey2
Дата: 19.04.2006 11:36:18
Недавно у самого возникла необходимость работать с DBF (fox pro 2.6)
сначала начал на VB6, потом перешёл на VB.NET из за гемора с инсталлятором VB6.
nightshine
Дата: 19.04.2006 11:53:49
А можно поподробнее, как подключаешься? Как записи тянешь? На куче форумов задавал вопрос, никто не отвечает. Тема актуальна, напиши поподробнее плиз. Всем пригодится!!!
aleksey2
Дата: 19.04.2006 12:07:30
В общем на VB.NET (VS 2003) всё выглядит так:

Dim oleConnect As New OleDb.OleDbConnection
Dim oleCommanda As New OleDb.OleDbCommand

            oleConnect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & CurDir() & ";Extended Properties=dBASE IV;User ID=Admin;Password="
            oleCommanda.Connection = oleConnect
            'коннекшн стринг указали, а дальше простым SQL делаем что нужно:
            'в данном случае я создаю таблицу с именем pro...
            oleCommanda.CommandType = CommandType.Text
            oleCommanda.CommandText = "CREATE TABLE pro (tabn CHARACTER(4), VO CHARACTER(2), VO_V CHARACTER(2), DATO CHARACTER(7), SHIFR CHARACTER(8), DNI NUMERIC(3,0), tim NUMERIC(7), 'sum' NUMERIC(13), DAT_DOC DATE)"
            oleConnect.Open()
            oleCommanda.ExecuteNonQuery()
            oleConnect.Close()
            MessageBox.Show("Таблица создана.", "Экспорт данных")

кстати connection strings берём отсюда
nightshine
Дата: 20.04.2006 07:24:41
Спасибо за пример, буду пробовать! Только вот вопрос, это подключение ко всей базе, а как к одной таблице? Вот если я например хочу к одной таблице базы данных подключиться и из нее все выкачать? Или например к двум таблицам? Т.е. в базе штук 10 таблиц ... а я хочу инфу из 2ух выкачать. Можно как-то цепляться только к определенному числу таблиц?
Еще вопрос, если там в одном каталоге 2 базы лежит к какой он зацепиться? Ты же только путь указываешь, а название самой базы как-то нужно указывать?
aleksey2
Дата: 20.04.2006 09:39:28
nightshine
Спасибо за пример, буду пробовать! Только вот вопрос, это подключение ко всей базе, а как к одной таблице? Вот если я например хочу к одной таблице базы данных подключиться и из нее все выкачать? Или например к двум таблицам? Т.е. в базе штук 10 таблиц ... а я хочу инфу из 2ух выкачать. Можно как-то цепляться только к определенному числу таблиц?



К таблицам цепляться не надо, цепляться нужно к базе, а уже после этого проводить операции с таблицами например выбрать всё: "SELECT * FROM your_table"

nightshine

Еще вопрос, если там в одном каталоге 2 базы лежит к какой он зацепиться? Ты же только путь указываешь, а название самой базы как-то нужно указывать?


В каталоге не может лежать две базы, *.dbf это не база - это таблица, а база это сам каталог.

В случае когда в каталоге лежит ещё один каталог с файлами *.dbf то ты сможешь работать только с таблицами того каталога, который указан у тебя в connectionstring. С таблицами из подкаталога ты работать не сможешь, для этого нужно будет цепляться непосредственно к самому вложенному каталогу.
nightshine
Дата: 24.04.2006 11:51:20
Спасибо большое, все, что хотел узнал! Еще вот есть вопрос:
может ли быть такое, что когда я считываю из dbf файла, то часть данных отображается, как пустая, хотя на самомо деле данные не там есть, адекватные. Если может, как с этим бороться. Вопрос вызван тем, что ситая поле типа Date (или аналог, не знаю как в FoxPro называется) там считываются одни нули через ":". Я и не знаю, то ли там не заполненная база, толи я что не так делаю!
Sergey Ch
Дата: 24.04.2006 23:19:21
nightshine
Спасибо большое, все, что хотел узнал! Еще вот есть вопрос:
может ли быть такое, что когда я считываю из dbf файла, то часть данных отображается, как пустая, хотя на самомо деле данные не там есть, адекватные. Если может, как с этим бороться. Вопрос вызван тем, что ситая поле типа Date (или аналог, не знаю как в FoxPro называется) там считываются одни нули через ":". Я и не знаю, то ли там не заполненная база, толи я что не так делаю!

Если все правильно делать, то такого не бывает...

В FoxPro есть тип данных дата - если он пустой, то в зависимости от установок может быть по разному... Можете просмотреть в просмотрщике DBF этот файл или в FoxPro, чтобы убедиться, что там нет данных или выложить тут если файл небольшой и мы уж тут посмотрим
nightshine
Дата: 02.05.2006 08:33:34
Вот код. Пытаюсь считать данные из базы. в результате кидает эксепшен:
Непредвиденная ошибка драйвера внешней базы данных (8715). Причем это если скопировать файлы с индексами .CDX. Без них выдает другой эксепшен: Индекс не найден. Скажите как с этим бороться, потому что я думал заработает, а сейчас проверил, даже данные выходит не могу считать!!!

Dim oleConnect As New OleDb.OleDbConnection
Dim oleCommanda As New OleDb.OleDbCommand
Dim oleReader As System.Data.OleDb.OleDbDataReader
Dim Path As String = "Здесь прописан путь к базе"
Dim adapter As OleDbDataAdapter
Dim ds As New DataSet
Try
oleConnect.ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE IV;User ID=Admin;Password=", Path.ToString)
oleCommanda.Connection = oleConnect
oleCommanda.CommandType = CommandType.Text
oleCommanda.CommandText = "SELECT * FROM MyTable"
adapter = New OleDbDataAdapter(oleCommanda)
oleConnect.Open()
adapter.Fill(ds, "MyTable")
oleConnect.Close()
MessageBox.Show(ds.Tables.Item(0).Columns.Item(0).ToString)
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
If Not oleConnect Is Nothing Then
If oleConnect.State <> ConnectionState.Closed Then
oleConnect.Close()
End If
End If
End Try


MessageBox.Show("Таблица создана.", "Экспорт данных")