114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 110
1

"run-time error 3251"/ программное создание базы данных / и

13.05.2014, 20:47. Показов 3308. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую всех знатоков! может кто поможет, наконец дошел до баз данных, опыта нет поэтому нуждаюсь в помощи.
Несколько вопросов (3 в тексте кода).
Есть код который открывает существующую базу данных свободно читает поля, но при попытке ее дополнить или изменить содержимое полей выдает следующую ошибку.

Visual Basic
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
   Dim cat As ADOX.Catalog, tbldb As ADOX.Table
' в этом месте возникает ошибка: User-defined type not defined
'в references включены MS DAO 3.6 Object Library(OL), MS AcitveX Data Object 2.8 Library, MS AcitveX Data Object Recordset 2.8 Library, MS Office 14, MS Office 14
' Вопрос 1: какую библиотеку еще подключить чтобы эти типы данных регистрировались
 
   cnnAcc.Open cnnStrAcc 'открыть конекшен
   Set rst = CreateObject("ADODB.Recordset")
   rst.ActiveConnection = cnnAcc 'активный конекшен
   rst.LockType = adLockOptimistic
   rst.CursorType = adOpenKeyset
 
' в этом месте возникает ошибка: run-time error 3001 Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом
' которую можно ликвидировать убрав либо lockType или CursorType
'Вопрос 2 что здесь неправильно
 
    rst.Open s, cnnAcc 's -конкретная таблица в access
    While Not rst.EOF
       'здесь код чтения и выборки записей
        rst.MoveNext
    Wend
    rst.AddNew
' здесь ...
    rst.Fields(1) = "полный Бред"
 
' ...или здесь (в зависимости какая строка закоментирована) возникает ошибка: run-time error 3251.Текущий объект RecordSet не поддерживает обновление. Это связано с ограничением поставщика или выбранным типом блокировки
'справиться не удалось, перепробовал все что нашел в интернете открыл папку в которой находится файл для общего доступа, переписал файл на флешку (другая файловая система), может какие то проблемы с реестром, даже не знаю...
'Вопрос 3 как это можно вылечить
 
    rst.Update
    rst.Close
    Set rst = Nothing
    Set cnnAcc = Nothing
Вопрос 4 Как можно из кода VBA например в ворде создать программно новую базу данных в Access (чтобы создался отдельный файл).

