-
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 "в базе уже есть объект с таким именем". Как это делать правильно?
-
сказано же что есть уже такой объект
-
Как это делать правильно?
Правильно - это не писать таких конструкций
try ... except end;
-
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;
-
Значит, реализация SQL в Delphi7 мягко говоря неполная?
-
мда. глубокая мысль.
-
реализация SQL в Delphi7 мягко говоря неполная?
Я бы сказал еще категоричнее. В делфи вообще нет никакой реализации SQL.
-
> Ega23 © (29.12.09 12:26) [3] а если таблица уже есть, а я хочу изменить столбцы, alter table? Логичнее drop create table Да и пробовал я это. ExecSQL ругается на несколько операций в 1 запросе. > В делфи вообще нет никакой реализации SQL. Но ведь каждый делает ЭТО. А ты как создаешь таблицы?
-
Но ведь каждый делает ЭТО.
Это еще не значит, что реализация языка SQL находится в делфи.
-
На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?
не вызывать create table если создаваемая таблица уже есть в базе данных.
-
просто таблица "жива еще". Надо как-то подтвердить 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 следующие команды будут в другом пакете, и для них таблицы уже не будет
-
для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.
-
> убрать обработку трай/эксепт в таком дурацком исполнении Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio. > просто таблица "жива еще". Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.
-
> [7] ocean (29.12.09 12:47) > Но ведь каждый делает ЭТО.
Наверное я неправильный совсем. Ни разу не создавал таблицы из своих программ.
-
потому что нет такой команды как go :)
-
> Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. > Неверная stored-процедура, неверный синтаксис если после > if exists.
команда GO - суть разделитель транзакций в MSSQL.
-
> Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio. еще одна глубокая мысль...
try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.
-
> Наверное я неправильный совсем. Ни разу не создавал таблицы > из своих программ.
Ну пуркуа бы и не па? Просто аккуратно надо этим пользоваться, вот и всё.
-
> причем тут "срезанный" им эксепт 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 ... Результат не меняется. Ребята, вы очень глубокомысленны, но вопрос-то простой?
-
да ладно, на :) ADOQuery1.SQL.Text:='drop table table1' ADOQuery1.Connection.BeginTrans; ADOQuery1.ExecSQL; ADOQuery1.Connection.CommitTrans;
-
Вопрос по Дельфи есть?
-
> try не срезает "ексепт" во время design. кто такой design? когда его время?
> но вопрос-то простой? только исполнение дурное, а в чем не показано, т.е. исходные данные не все.
имхо, у компонента либо выставлен асинхронный режим, либо, что более вероятно не используется компонент коннекта.
-
Похоже, ты мастеришь таблицы в management > studio.
А чем это чревато?
-
Ну при чем тут try?
Убери и увидишь при чем.
-
Еще раз говорю, drop ошибок не выдает.
хочешь сказать что ты умнее скл сервера что ли?
кстати, если дроп ошибок не выдает, тем более убери try. может тогда дойдет.
-
> Только ради вас, я пишу: > 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
public
end;
var
Form2: TForm2;
implementation
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.
-
> Ega23 © (29.12.09 15:06) [25] > Для тех, кто в танке: Приведенный код, возможно, отработает, но к моему вопросу отношения не имеет. В моем случае таблица уже есть. > ADOQuery1.Connection.CommitTrans;> <Цитата> Не помогает. > имхо, у компонента либо выставлен асинхронный режим, либо, > что более вероятно не используется компонент коннекта. Не совсем понял. Но после замены AdoQuery на AdoConnection все заработало. Спасибо!
-
> Приведенный код, возможно, отработает
Приведённый код отработает, без всяких "возможно". Если бы не отработал, я бы сюда не запостил.
-
ocean (29.12.09 16:46) [26] Чего-то я непойму что тебе нужно чем не устраивает Alter table?
-
А я всё-таки посоветую нанять программиста. А то аФФтар тут давно мелькает, а толку ноль...
|