Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание поля в таблице / 12 сообщений из 12, страница 1 из 1
19.02.2012, 03:06
    #37669003
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Как прочитать поля в таблице, я разобрался:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
Private Sub Command1_Click()
Dim j As ADODB.Field
Dim SQL1 As String

SQL1 = "SELECT * FROM table WHERE 2=1"
Call AConn

    Dim RSBaza  As ADODB.Recordset
    Set RSBaza = CreateObject("ADODB.Recordset")
    RSBaza.LockType = 2
    

    RSBaza.Open SQL1, AdoConnection
    


For Each j In RSBaza.Fields
  Debug.Print j.Name & "-" & j.Type & "-" & j.DefinedSize
  
Next
End Sub


Public Sub AConn()

Dim ConnectionString As String
Dim mdb_file_Z As String


mdb_file_Z = "C:\1.mdb"


Set AdoConnection = CreateObject("ADODB.Connection")
    
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mdb_file_Z & _
";Mode=Share Deny None;Persist Security Info=False"

AdoConnection.Open ConnectionString

End Sub



Не разобрался только вот с чем:
1. В каком месте прилепить строку
Код: vbnet
1.
 RSBaza.Fields.Append "Question", 202, 50


Чтобы создалось поле "Question"
2. Как прочитать тип или свойство поля, не знаю как выразится, которое бы указало, что это ключевое поле и что это счетчик

P.S. Задача стоит такая: Сравнить две базы данных: 1.mdb и 2.mdb - если в базе 2 нет каких то таблиц, которые есть в базе 1 - то создать их. Если таблица существует - то проверить, все ли поля есть, как в файле 1. Если нет - то создать их.
...
Рейтинг: 0 / 0
19.02.2012, 10:29
    #37669057
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Вы пишете на VBA прямо в Access? Почему бы тогда не использовать средства самого Акцесса, без ADO?

Еще как вариант решения:
- создать копию 1.mdb
- вычистить все таблицы
- импортировать данные в таблицы из 2.mdb (отсутствие полей в совпадающих таблицах 2.mdb обработается спокойно; отсутствие таблиц в 2.mdb обрабатывается on error )
...
Рейтинг: 0 / 0
20.02.2012, 12:52
    #37670187
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
AndreTMВы пишете на VBA прямо в Access? Почему бы тогда не использовать средства самого Акцесса, без ADO?

Еще как вариант решения:
- создать копию 1.mdb
- вычистить все таблицы
- импортировать данные в таблицы из 2.mdb (отсутствие полей в совпадающих таблицах 2.mdb обработается спокойно; отсутствие таблиц в 2.mdb обрабатывается on error )

Нет, пишу не в Аксцесс а в VB
Вычищать все таблицы нельзя, т.к. необходимо, чтобы сохранились данные
...
Рейтинг: 0 / 0
20.02.2012, 13:02
    #37670209
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
donpauls1. В каком месте прилепить строку
Код: vbnet
1.
 RSBaza.Fields.Append "Question", 202, 50

в любом, где рекордсет уже открыт
...
Рейтинг: 0 / 0
20.02.2012, 15:40
    #37670568
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Дополнительный вопрос - а в таблицах 2 имеются поля, которых нет в таблицах 1? И еще - совпадающие поля - всегда одинаково определены?
donpaulsВычищать все таблицы нельзя, т.к. необходимо, чтобы сохранились данныеА вы поняли суть совета?
Имеем: 1 и 2.
Надо: Получить 2 со структурой таблиц, как в 1.
Делаем:
- Копируем 1 в 3
- Удаляем все данные из таблиц 3
- Удаляем все остальные объекты (формы, макросы,...) из 3
- Импортируем в 3 данные из таблиц 2
- Копируем остальные объекты из 2 в 3
- Переименовываем 3 в 2
...
Рейтинг: 0 / 0
20.02.2012, 18:02
    #37670945
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
donpaulsНе разобрался только вот с чем:
1. В каком месте прилепить строку
Код: vbnet
1.
 RSBaza.Fields.Append "Question", 202, 50


Чтобы создалось поле "Question"

Т.е. вот код - но здесь нет связи рекордсета RSBaza и AdoConnection
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Sub Command1_Click()
Dim j As ADODB.Field
Dim SQL1 As String

Call AConn

    Dim RSBaza  As ADODB.Recordset
    Set RSBaza = CreateObject("ADODB.Recordset")
    RSBaza.LockType = 2

    
    RSBaza.Fields.Append "Question", 202, 50

End Sub



А если открыть рекордсет, то невозможно выполнить Append при открытом рекордсете

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub Command1_Click()
Dim j As ADODB.Field
Dim SQL1 As String

SQL1 = "SELECT * FROM table WHERE 2=1"
Call AConn

    Dim RSBaza  As ADODB.Recordset
    Set RSBaza = CreateObject("ADODB.Recordset")
    RSBaza.LockType = 2
    

    RSBaza.Open SQL1, AdoConnection
    
    RSBaza.Fields.Append "Question", 202, 50

