Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1302679023
NailMan
2011-04-13 11:17
2011.07.31
Летающий трон


2-1303455661
vegarulez
2011-04-22 11:01
2011.07.31
Програмное нажатие кнопки.


15-1302772506
Дмитрий С
2011-04-14 13:15
2011.07.31
Какова вероятность, что два случайных числа равны.


11-1236071712
rvi
2009-03-03 12:15
2011.07.31
Запись в log


6-1240235052
kotyara
2009-04-20 17:44
2011.07.31
Скорость передачи строк через TTcpServer - TTcpClient





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский