Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.01;
Скачать: CL | DM;

Вниз

Как проверить что в базе есть таблица?   Найти похожие ветки 

 
Kolan ©   (2007-12-19 17:16) [0]

Здравствуйте,
 Работаю с MS SQL Server 2000.
 Допустим мне надо выполнить запрос:
 SQL.Add("SELECT * FROM CONF_USER");

Как проверить есть ли таблица CONF_USER?

И вообще, как бы организовать проверку что схема базы соответствует нужной программе?

ЗЫ
Можно конечно достать из системных таблиц, но ведь это не всегда возможно, или вседа?


 
ANB ©   (2007-12-19 17:21) [1]


> но ведь это не всегда возможно, или вседа?

Если проверку завернуть в хранимку, то всегда возможно.


 
Kolan ©   (2007-12-19 17:25) [2]

> Если проверку завернуть в хранимку, то всегда возможно.

А если её нет :).

Для чего? В программе есть возможность подключится к другой БД. Используется стандартный диалог. И подключение проходит нормально, а потом если перепутали базу, то так как проверки нет, начинаются эксепшены invalid object &#133


 
Jeer ©   (2007-12-19 17:25) [3]


> Как проверить есть ли таблица CONF_USER?


исключение ?


 
Jeer ©   (2007-12-19 17:26) [4]


> начинаются эксепшены invalid object


Так пробегись по таблицам и обрабатывай исключения


 
Kolan ©   (2007-12-19 17:27) [5]

> исключение ?

Да, но оно OleException как понять что именно нет таблицы? не парсить же строку&#133


 
Kolan ©   (2007-12-19 17:37) [6]

Придумал. В БД надо сделать служебную таблицу где писать тип БД. Приложение должно знать с каким типом БД оно умеет работать и соотв сверяться с  БД.


 
Anatoly Podgoretsky ©   (2007-12-19 17:49) [7]

> Kolan  (19.12.2007 17:16:00)  [0]

TAdoConnection.GetTableNames
 
INFORMATION_SCHEMA универсально и системно независимо.


 
Kolan ©   (2007-12-19 17:53) [8]

> TAdoConnection.GetTableNames

Читаю, но имхо подход с версией гораздо правильнее&#133


 
DiamondShark ©   (2007-12-19 18:06) [9]


> Как проверить есть ли таблица CONF_USER?

if OBJECT_ID("CONF_USER") is not null


 
DiamondShark ©   (2007-12-19 18:07) [10]


> В БД надо сделать служебную таблицу где писать тип БД.

И потом проверять, есть ли в базе служебная таблица ;)


 
Kolan ©   (2007-12-19 18:53) [11]

> И потом проверять, есть ли в базе служебная таблица ;)

Угу, только не потом, а сначала. Тут и пригодится GetTableNames или OBJECT_ID.


 
Petr V. Abramov ©   (2007-12-19 21:54) [12]

>  а потом если перепутали базу,
а если перепутали, куда пришли? А если голову забыли?
решаемо, конечно, все, но:
1. ограничить выбор доступных баз "правильными"
2. довести до сознания, что если есть возможность коннекта к, допустим, тестовой и боевой, в них есть несоответствия и они выражаются как "ачинаются эксепшены invalid object …"
3. кто 2. не понимает - бестолковый тестер


 
Petr V. Abramov ©   (2007-12-19 21:57) [13]

> эксепшены invalid object …
для бестолкового что "invalid object …", что "глубокоуважаемый, Вы подключились к хранилищу данных, где того, что Вы хотите, просто нет" -
КОМПЬЮТЕР НЕ РАБОТАЕТ!!!


 
Kolan ©   (2007-12-19 22:30) [14]

> 1. ограничить выбор доступных баз «правильными»

От это сложнее диалог та внедрах винды&#133


 
Petr V. Abramov ©   (2007-12-19 22:49) [15]

> Kolan ©   (19.12.07 22:30) [14]
> От это сложнее диалог та внедрах винды…

а файерволл - в руках админа.
проще, чем то, что ты задумал.


 
Kolan ©   (2007-12-21 13:58) [16]

Тааак, продолжаем разговор.

1. В бд есть таблица в которой есть поля для версии.
 MajorVersion
 MinorVersion
 ReleaseVersion
 BuildVersion


Хоть таблица и была раньше никакой софт версию не проверял почему-то&#133

2. Теперь в эту таблицу добавили поле Type — тип бд. Но по административным причинам это поле может и отсутствовать.

Итог алгоритм проверки такой:
1. Проверяю что есть нужная таблица
if OBJECT_ID(<таблица>) is not null
2. Если она есть, то проверяю есть ли там нужные поля(так как Type может не быть).
3. Если есть, то сравниваю тип и версию&#133

В случае неудачь понятно матерюсь&#133

Вот как правильно сделат пункт 2 я незнаю &#133


 
Kolan ©   (2007-12-21 14:07) [17]

Вот как правильно сделат пункт 2 я незнаю …
COL_NAME наверно?


 
Palladin ©   (2007-12-21 14:13) [18]

select * from syscolumns where id=OBJECT_ID("таблица") and name="поле"


 
Kolan ©   (2007-12-21 14:15) [19]

> select * from syscolumns where id=OBJECT_ID("таблица") and
> name="поле"

А всегда это получится? Права доступа не повлияют?


 
Palladin ©   (2007-12-21 14:20) [20]

ну в теории должно всегда... по крайней мере у меня проблем не было


 
Kolan ©   (2007-12-21 14:23) [21]

> ну в теории должно всегда&#133 по крайней мере у меня проблем
> не было