End Sub



Вопрос: Как выполнить .Append в рекордсете, который относится к AdoConnection.
Не знаю, правильно ли задан вопрос, но думаю его можно понять ))
...
Рейтинг: 0 / 0
20.02.2012, 18:09
    #37670961
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
AndreTMДополнительный вопрос - а в таблицах 2 имеются поля, которых нет в таблицах 1? И еще - совпадающие поля - всегда одинаково определены?
donpaulsВычищать все таблицы нельзя, т.к. необходимо, чтобы сохранились данныеА вы поняли суть совета?
Имеем: 1 и 2.
Надо: Получить 2 со структурой таблиц, как в 1.
Делаем:
- Копируем 1 в 3
- Удаляем все данные из таблиц 3
- Удаляем все остальные объекты (формы, макросы,...) из 3
- Импортируем в 3 данные из таблиц 2
- Копируем остальные объекты из 2 в 3
- Переименовываем 3 в 2

При таком подходе будут созданы недостающие таблицы, а мне необходимо чтобы были созданы не только недостающие таблицы, но и недостающие поля в уже имеющихся таблицах.
...
Рейтинг: 0 / 0
20.02.2012, 18:10
    #37670963
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Shocker.Prodonpauls1. В каком месте прилепить строку
Код: vbnet
1.
 RSBaza.Fields.Append "Question", 202, 50

в любом, где рекордсет уже открыт

Постом выше я писал о том, что при открытом рекордсете невозможно выполнить Append
Возможно рекордсет нужно как то по другому открывать?
...
Рейтинг: 0 / 0
20.02.2012, 18:59
    #37671066
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Код: vbnet
1.
Set RSBaza.ActiveConnection = AdoConnection
...
Рейтинг: 0 / 0
20.02.2012, 23:16
    #37671362
donpauls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Shocker.Pro
Код: vbnet
1.
Set RSBaza.ActiveConnection = AdoConnection



Не пойму, что я не так делаю:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Private Sub Command1_Click()
Dim j As ADODB.Field
Dim SQL1 As String

SQL1 = "SELECT * FROM calls_z WHERE 2=1"
Call AConn

    Dim RSBaza  As ADODB.Recordset
    Set RSBaza = CreateObject("ADODB.Recordset")
    Set RSBaza.ActiveConnection = AdoConnection
    RSBaza.LockType = 2
    

    
    RSBaza.Fields.Append "Question", 202, 50 ' Ошибка: не был задан текст команды для объекта команды
    RSBaza.Fields.Append "Answer", 202, 50

    RSBaza.Open SQL1, AdoConnection
    


For Each j In RSBaza.Fields
  Debug.Print j.Name & "-" & j.Type & "-" & j.DefinedSize
Next

End Sub
...
Рейтинг: 0 / 0
20.02.2012, 23:38
    #37671383
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Я, видимо, отвечал на вопросы как-то не находясь в контексте и не особо задумываясь в целом над вопросом, за что прошу прощения. Меня сбила изначальная постановка вопроса: "В каком месте прилепить Fields.Append"

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

Если нужно добавить в таблицу поле - это называется изменением схемы данных.
1) Можно работать с объектом ADOX
2) В случае с аксессом можно использовать DAO.TableDef
3) Можно выполнять непосредственно команды SQL для работы с таблицами/полями. В MSSQL это выглядит примерно так: ALTER TABLE MyTable ADD NewField int NULL, в Аксесс не знаю - посмотрите хелп, возможно так же
...
Рейтинг: 0 / 0
20.02.2012, 23:56
    #37671401
TpaBka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание поля в таблице
Если необходимо создать отвязанный рекордсет то:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Dim rs As New ADODB.Recordset

rs.CursorLocation = adUseClient
rs.CursorType = adOpenDynamic
rs.LockType = adLockOptimistic

rs.Fields.Append "StrFld", 202, 50

rs.Open

For i = 1 To 50
rs.AddNew 0, i
Next

rs.Update
rs.MoveFirst

For i = 1 To 50
Debug.Print rs(0)
rs.MoveNext
Next


И неважно есть конект с базой или нет

если в бд необходимо добавить поле в таблицу, то через ALTER TABLE

если есть рекордсет (rsSQL) созданный на основе запроса к бд, и в него нужно добавить новое поле то создаешь отвязанный рекордсет (rs) и:

Код: vbnet
1.
2.
3.
4.
For i=0 to rsSQL.Fields.Count -1
rs.Fields.Append  rsSQL.Fields(i).Name, rsSQL.Fields(i).Type, rsSQL.Fields(i).DefinedSize
Next
rs.Fields.Append "NewFld", 202, 255 ' и добавляешь новое поле



затем открываешь rs и заполняешь его записями из rsSQL
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание поля в таблице / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]