Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.11.05;
Скачать: [xml.tar.bz2];

Вниз

Как через sql запрос создать связанные таблицы с автонумерацией   Найти похожие ветки 

 
Gedevan   (2015-12-05 05:39) [0]

с автонумерацией строк.

В общем ситуация в программе есть параллельные потоки. Нужно чтобы эти потоки записывали некую отладочную информацию в базу данных. Есть 2 типа объектов и т.е. в базе должно быть 2 таблицы. Эти таблицы должны быть связанны по полю которое есть в обоих таблицах, но в первой таблице значение этого поля уникально во всей таблице, тогда как во второй нет. Поэтому для второй таблицы я хочу сделать поле в котором будет индекс (номер строки) уникальный.

Вот какой код я написал для создания второй таблицы:

if TableExists(AConnection, scrTabName) then
   if not TableExists(AConnection, TabName) then
     AConnection.Execute("CREATE TABLE " + TabName +
       " (_Index numeric(19,0) PRIMARY KEY," +
       " ShotNumber numeric(19,0)," +
       "Name char(100)" +
       ",ItemName char(100)," +
       "NumberOfSearch  numeric(3,0)," +
       "tempfound bit NULL DEFAULT 0," +
       "x1 numeric(10,0)," +
       "x2 numeric(10,0)," +
       "y1 numeric(10,0)," +
       "y2 numeric(10,0)," +
       "size numeric(10,0)," +
       "Xsize numeric(10,0)," +
       "ksov numeric(1,8)," +
       "searchtime numeric(10,0)," +
       "itIsTemplate bit NULL DEFAULT 0," +
       "anotherTime bit NULL DEFAULT 0," +
       "SearchFixed bit NULL DEFAULT 0," +
       "FOREIGN KEY ShotNumber TAG ShotNumber REFERENCE " + scrTabName + ");");


scrTabName  - имя первой таблицы.

1) Т.е. хочу чтобы связывание шло по полю ShotNumber, а поле _Index   хочу чтобы было автонумерующимся полем обозначающем номер строки. Вот только как это сделать через sql запрос я не понимаю(чтобы он сам нумеровался).

2) Если файла базы на момент начала работы нет, то она создается, а потом каждый поток создает в файле себе таблицу в каком порядке они зайдут в базу мне неизвестно. Но мне известно, что чтобы добавить таблицу нужно иметь монопольный доступ к базе - вопрос как этого достичь? Т.е. например первый поток создал таблицу scrTabName  и пошел ее заполнять. И тут второй поток решил создать таблицу TabName, как ему отжать базу на это время? А второй поток бы в это время поставить на паузу (т.е. чтобы его обращение к базе ждало пока второй поток не закончит начатое)

3) Еще у меня есть сомнения в оптимальности выбранного подхода. Т.к. мне нужно чтобы запись в лог не тормозила основной процесс. Скажем у меня есть 5-10 потоков, каждый из которых пытаются добавить в одну из 2х таблиц (на первую таблицу 1 поток, на вторую все остальные) свою запись (в будущем в записи будут присутствовать массивы как минимум на сотни килобайт) с частотой 1-2 раза в секунду справится ли аксессовая база с таким потоком без тормозов? Или лучше на каждый поток создать отдельную базу с таблицей, а потом после завершения записи перенести их в одну базу и связать таблицы? Сейчас у меня реализован второй вариант но с помощью ClientDataSet с записью на диск. Так вот если поток нагенерил около 10к записей, то процесс слияния длится ооооочень долго, не хотелось бы достичь такого результата снова. Кроме того при большом количестве записей ClientDataSet начинает жутко тормозить при добавлении, надеюсь в аксессе такого не будет?


 
gedevan   (2015-12-05 18:04) [1]


AConnection.Execute("CREATE TABLE Templates " +
       " (_Index int IDENTITY(1,1)PRIMARY KEY," +
       " ShotNumber numeric(19,0)," +
       "Name char(100)" +
       ",ItemName char(100)," +
       "NumberOfSearch  numeric(3,0)," +
       "tempfound bit NULL DEFAULT 0," +
       "x1 numeric(10,0)," +
       "x2 numeric(10,0)," +
       "y1 numeric(10,0)," +
       "y2 numeric(10,0)," +
       "size numeric(10,0)," +
       "Xsize numeric(10,0)," +
       "ksov numeric(1,8)," +
       "searchtime numeric(10,0)," +
       "itIsTemplate bit NULL DEFAULT 0," +
       "anotherTime bit NULL DEFAULT 0," +
       "SearchFixed bit NULL DEFAULT 0," +
       "FOREIGN KEY ShotNumber TAG ShotNumber REFERENCE ScreenShots);");


при запуске говорит - ошибка синтаксиса при определении поля.....а где ошибка и какого поля не говорит ( как ее найти?


 
gedevan   (2015-12-05 18:30) [2]

методом научного перебора понял где ошибка, но теперь ошибка о том, что неправильный CONSTRAINT, хотя его у меня его нет в этой таблице но есть в той к которой он должен привязаться:


Procedure CreateScreenShotTable(AConnection: TADOConnection);
begin
 if not TableExists(AConnection, "ScreenShots") then
   AConnection.Execute
     ("CREATE TABLE ScreenShots(ShotNumber numeric(19,0),jpgSize numeric(19,0),jpgPosition numeric(19,0),CONSTRAINT ScreenShotsConstraint UNIQUE (ShotNumber));");

end;


что не так? как сделать связь 1 ко многим?


 
gedevan   (2015-12-06 10:03) [3]

1) Еще вопрос, если во время отправки запроса, как в предыдущем посте, вдруг выскакивает блокировка как ее культурно обработать? (щас просто заключил в трай ексепт). Хотя по идее записи только добавляются и не редактируются, откуда вообще блокировка взялась.

2) Если программа завершилась по ошибке или как то нехорошо(закрыли процесс), то при следующем запуске выдается ошибка (при попытке отправить запрос через  AConnection) что не запущена процедура CoInizialization или что то в этом роде. А потом если перезапустить программу снова, то ошибки уже нет, как сделать чтобы она не появлялась?

3) Ну и так и не удалось мне сделать поле с автоинкрементом и связывание таблиц.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.11.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.001 c
15-1466112601
Юрий
2016-06-17 00:30
2017.11.05
С днем рождения ! 17 июня 2016 пятница


15-1466371801
Юрий
2016-06-20 00:30
2017.11.05
С днем рождения ! 20 июня 2016 понедельник


2-1449283188
Gedevan
2015-12-05 05:39
2017.11.05
Как через sql запрос создать связанные таблицы с автонумерацией


15-1466717401
Юрий
2016-06-24 00:30
2017.11.05
С днем рождения ! 24 июня 2016 пятница





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский