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

Вниз

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

 
ocean   (2009-12-29 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 "в базе уже есть объект с таким именем". Как это делать правильно?


 
Медвежонок Пятачок ©   (2009-12-29 12:20) [1]

сказано же что есть уже такой объект


 
Медвежонок Пятачок ©   (2009-12-29 12:22) [2]

Как это делать правильно?

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

try
...
except
end;


 
Ega23 ©   (2009-12-29 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   (2009-12-29 12:35) [4]

Значит, реализация SQL в Delphi7 мягко говоря неполная?


 
Медвежонок Пятачок ©   (2009-12-29 12:36) [5]

мда. глубокая мысль.


 
Медвежонок Пятачок ©   (2009-12-29 12:40) [6]

реализация SQL в Delphi7 мягко говоря неполная?

Я бы сказал еще категоричнее.
В делфи вообще нет никакой реализации SQL.


 
ocean   (2009-12-29 12:47) [7]

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


 
Медвежонок Пятачок ©   (2009-12-29 12:50) [8]

Но ведь каждый делает ЭТО.

Это еще не значит, что реализация языка SQL находится в делфи.


 
Медвежонок Пятачок ©   (2009-12-29 12:52) [9]

На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?

не вызывать create table если создаваемая таблица уже есть в базе данных.


 
12 ©   (2009-12-29 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
следующие команды будут в другом пакете, и для них таблицы уже не будет


 
Медвежонок Пятачок ©   (2009-12-29 13:03) [11]

для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.


 
ocean   (2009-12-29 13:16) [12]

> убрать обработку трай/эксепт в таком дурацком исполнении
Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
> просто таблица "жива еще".
Вот это правильно! Но "Go" ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.


 
Sergey13 ©   (2009-12-29 13:16) [13]

> [7] ocean   (29.12.09 12:47)
> Но ведь каждый делает ЭТО.

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


 
12 ©   (2009-12-29 13:17) [14]

потому что нет такой команды как go :)


 
Ega23 ©   (2009-12-29 13:24) [15]


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


команда GO - суть разделитель транзакций в MSSQL.


 
sniknik ©   (2009-12-29 13:28) [16]

> Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
еще одна глубокая мысль...

try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.


 
Ega23 ©   (2009-12-29 13:33) [17]


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


Ну пуркуа бы и не па?
Просто аккуратно надо этим пользоваться, вот и всё.


 
ocean   (2009-12-29 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 ©   (2009-12-29 13:51) [19]

да ладно, на :)
ADOQuery1.SQL.Text:="drop table table1"
ADOQuery1.Connection.BeginTrans;
ADOQuery1.ExecSQL;
ADOQuery1.Connection.CommitTrans;


 
Anatoly Podgoretsky ©   (2009-12-29 14:15) [20]

Вопрос по Дельфи есть?


 
sniknik ©   (2009-12-29 14:15) [21]

> try не срезает "ексепт" во время design.
кто такой design? когда его время?

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

имхо, у компонента либо выставлен асинхронный режим, либо, что более вероятно не используется компонент коннекта.


 
Anatoly Podgoretsky ©   (2009-12-29 14:17) [22]


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

А чем это чревато?


 
Медвежонок Пятачок ©   (2009-12-29 14:35) [23]

Ну при чем тут try?

Убери и увидишь при чем.


 
Медвежонок Пятачок ©   (2009-12-29 14:45) [24]

Еще раз говорю, drop ошибок не выдает.

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

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


 
Ega23 ©   (2009-12-29 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   (2009-12-29 16:46) [26]

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

Не совсем понял. Но после замены AdoQuery на AdoConnection все заработало. Спасибо!


 
Ega23 ©   (2009-12-29 16:50) [27]


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


Приведённый код отработает, без всяких "возможно".
Если бы не отработал, я бы сюда не запостил.


 
stas ©   (2009-12-29 17:15) [28]

ocean   (29.12.09 16:46) [26]
Чего-то я непойму что тебе нужно чем не устраивает Alter table?


 
Плохиш ©   (2009-12-30 14:55) [29]

А я всё-таки посоветую нанять программиста.
А то аФФтар тут давно мелькает, а толку ноль...



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

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

Наверх




Память: 0.54 MB
Время: 0.009 c
2-1303423377
Gu
2011-04-22 02:02
2011.07.31
Формирование магнитных ссылок


2-1303655524
istok
2011-04-24 18:32
2011.07.31
TSemaphore в Delphi7


1-1261051643
harisma
2009-12-17 15:07
2011.07.31
Название целевой директории в формате DOS


2-1303629199
iamempty
2011-04-24 11:13
2011.07.31
Выборка данных из определенного поля таблицы с помощью DBGrid


2-1303825966
Gu
2011-04-26 17:52
2011.07.31
Глубина цвета картинки