Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2012, 00:30   #1
rokotokobot
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 14
По умолчанию Insert SQL

Помоги пожалуйста решить клин, который никак не проходит.
Есть набор IBDatabase->IBTransaction->IBDataSet

Изначально из при помощи датасета выбираются данные из таблиц и вроде всё хорошо. Потом эти данные, но в ином порядк надо поместить в другую таблицу и тут начинается веселье:

1-ым способом всё вываливается в ошибку "dynamic SQL error sqlerror code=-204 table unknown". МНого чего перечитал в гугле, ничего не помогает, это и смена прав и прочее. Да из названия понятно, что не существует такой таблицы, но она существует. При чём сгенерированный запрос на INSERT выполняется в консоли и нет ни каких ошибок. Всё это действо происходит следующим образом:

Код:
IBDataSet1.SelectSQL.Text := query*;
IBDataSet1.Open;

while not IBDataSet1.EOF do
begin
... заполнение различных переменных
IBDataSet1.Next;
end;

IBDataSet1.InsertSQL.Text := InsertQuery*;
IBDataSet1.ExecSQL;
* - запросы к БД

2-ой способ это:

получение информации одинаково, а вот способ "засовывания" (извиняюсь за грубость) слегка иной, но тут выпадает другая ошибка 'Cannot modify a read-only dataset'

Код:
with IBDataSet1 do begin
Insert;
FieldByName('Field').AsString := 'Value';
... тут много полей всяких...
Post;
end;
Пожалуйста, подтолкните в нужную сторону, а то уж очень долго с этим сижу
rokotokobot вне форума Ответить с цитированием
Старый 19.11.2012, 12:22   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

а сам запрос показать не желаешь ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 19.11.2012, 22:15   #3
rokotokobot
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 14
По умолчанию

Yurk@, без проблем

