27.06.2011, 12:18 | #1 |
Участник
|
Добавление записей в таблицу БД через CCADOCommand
Само добавление вопросов не вызывает.
А вот как бы получить хоть какие-нибудь сведения о добавленной записи? Или необходимо самому заполнять необходимы идентификатор и по нему потом выискивать? |
|
28.06.2011, 14:34 | #2 |
Участник
|
А что получить-то надо?
|
|
28.06.2011, 17:58 | #3 |
MCT
|
Единственное, что можно получить - это возможные ошибки выполнения, если опять же правильно написана хранимая процедура и в ней присутствет
X++: raiserror
__________________
Axapta book for developer |
|
29.06.2011, 10:22 | #4 |
Участник
|
Есть прога, использующая SQL базу, необходимо в аксапте сформировать документ и поместить его в одну из таблиц базы, используемой данной прогой.
Документ состоит из заголовка и строк, хранящихся в разных таблицах. Соответственно нужно при добавлении заголовка получить обратно какой-нибудь идентификатор (к слову сам идентификатор генерится в той базе автоматически), для правильного добавления строк. |
|
29.06.2011, 10:33 | #5 |
Участник
|
Может стоит подумать о реализации немножко другого способа:
- Перед созданием записи вызвать из этой базы процедуру которая даст вам нужный идентификатор. - И уже с нужным идентификатором вы спокойно создаете строки.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
29.06.2011, 10:40 | #6 |
Участник
|
Цитата:
Логичнее было бы иметь хотя бы recid после добавления строки... AlGol, но все равно, можно поподробнее о Вашем способе? P.S. - есть еще ограничение на возможность внесения изменений логики работы второй системы (как в самой проге, так и в базе). |
|
29.06.2011, 10:50 | #7 |
Участник
|
Цитата:
Сообщение от uchenik
Есть прога, использующая SQL базу, необходимо в аксапте сформировать документ и поместить его в одну из таблиц базы, используемой данной прогой.
Документ состоит из заголовка и строк, хранящихся в разных таблицах. Соответственно нужно при добавлении заголовка получить обратно какой-нибудь идентификатор (к слову сам идентификатор генерится в той базе автоматически), для правильного добавления строк. Вставка записи - это команда INSERT. И вот что может вернуть подобная команда как результат своей работы? Ну, максимум, количество вставленных записей. Идентификатор записи - не есть некая структурная характеристика базы данных. Т.е. что именно является идентификатором - это, скорее, логическая характеристика. Нет каких-либо однозначных критериев, по которым можно было бы сказать, что вот это есть идентификатор. Ну, предположим, что идентификатор - это то, по чему построен Primary Index. Однако, как минимум, это может быть несколько полей! И какое из них предлагаете возвращать? Так что, Ваше предположение о поиске записи после ее вставки по значению альтернативных ключей, в общем случае, единственно верное. Нет, конечно, есть еще варианты, если ключевое поле - это поле со свойством Identity. Но это уже частный случай. |
|
29.06.2011, 12:10 | #8 |
MCITP
|
Цитата:
А как же PHP код:
__________________
Zhirenkov Vitaly |
|
29.06.2011, 12:49 | #9 |
Участник
|
Так это же только для Oracle возможно
http://ru.wikipedia.org/wiki/Insert_(SQL)/Получение ключа Последний раз редактировалось S.Kuskov; 29.06.2011 в 12:51. |
|
29.06.2011, 13:34 | #10 |
Участник
|
Для автоинкрементных полей в MS SQL можно воспользоваться вызовом
X++: select @@identity Если для ADO, то это будет выглядеть примерно так X++: CCADOConnection con = new CCADOConnection(); CCADORecordSet rec; ; con.open('настройка для подключения'); rec = new CCADORecordset(); rec.open("set nocount on\n insert into tablex (name) values ('Name3')\n select @@identity as ident", con); if (rec.fields().count() > 0) { print rec.fields().itemIdx(0).value(); rec.close(); } con.close(); pause;
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: uchenik (1). |
29.06.2011, 14:07 | #11 |
Участник
|
Если у Вас MS SQL Server, то вот пример:
1) Создайте на MS SQL таблицу, в которой одно поле текстовое, второе поле со свойством identity. 2) Создайте на MS SQL хранимую процедуру с названием "spTestReturnRecordset", в теле которой напишите что-то наподобие X++: INSERT INTO MyTable (MyFieldName) Values ('Дядя Петя') SELECT @@identity В результате работы этого джоба в инфологе Аксапты будет отображен идентификатор добавленой записи. X++: static void DD_StoredProcReturnRecordsetTest(Args _args) { str serverName = "Server"; str baseName = "Database"; str userId = "UserId"; str userPassword = "Password"; CCADOConnection cn; COM comCN; COM cmd; CCADORecordset rs; int i; ; cn = new CCADOConnection(); cn.open( "Provider=SQLOLEDB;"+ "Data Source=" + serverName + ";" + "Initial Catalog=" + baseName + ";" + "uid=" + userId + ";" + "pwd=" + userPassword); comCN = cn.connection(); cmd = new COM("ADODB.Command"); cmd.activeConnection(comCN); cmd.commandType(4); //adCmdStoredProc, see ObjectBrowser in VBA cmd.CommandText("spTestReturnRecordset"); rs = new CCADORecordset(cmd.Execute()); while (!rs.eof()) { info(strfmt("%1", rs.fields().itemIdx(0).value())); rs.movenext(); } cn.close(); } Последний раз редактировалось Ace of Database; 29.06.2011 в 14:09. |
|
29.06.2011, 14:44 | #12 |
Участник
|
Цитата:
В данном случае, например, если таблица tablex имеет триггер на вставку в котором происходит вставка в связанную таблицу, которая тоже имеет поле со свойством Identity, то в результате @@identity вернет не код записи таблицы tablex, а код записи подчиненной таблицы. Поэтому в данном конкретном случае лучше использовать функцию SCOPE_IDENTITY(). Примерно так X++: stringSQL = " set nocount on;" + "\n" + " insert into tablex (name) values ('Name3');" + "\n" + " SELECT NewIdent=SCOPE_IDENTITY()" + ""; rec.open(stringSQL); X++: stringSQL = " set nocount on;" + "\n" + " declare @retVal table(f1 integer)" " insert into tablex (name) output inserted.f1 into @retVal values ('Name3');" + "\n" + " SELECT f1 from @retVal" + ""; rec.open(stringSQL); Другими словами, одной команды INSERT явно не достаточно. Нужно либо писать процедуру, либо посылать повторный запрос для поиска только что вставленной записи. Что для Вас проще и привычнее, то и делайте. |
|
29.06.2011, 15:25 | #13 |
Участник
|
Цитата:
Сообщение от uchenik
Т.е. процедура создаст в базе нужную мне строку, вернет идентификатор, а я потом строку обновлю? И так для всех строк? Громоздко и медленнее похоже в разы будет.
Логичнее было бы иметь хотя бы recid после добавления строки... AlGol, но все равно, можно поподробнее о Вашем способе? P.S. - есть еще ограничение на возможность внесения изменений логики работы второй системы (как в самой проге, так и в базе). - сначала выделяется индентификатор, сохраняется до следующего раза, и возвращается вам в Аксапту. - затем в другом запросе вставляется запись с этим идентификатором. При этом, скорее всего, придется переделывать систему с которой вы стыкуетесь. Если у вас идентификатор - это автоинкрементое поле - наверняка проще сделать так, как вам советуют выше, с помощью получения @@Identity из запроса или процедуры вставки записей.
__________________
Ален ноби, ностра алис. Что означает - если один человек построил, другой завсегда разобрать может. |
|
Теги |
ado, insert, odbc, ключ |
|
|