ок


 
Плохиш ©   (2007-12-21 14:32) [22]

2.1. Запрос select * from таблица where 1=0
2.2. Пробежаться по Fields/FieldDefs


 
Palladin ©   (2007-12-21 14:34) [23]

бежать придется по FildDefs, Fields"ов не будет, бо не будет курсора, это раз, два - гораздо легковесней выполнить TADOConnection.GetFieldNames


 
Kolan ©   (2007-12-21 16:04) [24]

Сделал
select * from syscolumns where id=OBJECT_ID("таблица") and name="поле"


 
MsGuns ©   (2007-12-22 19:35) [25]

type

 // Дескриптор SQL-сервера
 PMSSQLServerDef = ^RMSSQLServerDef;
 RMSSQLServerDef = record
   ServerName: string;          // Имя сервера
   InstanceName: string;        // Установочный ид-р сервера
   IsClustered: boolean;        // Флаг включения в серверный кластер
   Version: RSQLServerVersion;  // Версия сервера
   Port: integer;               // Коммуникационный порт
   Path: string;                // Путь к серверу в сети
 end;

 // Дескриптор SQL колонки (поля)
 PSQLFieldDef = ^RSQLFieldDef;
 RSQLFieldDef = record
   FldName: string;
   PKey: boolean;
   AInc: boolean;
   IsNULL: boolean;
   FldType: string;
   FType: TFieldType;
   Length: word;
   Scale: byte;
   Description: string;
 end;

function SQLServ_GetServerTableList(SQLServer: PMSSQLServerDef; DataBase: string; ListTables: TStrings): boolean;
begin
 ListTables.Clear;
 with TADODataSet.Create(nil) do
   try
     ConnectionString := "Provider=SQLOLEDB;"+
                         ";Persist Security Info=false"+
                         ";User ID=sa"+
                         ";Data Source="+SQLServer.ServerName;
     CommandText := "use "+DataBase+" select * from sysobjects where xtype="+QuotedStr("u");
     try
       Open;
       while not eof do
         begin
          ListTables.Add(Fields[0].AsString);
          Next;
         end;
       Close;
       result := true;
     except
       result := false;
     end;
   finally
     Free;
   end;
end;

function SQLServ_GetTableFieldsList(SQLServer: PMSSQLServerDef; DataBase,TableName: string; ListFields: TList): boolean;
var
 i: integer;
 fd: PSQLFieldDef;

begin
 for i := 0 to ListFields.Count-1 do Dispose(PSQLFieldDef(ListFields[i]));
 ListFields.Clear;
 with TADODataSet.Create(nil) do
   try
    ConnectionString := "Provider=SQLOLEDB;"+
                       ";Persist Security Info=false"+
                       ";User ID=sa"+
                       ";Data Source="+SQLServer.ServerName;
    CommandText := "use "+DataBase+" Exec sp_columns "+TableName;
    Open;
    while not EOF do
      begin
       fd := NEW(PSQLFieldDef);
       fd.FldName := FieldByName("COLUMN_NAME").AsString;
       fd.PKey := false;
       fd.FldType := FieldByName("TYPE_NAME").AsString;
       fd.AInc := (Pos("IDENTITY",UpperCase(fd.FldType))>0);
       fd.IsNULL := (FieldByName("IS_NULLABLE").AsString="YES");
       fd.Length := StrToInt(FieldByName("LENGTH").AsString);
       fd.Scale := 0;
       if UpperCase(fd.FldType)="NUMERIC" then
          fd.Scale := StrToInt(FieldByName("SCALE").AsString);
       fd.Description := "No Description";
       ListFields.Add(fd);
       Next;
      end;
    Close;
    // Извлечение описателей
    CommandText := "use "+DataBase+" select sc.name, sp.value "+
                   "from sysobjects so, syscolumns sc, sysproperties sp "+
                   "where so.id=sc.id and so.id=sp.id and "+
                   "sp.smallid=sc.colorder and so.name="+QuotedStr(TableName);
    Open;
    for i := 0 to ListFields.Count-1 do
      if Locate(Fields[0].FieldName,PSQLFieldDef(ListFields[i]).FldName,[]) then
         PSQLFieldDef(ListFields[i]).Description := Fields[1].AsString;
    Close;
    result := true;
   finally
    Free;
   end;
end;


 
MsGuns ©   (2007-12-22 19:39) [26]

Забыл ;)

 RSQLServerVersion = record
   VersNum: string;
   ModNum: string;
 end;


 
Ega23 ©   (2007-12-23 14:18) [27]

Для таблицы :

if exists (select 1 from  sysobjects where  id = object_id("TableName")          and   type = "U")


Для поля :


if COLUMNPROPERTY(OBJECT_ID(N"[TableName]"), "columnName", "precision") is NULL
begin
ALTER TABLE TableName add columnName .... ;



Страницы: 1 вся ветка

Текущий архив: 2008.06.01;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.019 c
2-1210440929
Прогмэн
2008-05-10 21:35
2008.06.01
Как узнать средствами Дельфи об антивирусах


2-1210059273
laao
2008-05-06 11:34
2008.06.01
Возможна ли условная компиляция по наличию компонента/библиотеки?


15-1208503032
Anatoliy_V
2008-04-18 11:17
2008.06.01
Региональные стандарты?


2-1210254880
WebSQLNeederr
2008-05-08 17:54
2008.06.01
Напомните как в Стринглист удалить повторяющиеся строки?


11-1148047039
igorek_2005
2006-05-19 17:57
2008.06.01
Установка KOL&amp;MCK на Delphi 10