Код:
query:= 'INSERT INTO "pair" (WORD_1, WORD_2, TEXT_ID_1, TEXT_ID_2, CHAPTER_ID_1, CHAPTER_ID_2, PARAGRAPH_ID_1, PARAGRAPH_ID_2, SENTENCE_ID_1, SENTENCE_ID_2, WORD_ID_1, WORD_ID_2) VALUES ('''+words_text[k]+''', '''+words_text[k+1]+''', '+IntToStr(Word_coord[1,k])+', '+IntToStr(Word_coord[1,k+1])+', '+IntToStr(Word_coord[2,k])+', '+IntToStr(Word_coord[2,k+1])+', '+IntToStr(Word_coord[3,k])+', '+IntToStr(Word_coord[3,k+1])+', '+IntToStr(Word_coord[4,k])+', '+IntToStr(Word_coord[4,k+1])+', '+IntToStr(Word_coord[5,k])+', '+IntToStr(Word_coord[5,k+1])+' )';
Не использовал параметры, т.к. решил чтоы ыло меньше ошибок делать по топорному, но ошибок от этого меньше не стало.

Суть в том, что если этот запрос выводить в какой-нибудь инпут и запускать в консоли, то он выполняется, как я выше и писал
rokotokobot вне форума Ответить с цитированием
Старый 19.11.2012, 22:33   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Имя таблицы "pair" с двойными кавычками и в базе? Регистр имени таблицы точно соответствует тому, что в базе?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.11.2012, 22:38   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

вот использовал бы параметры - было бы лучше:
Код:
query:= 'INSERT INTO pair (WORD_1, WORD_2, TEXT_ID_1, TEXT_ID_2, CHAPTER_ID_1, CHAPTER_ID_2, PARAGRAPH_ID_1, PARAGRAPH_ID_2, SENTENCE_ID_1, SENTENCE_ID_2, WORD_ID_1, WORD_ID_2) '+
'VALUES (:p_word1, :p_word2, :p_text1, :p_text2, :p_chpt1, :p_chpt2, :p_par1, :p_par2, :p_sen1, :p_sen2, :p_w1, :p_w2)';

IBDataSet1.ParamByName('p_word1').asString:=words_text[k];
IBDataSet1.ParamByName('p_word2').asString:=words_text[k+1];
IBDataSet1.ParamByName('p_text1').asInteger:=Word_coord[1,k];
IBDataSet1.ParamByName('p_text2').asInteger:=Word_coord[1,k+1];
IBDataSet1.ParamByName('p_'chpt1).asInteger:=Word_coord[2,k];
IBDataSet1.ParamByName('p_chpt2').asInteger:=Word_coord[2,k+1];
IBDataSet1.ParamByName('p_par1').asInteger:=Word_coord[3,k];
IBDataSet1.ParamByName('p_par2').asInteger:=Word_coord[3,k+1];
IBDataSet1.ParamByName('p_sen1').asInteger:=Word_coord[4,k];
IBDataSet1.ParamByName('p_sen2').asInteger:=Word_coord[4,k+1];
IBDataSet1.ParamByName('p_w1').asInteger:=Word_coord[5,k];
IBDataSet1.ParamByName('p_w2').asInteger:=Word_coord[5,k+1];
а вообще если он ругается на Table Unknown - проверь правильность имени таблицы в которую пишешь данные

^ Аватар, абсолютно верно заметил
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 19.11.2012 в 22:46.
Yurk@ вне форума Ответить с цитированием
Старый 19.11.2012, 23:17   #6
rokotokobot
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 14
По умолчанию

Yurk@, Аватар хм, таблица есть, её видно в консоли, в неё можно добавить опять же данные из консоли, да и создана она была в ней. Но вот привыполнении любого запроса, даже "SELECT" говорит что нет таблицы. Я чего-то не понимаю...


P.S. На досуге переделал через параметры, только толку, пока не работает
rokotokobot вне форума Ответить с цитированием
Старый 19.11.2012, 23:36   #7
rokotokobot
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 14
По умолчанию

Нашёл в чём проблема, проблема в том что подключался в исполняемом файле копия базы без этой таблицы :[ а в консоле нужная, отсюда вывод, не надо работать по ночам

Но встал другой вопрос...
Yurk@, когда переделал на параметры, стало на меня ругаться, что "Field p_word1 not found". ТОгда я попробвал топорный способ, а на нём ругается, что 'use Open for a Select Statment'.
Если делать IBDataSet.Open при заполненной InsertSQL, данные в базу не заносятся, даже если транзакцию коммит


Аватар, не поверите, если не использовать " ", тогда вываливается ошибка про неизвестную таблицу, а если использовать то всё хорошо

Последний раз редактировалось rokotokobot; 19.11.2012 в 23:44.
rokotokobot вне форума Ответить с цитированием
Старый 19.11.2012, 23:53   #8
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Сообщение от rokotokobot Посмотреть сообщение
когда переделал на параметры, стало на меня ругаться, что "Field p_word1 not found"
убери p_ в именах всех параметров. и запрос с INSERT, UPDATE, DELETE выполняется ч\з Execute.
компонент IBDataSet\FIBDataSet довольно хитрая штуковина.
запрос с параметрами оч даже отлично работает, только сначала нужно делать
Код:
DataSet.Insert; // для добавления новой записи
DataSet.Edit; // для редактирования (но в этом случае должен быть соотв UpdateSQL запрос)
// присваиваем параметрам какие-то значения
DataSet.Post; // в этом случае Execute не нужен
DataSet.Transaction.Commit;
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 20.11.2012, 00:15   #9
rokotokobot
Пользователь
 
Регистрация: 25.03.2011
Сообщений: 14
По умолчанию

Что-то всё равно не так, выложу весь код, может что-то упускаю важное

Код:
IBDataSet1.Database := IBDatabase1;
IBDataSet1.Transaction := IBTransaction1;

IBDataSet1.Active := FALSE;
IBDataSet1.SelectSQL.Text := 'SELECT * FROM "TEXT"';

IBDataSet1.Open;
i := 1;

while not IBDataSet1.EOF do
begin
word_coord[1,i] := StrToInt(IBDataSet1.FieldByName('TEXT_ID').Text);
word_coord[2,i] := StrToInt(IBDataSet1.FieldByName('CHAPTER_INDEX').Text);
word_coord[3,i] := StrToInt(IBDataSet1.FieldByName('PARAGRAPH_INDEX').Text);
word_coord[4,i] := StrToInt(IBDataSet1.FieldByName('SENTENCE_INDEX').Text);
word_coord[5,i] := StrToInt(IBDataSet1.FieldByName('WORD_INDEX').Text);
words_text[i] := IBDataSet1.FieldByName('WORD').Text;

inc(i);
IBDataSet1.Next;
end;

 for k := 1 to i-1 do
        begin
          IBDataSet1.Insert;
          IBDataSet1.InsertSQL.Text := 'INSERT INTO "pair" (WORD_1, WORD_2, TEXT_ID_1, TEXT_ID_2, CHAPTER_ID_1, CHAPTER_ID_2, PARAGRAPH_ID_1, PARAGRAPH_ID_2, SENTENCE_ID_1, SENTENCE_ID_2, WORD_ID_1, WORD_ID_2) '+
          'VALUES (:word1, :word2, :text1, :text2, :chpt1, :chpt2, :par1, :par2, :sen1, :sen2, :w1, :w2)';
          IBDataSet1.ParamByName('word1').asString:=words_text[k];
          IBDataSet1.ParamByName('word2').asString:=words_text[k+1];
          IBDataSet1.ParamByName('text1').asInteger:=Word_coord[1,k];
          IBDataSet1.ParamByName('text2').asInteger:=Word_coord[1,k+1];
          IBDataSet1.ParamByName('chpt1').asInteger:=Word_coord[2,k];
          IBDataSet1.ParamByName('chpt2').asInteger:=Word_coord[2,k+1];
          IBDataSet1.ParamByName('par1').asInteger:=Word_coord[3,k];
          IBDataSet1.ParamByName('par2').asInteger:=Word_coord[3,k+1];
          IBDataSet1.ParamByName('sen1').asInteger:=Word_coord[4,k];
          IBDataSet1.ParamByName('sen2').asInteger:=Word_coord[4,k+1];
          IBDataSet1.ParamByName('w1').asInteger:=Word_coord[5,k];
          IBDataSet1.ParamByName('w2').asInteger:=Word_coord[5,k+1];

          IBDataSet1.ExecSQL;
          IBDataSet1.Transaction.Commit;
end;
У объекта IBDataSet не нашёл метод Excute
rokotokobot вне форума Ответить с цитированием
Старый 20.11.2012, 00:45   #10
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

1. к чему такой костыль
Код:
word_coord[4,i] := StrToInt(IBDataSet1.FieldByName('SENTENCE_INDEX').Text);
ведь
Код:
word_coord[4,i] := IBDataSet1.FieldByName('SENTENCE_INDEX').AsInteger;
намного лучше

2. кто ж сначала открывает запрос на добавление, а потом пишет, собственно, сам запрос, ведь так же
Код:
 IBDataSet1.Close;
IBDataSet1.InsertSQL.Text := 'запрос'; 
IBDataSet1.Open;
for k := 1 to i-1 do
begin
IBDataSet1.Insert;
// дальше по тексту
IBDataSet1.Post;
end;

// и в самом конце уже одним Commit-ом сохранишь всё в базу 
IBDataSet1.Transaction.CommitRetaining;
P.S. да и с самим SelectSQL у тебя что-то нахимичено
вот кАк у тебя может быть в одном DataSet чтение из "TEXT" и в тут же запись в "PAIR" ... непорядок
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 20.11.2012 в 00:49.
Yurk@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Insert sql hunter03 Помощь студентам 0 15.12.2011 20:48
Sql "insert" проблема с экранированием bondik C# (си шарп) 3 09.06.2011 13:51
Синтаксис sql insert delphi detalik БД в Delphi 3 04.05.2011 19:27
sql server+delph,при попытке сохранить базу в дельфи выдает ошибку adotable dataset not in edit or insert betirsolt БД в Delphi 3 07.05.2010 21:44
SQL: Insert и Delete в чем ошибка? FReeMAN(Q) Помощь студентам 2 17.04.2009 18:09