Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.89.183] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
как проверяете существование таблицы?
Эта тема была разделена из темы "Посоветуйте, пожалуйста, как лучше" |
Сообщ.
#2
,
|
|
|
а проанализировать, есть ли таблица, можно так (ADO+ VC):
Цитата try { m_pRstEvent->Open("TableName", _variant_t((IDispatch*)m_pConn),adOpenKeyset, adLockOptimistic,adCmdTable); } catch(...) { AfxMessageBox("Такой таблицы нет"); return false; } return true; ну а проверить на то, пустая она или нет, я думаю ты знаешь |
Сообщ.
#3
,
|
|
|
2PIL, я VC плохо понимаю. можно ли проверить существование таблицы с помощью SQL?
|
Сообщ.
#4
,
|
|
|
2 tomsksmile, я таких способов не знаю..
|
Сообщ.
#5
,
|
|
|
Цитата tomsksmile, 3.12.04, 10:23, 531328 как проверяете существование таблицы? SELECT COUNT(*) FROM msysobjects WHERE type = 1 AND name = 'Таблицы22' Добавлено Цитата Kezya, 3.12.04, 06:47, 531135 3. Создавать временную таблицу вообще в отдельном файле, т.е. в другой базе данных. Соответственно - при запуске программы файл создавать, при выходе - удалять. Не надо тогда проверять существование таблицы, т.к. файл стирается и создается принулительно. Такой вариант мне кажется более простым и удобным: основная база не будет увеличиваться в размерах и надежнее как-то кажется. Но насоклько это скажется на производительности - работа с тибалицами в разных базах? Если временную таблицу создавать в той же базе, то за несколько расчетов (от 10 до 15) база распухает примерно в 2 раза Создавать временные таблицы в базе tmp.mdb и не удалять ее а удалять таблицы в ней ну и иногда делать сжатие. |
Сообщ.
#6
,
|
|
|
2Bas, где можно посмотреть значения msysobjects.type?
мне нужно значение для представлений view. нашел, что запросы и преддставления - это msysobjects.type=5 Описание системной таблицы MS Access - MSysObjects поторопился... из MS Access я могу "читать msysobjects" пытаюсь писать в Дельфи6 function TModuleModel.CheckView(ViewName : string): boolean; var q : TADOQuery; sqlString : string; begin q := TADOQuery.Create(Application); try q.Connection := ModuleModel.ConModel; sqlString := 'SELECT Count(*) FROM msysobjects ' + 'WHERE msysobjects.Type=5 AND msysobjects.Name = %s'; sqlString := format(sqlString, [ViewName]); q.sql.Clear; q.SQL.Add(sqlString); q.Open; case (q.Fields.Fields[0].AsInteger) of 0 : result := false; 1 : result := true; end; finally q.Free; end; end; в момент открытия запроса выдается сообщение об ошибке: Записи не могут быть прочитаны, отсутствует разрешение на чтение данных для 'msysobjects'. что делать? ADO/Delphi6/Access97 |
Сообщ.
#7
,
|
|
|
Цитата tomsksmile, 3.12.04, 11:39, 531392 запросы и преддставления - это msysobjects.type=5 Кажеться так 1 – определяет таблицу 2 – поле 3 - индекс |
Сообщ.
#8
,
|
|
|
В королевстве предлагают пользоваться стронними компанентами. опять какие-то дебри.
мне нужно работая с представлениями перед их использованием удалять их (проверив что они есть) а потом заполнять и снова удалять. удаление перед использованием необходимо для того, чтобы если во время заполения представлений произошел сбой, то нужно избежать проблемы в следующий раз. |
Сообщ.
#9
,
|
|
|
Цитата tomsksmile, 3.12.04, 12:35, 531463 В королевстве предлагают пользоваться стронними компанентами. опять какие-то дебри. Пусть предлагают. Когда содавал DNS там была галочка Системная База Данных - и стояло нет. Установи в другое положение и укажи путь к системной базе по умолчанию это system.mdw . И теперь конектишся с User Name - Admin и будут у тебя права. |
Сообщ.
#10
,
|
|
|
2Bas, вот моя строка подключения
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin; Data Source=C:\dis\work\DB\test.mdb; Mode=Share Deny None; Extended Properties=""; Persist Security Info=False; Jet OLEDB:System database=""; Jet OLEDB:Registry Path=""; Jet OLEDB:Database Password=""; Jet OLEDB:Engine Type=5; Jet OLEDB:Database Locking Mode=0; Jet OLEDB:Global Partial Bulk Ops=2; Jet OLEDB:Global Bulk Transactions=1; Jet OLEDB:New Database Password=""; Jet OLEDB:Create System Database=False; Jet OLEDB:Encrypt Database=False; Jet OLEDB:Don't Copy Locale on Compact=False; Jet OLEDB:Compact Without Replica Repair=False; Jet OLEDB:SFP=False нужно поменять Jet OLEDB:Create System Database=False на True? в Jet OLEDB:System database писать путь или просто system.mdw??? |
Сообщ.
#11
,
|
|
|
Цитата tomsksmile, 3.12.04, 13:30, 531557 нужно поменять Jet OLEDB:Create System Database=False на True? Да Цитата tomsksmile, 3.12.04, 13:30, 531557 в Jet OLEDB:System database писать путь или просто system.mdw??? Пробуйте |
Сообщ.
#12
,
|
|
|
перепробывал варианты с подключением файла рабочей группы system.mdw
1. нашел его на диске и прописал в свойстве System database путь к нему C:\Documents and Settings\Администратор\Application Data\Microsoft\Access\system.mdw 2. копировал файл в рабочую директорию (где хранится моя база) и задавал свойство System database = system.mdw 3. прочитал раздел ФАКа "Как открыть базу данных Microsoft Access .MDB в Delphi?" 4. читал инфо microsoft-a ошибки все равно происходят. что еще можно сделать? |
Сообщ.
#13
,
|
|
|
из всех свойств оставил только три
ConModel.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0; ' + 'Data Source='+path +';+ 'Jet OLEDB:System database='+pathSysDB+';'; где path := 'C:\test.mdb' pathSysDB := 'C:\Documents and Settings\Администратор\Application Data\Microsoft\Access\system.mdw'; кроме того переписал CheckView('"'+'temper2'+'"') и все сработало. сначала сделал, а потом подумал. а нужно было наоборот. полез смотреть реестр. программу запускал под Администратором - она сработала, запустил под пользоватлем - она пошла, только после изменения пути pathSysDB := 'C:\Documents and Settings\mike\Application Data\Microsoft\Access\system.mdw'; по сему два вопроса: 1. За что отвечает свойство Jet OLEDB:Create System Database? 2. как сделать так, чтобы можно было работать с программой под любым пользователем? мои идеи: 1. свойство Jet OLEDB:Create System Database, установленное в True, говорит Jet, что мы создаем «пустую» системную базу, а не собираемся использовать существующую. 2. читать реестр |
Сообщ.
#14
,
|
|
|
Цитата tomsksmile, 4.12.04, 12:57, 532418 2. как сделать так, чтобы можно было работать с программой под любым пользователем? Создать mdw для текущей базы и использовать ее. |
Сообщ.
#15
,
|
|
|
Цитата PIL, 3.12.04, 12:00, 531358 2 tomsksmile, я таких способов не знаю.. можно поробовать создать такуюже таблицу и если она есть, то вылетит ексепшн, типа table was exists |
Сообщ.
#16
,
|
|
|
Цитата Создать mdw для текущей базы и использовать ее. Bas, как ее создавать понятно (свойство установить в true), но вот не могу понять где она создается. и что потом придется каждый раз создавать системную таблицу после того как я из архива извлеку основную базу данных? системная таблица привязана к определенной базе данных. поэтому нужно при распаковке базы из архива делать заново и системный файл. |
Сообщ.
#17
,
|
|
|
Как используя ADO можно получить информацию из системной таблицы базы MS Access
Подключаясь к базе данных MS Access используя ADO-технологию может потребоваться информация, которая хранится в системной таблице MSysObject вашей базы данных. Например, Вам нужно знать есть ли какая-то таблица (table), запрос (query) или представление (view) в вашей базе. В базе MS Access пишем запрос SELECT Count(*) FROM msysobjects WHERE msysobjects.Type=5 AND msysobjects.Name = MyView Если представление MyView существует, то запрос вернет одно поле, в котором будет будет стоять единица, в противном случае получим поле c нулем. Для того, чтобы заставить работать наш запрос в среде Delphi нужно настроить строку подключения, например, вот так ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+ 'Data Source='+pathDB+';'+ 'Jet OLEDB:Create System Database=true;'+ 'Jet OLEDB:System database='+pathSysDB; В этой строке: pathDB – путь к вашей базе, pathSysDB – путь к файлу рабочей группы. Предварительно можно создать свой файл рабочей группы (можно использовать и системный файл, который располагается по умолчанию C:\Documents and Settings\user\Application Data\Microsoft\Access). Чтобы создать файл рабочей группы нужно запустить MS Access->Сервис->Защита->Администратор рабочих групп->Создать… После подключения файла рабочей группы можно обращаться с запросами к системной таблице MSysObject непосредственно из среды Delphi. ------- Уважаемые господа Представляю на обсуждение решение поднятой мною проблемы. Уважаемые модераторы Достойно ли предложенное описание решения проблемы ФАКа? |
Сообщ.
#18
,
|
|
|
Через DNS
[ODBC] DRIVER=Microsoft Access Driver (*.mdb) UID=admin UserCommitSync=Yes Threads=3 SystemDB=C:\Program Files\Common Files\SYSTEM\SYSTEM.MDW SafeTransactions=0 ReadOnly=1 PageTimeout=5 MaxScanRows=8 MaxBufferSize=2048 FIL=MS Access Exclusive=0 DriverId=25 DefaultDir=D:\temp\Dom\S DBQ=D:\temp\Dom\S\db1.mdb В вступлении опиши ошибку и почему она возникает Цитата tomsksmile, 5.12.04, 18:11, 533506 При этом не забудьте раздать права.Чтобы создать файл рабочей группы Добавь рассшифровку значения Type, а также этот тип подключения являеться общим для Delphi,C++ Builder,VB - для всех кто использует ADO,ODBC - BDE не исключение. |
Сообщ.
#19
,
|
|
|
Q.Как получить информацию из системных таблиц MS Access?
Q.Как узнать существует таблица (запрос,представление) в базе MS Access? Приведем пример с использованием таблицы MSysObject базы MS Access: Подключаясь к базе данных MS Access используя какую-либо технологию (ADO, ODBC, BDE) может потребоваться информация, которая хранится в системной таблице MSysObject вашей базы данных. Например, Вам нужно знать есть ли какая-то таблица (table), запрос (query) или представление (view) в вашей базе. В базе MS Access пишем запрос SELECT Count(*) FROM msysobjects WHERE msysobjects.Type=5 AND msysobjects.Name = MyView Если представление MyView существует, то запрос вернет одно поле, в котором будет стоять единица, в противном случае получим поле c нулем. Если, соблюдая синтаксис языка SQL, написать запрос в среде программирования Delphi/BCB, то будет выдаваться сообщение о том, что «Записи не могут быть прочитаны, отсутствует разрешение на чтение данных для 'msysobjects'». Для того, чтобы получить разрешение на чтение данных из среды Delphi/BCB нужно настроить строку подключения (ADO-технология), например, вот так ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+ 'Data Source='+pathDB+';'+ 'Jet OLEDB:Create System Database=true;'+ 'Jet OLEDB:System database='+pathSysDB; В этой строке: pathDB – путь к вашей базе, pathSysDB – путь к файлу рабочей группы. По умолчанию будут использоваться системный файл (system.mdw), который располагается C:\Documents and Settings\user\Application Data\Microsoft\Access. Если на вашем компьютере несколько пользователей, будут возникать проблемы с правами использования данного файла. Чтобы создать свой файл рабочей группы нужно запустить MS Access->Сервис->Защита->Администратор рабочих групп->Создать… и в стоке подключения указать путь pathSysDB к созданному системному файлу. После подключения файла рабочей группы можно обращаться с запросами к системной таблице MSysObject непосредственно из программирования Delphi/BCB. Приведем значения, которое может принимать Type: Type Пояснение 1 таблица 6 присоединенная таблица 5 запрос/представление 8 отношения,связи (Relationships) -32768 форма -32764 отчет -32766 макрос -32761 модуль |
Сообщ.
#20
,
|
|
|
имеет ли значение на какой операционке сделана системная таблица?
таблицу делал с помощью аксесс2002 на winXP (апгрейn с home до pro), при запуске программы на win2000 я не вижу, что системная таблица работает. |
Сообщ.
#21
,
|
|
|
Цитата tomsksmile,8.01.05, 08:06 @ имеет ли значение на какой операционке сделана системная таблица? На какой OC - значение не имеет. А значение имеет версия Access'а принцып такой "старшие" - понимают "младших" и пытаються "подтянуть" до себя, "младшие" не понимают "старших". Сообщения были разделены в тему "Получить доступ к системным таблицам" |