Як правильно створювати таблицю
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 "в базі вже є об'єкт з таким ім'ям. Як це робити правильно?"
сказано, що є вже такий об'єкт
Як це робити правильно?
Правильно – це не писати таких конструкцій
if not exists (select 1 from sysobjects where ) begin create table Table1 ( id int NOT NULL identity(1,1), . constraint PK_Table1 primary key (id) ); end;
Отже, реалізація SQL у Delphi7 м'яко кажучи неповна?
реалізація SQL у Delphi7 м'яко кажучи неповна?
Але кожен робить ЦЕ.
Це ще не означає, що реалізація мови SQL знаходиться у делфі.
На другий execsql видає general exception "в базі вже є об'єкт з таким ім'ям". Як це робити правильно?
не викликати create table якщо створювана таблиця вже є у базі даних.
просто таблиця "жива ще". Потрібно якось підтвердити drop
if exists (select * from dbo.sysobjects where ) = 1) drop table [dbo].[Contract] GO так робить isqlw.exe останнє go розділяє пакет для mssql наступні команди будуть в іншому пакеті, і для них таблиці вже не буде
Для початку корисно буде просто прибрати обробку трай/ексепт у такому безглуздому виконанні.
> прибрати обробку трай/ексепт у такому безглуздому виконанніНу до чого тут try? Схоже, ти робиш таблиці в management studio.> просто таблиця "жива ще".Ось це правильно! Але "Go" ExecSQL не бере в жодному вигляді. Невірна stored-процедура, невірнийсинтаксис якщо після exists.
> [7] ocean (29.12.09 12:47) & gt; Але ж кожен робить це.
Напевно я неправильний зовсім. Жодного разу не створював таблиці зі своїх програм.
тому що немає такої команди як go:)
> Ось це правильно! Але "Go" ExecSQL не бере в жодному вигляді. > Неправильна stored-процедура, неправильний синтаксис якщо після > if exists.
команда GO - суть роздільника транзакцій у MSSQL.
> Ну до чого тут try? Схоже, ти робиш таблиці в management studio. Ще одна глибока думка.
try тут ні до чого, причому тут "зрізаний" їм ексепт який міг би тобі пояснити чому команда на видалення не спрацювала.
> Напевно я неправильний зовсім. Жодного разу не створював таблиці > зі своїх програм.
Ну пуркуа б і не па? Просто акуратно треба цим користуватися, от і все.
> причому тут "зрізаний" їм ексепт не зрізає "ексепт" під час design. Ще раз говорю, drop помилок не видає. Ось ця думка розумна,> if not exists (select 1 from sysobjects where )Тільки заради вас, я пишу: 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 table1 table1"; > AdoQuery1.ExecSQL; > AdoQuery1.SQL.Text := "create table . > Результат не змінюється. Хлопці, ви дуже глибокодумні, >
Для тих, хто у танку:
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;
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 notexists (select 1 from sysobjects where + "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;
> Наведений код, можливо, відпрацює
Наведений кодвідпрацює, без будь-яких "можливо". Якби не відпрацював, я б сюди не запостив.
ocean (29.12.09 16:46) [26] Чогось я не зрозумію, що тобі потрібно чим не влаштовує Alter table?
А я все-таки пораджу найняти програміста. А то аФФтар тут давно миготить, а користь нуль.