Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.160.156] |
|
Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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 |