![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно создавать таблицу? [D7, MSSQL]
ocean © (2009-12-29 12:15:00)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-30 14:55:00) [1]А я всё-таки посоветую нанять программиста.
А то аФФтар тут давно мелькает, а толку ноль...
stas (2009-12-29 17:15:00) [2]ocean (29.12.09 16:46) [26]
Чего-то я непойму что тебе нужно чем не устраивает Alter table?
Ega23 (2009-12-29 16:50:00) [3]
> Приведенный код, возможно, отработает
Приведённый код отработает, без всяких "возможно".
Если бы не отработал, я бы сюда не запостил.
ocean (2009-12-29 16:46:00) [4]> Ega23 © (29.12.09 15:06) [25]
> Для тех, кто в танке:
Приведенный код, возможно, отработает, но к моему вопросу отношения не имеет. В моем случае таблица уже есть.
> ADOQuery1.Connection.CommitTrans;> <Цитата>
Не помогает.
> имхо, у компонента либо выставлен асинхронный режим, либо,
> что более вероятно не используется компонент коннекта.
Не совсем понял. Но после замены AdoQuery на AdoConnection все заработало. Спасибо!
Ega23 (2009-12-29 15:06:00) [5]
> Только ради вас, я пишу:
> 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.
Медвежонок Пятачок (2009-12-29 14:45:00) [6]Еще раз говорю, drop ошибок не выдает.
хочешь сказать что ты умнее скл сервера что ли?
кстати, если дроп ошибок не выдает, тем более убери try.
может тогда дойдет.
Медвежонок Пятачок (2009-12-29 14:35:00) [7]Ну при чем тут try?
Убери и увидишь при чем.
Anatoly Podgoretsky (2009-12-29 14:17:00) [8]
Похоже, ты мастеришь таблицы в management
> studio.
А чем это чревато?
sniknik (2009-12-29 14:15:00) [9]> try не срезает "ексепт" во время design.
кто такой design? когда его время?
> но вопрос-то простой?
только исполнение дурное, а в чем не показано, т.е. исходные данные не все.
имхо, у компонента либо выставлен асинхронный режим, либо, что более вероятно не используется компонент коннекта.
Anatoly Podgoretsky (2009-12-29 14:15:00) [10]Вопрос по Дельфи есть?
12 (2009-12-29 13:51:00) [11]да ладно, на :)
ADOQuery1.SQL.Text:='drop table table1'
ADOQuery1.Connection.BeginTrans;
ADOQuery1.ExecSQL;
ADOQuery1.Connection.CommitTrans;
ocean (2009-12-29 13:50:00) [12]> причем тут "срезанный" им эксепт
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 ...
Результат не меняется. Ребята, вы очень глубокомысленны, но вопрос-то простой?
Ega23 (2009-12-29 13:33:00) [13]
> Наверное я неправильный совсем. Ни разу не создавал таблицы
> из своих программ.
Ну пуркуа бы и не па?
Просто аккуратно надо этим пользоваться, вот и всё.
sniknik (2009-12-29 13:28:00) [14]> Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
еще одна глубокая мысль...
try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.
Ega23 (2009-12-29 13:24:00) [15]
> Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде.
> Неверная stored-процедура, неверный синтаксис если после
> if exists.
команда GO - суть разделитель транзакций в MSSQL.
12 (2009-12-29 13:17:00) [16]потому что нет такой команды как go :)
Sergey13 (2009-12-29 13:16:00) [17]> [7] ocean (29.12.09 12:47)
> Но ведь каждый делает ЭТО.
Наверное я неправильный совсем. Ни разу не создавал таблицы из своих программ.
ocean (2009-12-29 13:16:00) [18]> убрать обработку трай/эксепт в таком дурацком исполнении
Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
> просто таблица "жива еще".
Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.
Медвежонок Пятачок (2009-12-29 13:03:00) [19]для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.
12 (2009-12-29 12:58:00) [20]просто таблица "жива еще". Надо как-то подтвердить 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
следующие команды будут в другом пакете, и для них таблицы уже не будет