Надеюсь на вашу помощь иначе голова лопнет...(
Заранее благодарен Алексей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2014, 20:47
Ответы с готовыми решениями:

Run-time error при сжатии базы данных
Добрый день! Подскажите, пожалуйста, как упредить ошибку 3045, возникающую при запуске команды...

Run Time Error 13 (Type Mismatch) или Run Time Error 9 (Overflow
Привет! Я столкнулся с такой проблемой. Есть приложение (пользовательская форма), которое...

Проблема с типами данных. Run-time error '6': OverFlow
Option Explicit Option Explicit Dim curCSP As Single Dim curSP As Single Dim dbSV As Single...

Создание, заполнение объектами и удаление динамического массива. Выдает run time error
Компилятор ни на что не ругается, но консоль вылетает с виндовской ошибкой #ifndef Point_HPP...

Проблема при обработке данных через VBA MS Access (Run Time Error 2004: Недостаточно памяти)
Ребята, проблема в следующем: при фильтровании данных через форму выводится ошибка Run Time Error...

11
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
14.05.2014, 08:14 2
Не может определить ADOX.Catalog, ADOX.Table. Если можно файл скиньте.
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 110
14.05.2014, 17:52  [ТС] 3
Roman_rc,
В принципе вот и весь код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Sub CreateTables()
 
    Dim cat As ADOX.Catalog, tbldb As ADOX.Table, nametbl As String' ВЫШЕУКАЗАННАЯ ОШИБКА 
'ВОЗНИКАЕТ В ЭТОЙ СТРОКЕ
    Dim wspDefault As Workspace, dbs As Database
    Dim ind As Object, varind As Variant, acDoc As Object
    Dim rst As Object, fld As Field, fd As FileDialog, Itemfile As Variant
    Dim filname As String, n As Integer, m As Integer, zag() As Variant
    Dim obWord As Object, obDoc As Object, obTbl As Object
      
    Set obDoc = ActiveDocument
    Set obTbl = obDoc.Tables(1)
   n = obTbl.Rows.Count
   m = obTbl.Columns.Count
   ReDim zag(m)
  ' создание таблицы БД
 
    Set cat = CreateObject("ADOX.Catalog") ' ЭТА ПРОБЛЕМА БЫЛА РЕШЕНА ЭТОЙ СТРОКОЙ
'А ПЕРЕМЕННАЯ cat была декларирована as Object
'   .... ДАЛЕЕ КОД ПРОГРАММЫ
'ВОПРОС В ТОМ ПОЧЕМУ ПРИ ОПИСАНИИИ В DIM НЕ РЕГИСТРИРУЕТСЯ ЭТОТ ТИП ДАННЫХ?
'cat As ADOX.Catalog, tbldb As ADOX.Table
заранее благодарен Алексей

Добавлено через 1 час 41 минуту
... и еще по ходу посмотрите пожалуйста следующий код почему опять возникает ошибка

Visual Basic
1
2
3
4
5
6
7
8
9
    Set acDoc = CreateObject("Access.Application")
    acDoc.NewCurrentDatabase ("G:\Progecte\Programming\Access\Internal")
    acDoc.Visible = True
    Set cat = CreateObject("ADOX.Catalog")
    Set conn = CreateObject("ADODB.Connection")
    Set conn = CurrentProject.Connection
    cat.ActiveConnection = conn ' в этом месте почему то опять возникает ошибка:
'run-time error 3001 Аргументы имеют неверный тип, выходят за пределы допустимого '
диапазона или вступают в конфликт друг с другом
Спасибо
0
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
15.05.2014, 12:26 4
В ошибке описано что не может найти Table и Catalog. То есть таких объектов не существует.
Попробуйте не назначать заранее тип переменным.

если
Visual Basic
1
Set cat = CreateObject("ADOX.Catalog")
выдаст ошибку, значит вы не подключили библиотеки для объекта ADOX

Вообще при отладке рекомендую пользоваться F8 и запускать view -> locals window
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 110
15.05.2014, 21:09  [ТС] 5
Roman_rc,
Спасибо Роман за ответ я уже разобрался почти со всем. Все библиотеки подключены как я писал в предыдущих сообщениях. оказалось даже больше, кроме всех необходимых библиотек я подключил еще зачем то (по видимому до кучи) и MS AcitveX Data Object Recordset 2.8 Library. Не знаю почему, повидимому эта библиотека перекрывает некоторые функции, но после если ее отключения все нормализовалось и все классы ADOX и ADODB стали видимыми и стали декларироваться.
сейчас уже достаточно продвинулся в необходимых знаниях очередная запинка это следующая:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    
    myIdx = CreateObject("ADOX.Index")
    With myIdx
        .Name = "idxDescription"' В ЭТОМ МЕСТЕ ВОЗНИКАЕТ ОШИБКА ТРЕБУЕТСЯ ОБЪЕКТ
'              run-time error 424
        .Unique = False
        .IndexNulls = adIndexNullsIgnore
        .Columns.Append "Description"
        .Columns(0).SortOrder = adSortAccending
    End With
    tbl.Indexes.Append myIdx' ну tbl это естественно таблица в базе данных
помогите разобраться в чем проблема с созданием индекса
Заранее благодарен Алексей
0
Заблокирован
16.05.2014, 18:02 6
AAAAAlexeyyyyy, Извините, я не читал с самого начала, но у меня такое ощущение, что вы идете "Анальным путем" к решению задания... Давайте вкратце, мне расскажите я помогу быстро.
0
призрак
3262 / 890 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
17.05.2014, 17:29 7
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
myIdx = CreateObject("ADOX.Index")
волшебное слово Set не пробовали писать?
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 110
18.05.2014, 23:20  [ТС] 8
ikki,
спасибо за ответ в примере я забыл поставить set. в оригинале set стоит если бы его не было тогда бы была другая ошибка
inv.DS,
спасибо за ответ, исходя из вашей прямоты я так полагаю что вы обладаете достаточным запасом знаний в области VBA и искренним желанием помочь, а это очень важно. Кратко суть из любого приложения MS Office создавать по необходимости базы данных для хранения любых данных, извлекать обрабатывать итд. с вопросом создания базы данных, индексов и ключей вроде все стало на свои места. Я уже спрашивал на форуме правда ответ не получил возможно ли хранить в этих файлах код любой, лучше VBA который подгружать по мере необходимости и исполнять. вопрос зачем?! - это связано с интерактивностью макроса, большинство юзеров для которых он создается нормально работают только с вордом.
и еще один вопрос, ниже код, почему необходимо после создания базы данных закрывать и переоткрывать то же соединение
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
...
    Set cat = New ADOX.Catalog
    cat.Create "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDB & "1" & ".accdb"
    Set conn1 = New ADODB.Connection
    conn1.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDB & 1 & ".accdb" & "; Persist Security Info=True;"
    Set tbl = New ADOX.Table
... создали базу данных создали необходимые таблицы итд...
далее необходимо чтото записать (Recordset), перед записью надо сделать следующее ,без этих 
двух строк выдается ошибка... ошибочная инструкция SQL; предполагалось 'DELETE', 'INSERT',...
 
    conn1.Close
    conn1.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & strDB & 1 & ".accdb" & "; Persist Security Info=True;"
еще есть вопросы, но это потом, если желание помочь не отпадет
заранее благодарен Алексей.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
19.05.2014, 00:58 9
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Я уже спрашивал на форуме правда ответ не получил возможно ли хранить в этих файлах код любой, лучше VBA который подгружать по мере необходимости и исполнять.
Мне кажется я уже отвечал - см. CreateObject("scriptcontrol")
0
Заблокирован
19.05.2014, 06:53 10
AAAAAlexeyyyyy, На самом деле, соединение можно открыть один раз и на всю сессию работы программы. Мне кажется, что культ по работе с базами данных, особенно с открытием соединения один раз на все сессию почему то забраковывается профессионалами. Ведь по сути в этом нет ничего трагичного. Сделайте просто, вынесите код подключения в модуль, откройте его 1 раз и не закрывайте, работайте с открытым подключением. А вот после окончания работы можете его закрыть, в VBA нет сборщика мусора как к примеру в C# и VB.NET, по этому старайтесь писать:

Visual Basic
1
Set ОБЪЕКТ = Nothing
Если более он Вам не нужен. Таким образом высвобождаете память (ОЗУ) которую жрет ваш макрос.

Persist Security Info=True - У Вас есть конфиденциальные данные в базе?
0
114 / 11 / 1
Регистрация: 01.05.2014
Сообщений: 110
20.05.2014, 17:06  [ТС] 11
Hugo121,
спасибо за CreateObject("scriptcontrol") только у меня ничего не получилось, можно какой-нибудь туториал или пример рабочий хотя бы, может что почитать
inv.DS,
Persist Security Info=True взял просто из книжки особо не разбирался. по видимому можно заfalseшить.
Спасибо
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
20.05.2014, 17:19 12
Читать знаю только форум, вот оттуда код от nerv:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub io()
    ' создали объект
    Set x = NewObject("forum: { KukLP: 'Sergei', AlexST: 'Alexei', RAN: 'Andrey' }")
    
    ' изменили его свойство
    x.forum.KukLP = "Сергей"
End Sub
 
Function NewObject(ByRef description As String) As Object
    With CreateObject("ScriptControl")
        .Language = "jscript"
        .Addcode "function x(){return {" & description & "};}"
        Set NewObject = .Run("x")
    End With
End Function
0
20.05.2014, 17:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2014, 17:19
Помогаю со студенческими работами здесь

SQL-запрос в Access, ошибка: Run-time error 3464 Несоответствие типов данных в выражении условия отбора.
Добрый день! Помогите решить проблему. Есть поле regdate в Access-таблице типа Дата/время, где я в...

Error in loading DLL. Run-time error '48'. Как исправить ошибку?
Создал в документе Word квитанцию, пытаюсь заполнить ее через VBA в Excel. Подключил библиотеку...

Ошибка 'Run-time error '-2147217842(80040e4e)' Automation error'.
На VB6.0 сделал несколько форм для вывода данных из базы Access на экран.Выложил на сервер, со...

Ошибка в VB6.0 и Access: 'Run-time error -2147217842(80040e4e) Automation error'.
На Visual Basic 6.0 сделал форму которая выводит на экран данные из таблиц Access.Сделал .EXE и...

Ошибка "Run-time error '-2147221020 (800401e4) Automation error invalid syntax
Доброго времени суток! Уважаемые форумчане :). Беда, просто беда. Записываю скрип и потом пытаюсь...

Ошибка: Run-time error 48 Error loading DLL
программа выдает ошибку: Run-time error 48 Error loading DLL выдает это когда вызывается...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru