powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание поля в таблице
12 сообщений из 12, страница 1 из 1
Создание поля в таблице
    #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
Создание поля в таблице
    #37669057
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы пишете на VBA прямо в Access? Почему бы тогда не использовать средства самого Акцесса, без ADO?

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

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

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

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

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

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

Постом выше я писал о том, что при открытом рекордсете невозможно выполнить Append
Возможно рекордсет нужно как то по другому открывать?
...
Рейтинг: 0 / 0
Создание поля в таблице
    #37671066
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
Set RSBaza.ActiveConnection = AdoConnection
...
Рейтинг: 0 / 0
Создание поля в таблице
    #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
Создание поля в таблице
    #37671383
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, видимо, отвечал на вопросы как-то не находясь в контексте и не особо задумываясь в целом над вопросом, за что прошу прощения. Меня сбила изначальная постановка вопроса: "В каком месте прилепить Fields.Append"

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

Если нужно добавить в таблицу поле - это называется изменением схемы данных.
1) Можно работать с объектом ADOX
2) В случае с аксессом можно использовать DAO.TableDef
3) Можно выполнять непосредственно команды SQL для работы с таблицами/полями. В MSSQL это выглядит примерно так: ALTER TABLE MyTable ADD NewField int NULL, в Аксесс не знаю - посмотрите хелп, возможно так же
...
Рейтинг: 0 / 0
Создание поля в таблице
    #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
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание поля в таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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