Форум: "Базы";
Текущий архив: 2011.07.31;
Скачать: [xml.tar.bz2];
ВнизКак правильно создавать таблицу? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.003 c