Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.06.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.053 c
4-1190007462
Nikfel
2007-09-17 09:37
2008.06.01
Как получить handle под курсором.


15-1208509824
Fynjy84
2008-04-18 13:10
2008.06.01
Страницы aspx и idHttp


2-1210445090
Alexey
2008-05-10 22:44
2008.06.01
Как поменять местами появление форм


2-1210059787
Petya
2008-05-06 11:43
2008.06.01
Поиск MS SQL


3-1198765879
LoDr
2007-12-27 17:31
2008.06.01
Firebird и представления





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский