Конференция "Базы" » Как правильно создавать таблицу? [D7, MSSQL]
 
  • ocean (29.12.09 12:15) [0]
    AdoQuery1.SQL.Text := 'drop table table1';
    try AdoQuery1.ExecSQL;
    except; end;
    AdoQuery1.SQL.Text := 'create table table1 (   'id  int NOT NULL identity(1,1) PRIMARY KEY, name      varchar(50)        NULL ... )';
    AdoQuery1.ExecSQL;
    На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?
  • Медвежонок Пятачок © (29.12.09 12:20) [1]
    сказано же что есть уже такой объект
  • Медвежонок Пятачок © (29.12.09 12:22) [2]
    Как это делать правильно?

    Правильно - это не писать таких конструкций

    try
    ...
    except
    end;
  • Ega23 © (29.12.09 12:26) [3]

    if not exists (select 1 from  sysobjects where  id = object_id('Table1')             and   type = 'U')
    begin
     create table Table1 (
        id  int NOT NULL identity(1,1),
        .....
        constraint PK_Table1 primary key  (id)
     );
     end;

  • ocean (29.12.09 12:35) [4]
    Значит, реализация SQL в Delphi7 мягко говоря неполная?
  • Медвежонок Пятачок © (29.12.09 12:36) [5]
    мда. глубокая мысль.
  • Медвежонок Пятачок © (29.12.09 12:40) [6]
    реализация SQL в Delphi7 мягко говоря неполная?

    Я бы сказал еще категоричнее.
    В делфи вообще нет никакой реализации SQL.
  • ocean (29.12.09 12:47) [7]
    > Ega23 ©   (29.12.09 12:26) [3]
    а если таблица уже есть, а я хочу изменить столбцы, alter table? Логичнее
    drop
    create table
    Да и пробовал я это. ExecSQL ругается на несколько операций в 1 запросе.
    > В делфи вообще нет никакой реализации SQL.
    Но ведь каждый делает ЭТО. А ты как создаешь таблицы?
  • Медвежонок Пятачок © (29.12.09 12:50) [8]
    Но ведь каждый делает ЭТО.

    Это еще не значит, что реализация языка SQL находится в делфи.
  • Медвежонок Пятачок © (29.12.09 12:52) [9]
    На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?

    не вызывать create table если создаваемая таблица уже есть в базе данных.
  • 12 © (29.12.09 12:58) [10]
    просто таблица "жива еще". Надо как-то подтвердить drop

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Contract]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Contract]
    GO
    так делает isqlw.exe
    последнее go разделяет пакет для mssql
    следующие команды будут в другом пакете, и для них таблицы уже не будет
  • Медвежонок Пятачок © (29.12.09 13:03) [11]
    для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.
  • ocean (29.12.09 13:16) [12]
    > убрать обработку трай/эксепт в таком дурацком исполнении
    Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
    > просто таблица "жива еще".
    Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.
  • Sergey13 © (29.12.09 13:16) [13]
    > [7] ocean   (29.12.09 12:47)
    > Но ведь каждый делает ЭТО.

    Наверное я неправильный совсем. Ни разу не создавал таблицы из своих программ.
  • 12 © (29.12.09 13:17) [14]
    потому что нет такой команды как go :)
  • Ega23 © (29.12.09 13:24) [15]

    > Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде.
    >  Неверная stored-процедура, неверный синтаксис если после
    > if exists.


    команда GO - суть разделитель транзакций в MSSQL.
  • sniknik © (29.12.09 13:28) [16]
    > Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
    еще одна глубокая мысль...

    try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.
  • Ega23 © (29.12.09 13:33) [17]

    > Наверное я неправильный совсем. Ни разу не создавал таблицы
    > из своих программ.


    Ну пуркуа бы и не па?
    Просто аккуратно надо этим пользоваться, вот и всё.
  • ocean (29.12.09 13:50) [18]
    > причем тут "срезанный" им эксепт
    try не срезает "ексепт" во время design. Еще раз говорю, drop ошибок не выдает. Вот эта мысль разумная,
    > if not exists (select 1 from  sysobjects where  id = object_id('Table1')
    Только ради вас, я пишу:
    AdoQuery1.SQL.Text := 'if object_id(''table1'',''U'') IS NOT NULL drop table table1';
    AdoQuery1.ExecSQL;
    AdoQuery1.SQL.Text := 'create table ...
    Результат не меняется. Ребята, вы очень глубокомысленны, но вопрос-то простой?
  • 12 © (29.12.09 13:51) [19]
    да ладно, на :)
    ADOQuery1.SQL.Text:='drop table table1'
    ADOQuery1.Connection.BeginTrans;
    ADOQuery1.ExecSQL;
    ADOQuery1.Connection.CommitTrans;
  • Anatoly Podgoretsky © (29.12.09 14:15) [20]
    Вопрос по Дельфи есть?
  • sniknik © (29.12.09 14:15) [21]
    > try не срезает "ексепт" во время design.
    кто такой design? когда его время?

    > но вопрос-то простой?
    только исполнение дурное, а в чем не показано, т.е. исходные данные не все.

    имхо, у компонента либо выставлен асинхронный режим, либо, что более вероятно не используется компонент коннекта.
  • Anatoly Podgoretsky © (29.12.09 14:17) [22]

    Похоже, ты мастеришь таблицы в management
    > studio.

    А чем это чревато?
  • Медвежонок Пятачок © (29.12.09 14:35) [23]
    Ну при чем тут try?

    Убери и увидишь при чем.
  • Медвежонок Пятачок © (29.12.09 14:45) [24]
    Еще раз говорю, drop ошибок не выдает.

    хочешь сказать что ты умнее скл сервера что ли?

    кстати, если дроп ошибок не выдает, тем более убери try.
    может тогда дойдет.
  • Ega23 © (29.12.09 15:06) [25]

    > Только ради вас, я пишу:
    > AdoQuery1.SQL.Text := 'if object_id(''table1'',''U'') IS
    > NOT NULL drop table table1';
    > AdoQuery1.ExecSQL;
    > AdoQuery1.SQL.Text := 'create table ...
    > Результат не меняется. Ребята, вы очень глубокомысленны,
    >  но вопрос-то простой?


    Для тех, кто в танке:


    unit Unit2;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, DB, ADODB;

    type
     TForm2 = class(TForm)
       ADOConnection1: TADOConnection;
       ADOCommand1: TADOCommand;
       ADODataSet1: TADODataSet;
       Button1: TButton;
       Button2: TButton;
       Label1: TLabel;
       procedure FormCreate(Sender: TObject);
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    var
     ss : string;
    begin
     ss := 'Select x=count(*) from test_table';
     try
      ADODataSet1.CommandText := ss;
      ADODataSet1.Open;
      Label1.Caption := ADODataSet1.FieldByName('X').AsString;
     finally
       ADODataSet1.Close;
     end;
    end;

    procedure TForm2.Button2Click(Sender: TObject);
    var
     ss : string;
    begin
     ss := 'if not exists (select 1 from sysobjects where id = object_id(''test_table'') and   type = ''U'') ' +
        'begin  create table test_table (id  int NOT NULL identity(1,1)) end';
     ADOCommand1.CommandText := ss;
     ADOCommand1.Execute;
    end;

    procedure TForm2.FormCreate(Sender: TObject);
    begin
     ADOConnection1.Connected := True;
    end;

    end.

  • ocean (29.12.09 16:46) [26]
    > Ega23 ©   (29.12.09 15:06) [25]
    > Для тех, кто в танке:
    Приведенный код, возможно, отработает, но к моему вопросу отношения не имеет. В моем случае таблица уже есть.
    > ADOQuery1.Connection.CommitTrans;> <Цитата>
    Не помогает.
    > имхо, у компонента либо выставлен асинхронный режим, либо,
    >  что более вероятно не используется компонент коннекта.

    Не совсем понял. Но после замены AdoQuery на AdoConnection все заработало. Спасибо!
  • Ega23 © (29.12.09 16:50) [27]

    > Приведенный код, возможно, отработает


    Приведённый код отработает, без всяких "возможно".
    Если бы не отработал, я бы сюда не запостил.
  • stas © (29.12.09 17:15) [28]
    ocean   (29.12.09 16:46) [26]
    Чего-то я непойму что тебе нужно чем не устраивает Alter table?
  • Плохиш © (30.12.09 14:55) [29]
    А я всё-таки посоветую нанять программиста.
    А то аФФтар тут давно мелькает, а толку ноль...
 
Конференция "Базы" » Как правильно создавать таблицу? [D7, MSSQL]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]