powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / запроcом ADO добавить строку и вернуть номер этой строки
8 сообщений из 8, страница 1 из 1
запроcом ADO добавить строку и вернуть номер этой строки
    #37331261
Фотография mccc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
Create table myTable (ID int identity( 1 , 1 ), S varchar( 100 ))

-- одним единственным запросом
	insert myTable ( S ) values ('0123456789')
	select @@IDENTITY [ID]
-- можно получить значение ID вставленной строки

а вот на ASP-странице c VBScript, чтобы получить этот ID
приходится выполнить дополнительный select max(ID) ID from myTable запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<%@ Language=VBScript %>
<%
...
Dim strSQL, sConn, oSQL, rSQL, ID

sConn = "Provider=SQLOLEDB;" & _
	"Data Source=myBase;" & _
        "Initial Catalog=myCatalog;" & _
        "Timeout=0;" & _
        "Integrated Security=SSPI;"

Set oSQL = CreateObject("ADODB.Connection")
oSQL.CommandTimeout =  0 
oSQL.ConnectionTimeout =  0 

oSQL.Open sConn


strSQL = "insert myTable ( S ) values ('0123456789') " & _
	  "select @@IDENTITY [ID]"

Set rSQL = oSQL.Execute(strSQL)
ID = rSQL("ID")		' выдает ошибку
' ADODB.Recordset: Item cannot be found in the collection
'    corresponding to the requested name or ordinal
' и oSQL.Errors.count  = 0 
' и rSQL.Fiellds.Count = 0


' следующий дополнительный запрос 
	rSQL = oSQL.Execute("select @@IDENTITY [ID]")
	ID = rSQL("ID")
' возвращает NULL		' 
' и oSQL.Errors.count  = 0 
' и rSQL.Fiellds.Count = 1	'!!!


' следующий дополнительный запрос 
	rSQL = oSQL.Execute("select max(ID) ID from myTable")
	ID = rSQL("ID")
' возвращает значение ID	'!
' и oSQL.Errors.count  = 0 
' и rSQL.Fiellds.Count = 1	'!!!

oSQL.Close
...
%>
так, как же одним запроcом посредстом ADO произвести
и вставку строки и вернуть(получить) ID этой строки?
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37331269
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mccc,

сервер БД какой? MSSQL 2005 и выше:

Код: plaintext
insert into ... output inserted.id, inserted.s ...
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37331272
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcccприходится выполнить дополнительный select max(ID) ID from myTable запрос

никогда так не делай, если добавлять данные в таблицу могут несколько пользователей одновременно
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37331397
Фотография mccc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верблюдmccc,

сервер БД какой? MSSQL 2005 и выше:

Код: plaintext
insert into ... output inserted.id, inserted.s ...

MSSQL 2000

Верблюдникогда так не делай, если добавлять данные в таблицу могут несколько пользователей одновременно
хэ, оттуда и растут проблемы, (чужой код),
-первым запросом выявлет текущий ид, и с +1 отображается пользователю, тот "вводит"...
-вторым запросом инсерт (причем, ид не был identity)
вот и придумал, то что описал

сообственно, меня интересует, это реализуемо?

из спортивного интереса, тыкался... возможно, получить "за раз", лежит в свойствах CreateObject("ADODB.Connection").
после oSQL.Open sConn у oSQL проявляютя 93 свойства, попытки подсунуть эти свойства в sConn в виде
"свойство=предполагаемоеЗначени;" в большинстве случаев проходят, но результат тот же
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37331491
няка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mccc,

первый запрос вставка, второй выборка @@IDENTITY
все должно работать, в старом проекте на VB6 и ADO так и работает, проблем нет
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37331904
Фотография mccc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
някаmccc,

первый запрос вставка, второй выборка @@IDENTITY
все должно работать, в старом проекте на VB6 и ADO так и работает, проблем нет
а исходник не покажете? Спасибо
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37332149
няка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mccc,

как то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Dim cnn As ADODB.Connection
    ...
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cnn
    cmd.CommandText = "INSERT INTO ..."
    cmd.CommandType = adCmdText
    cmd.Execute

    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    rst.Open "SELECT @@IDENTITY AS KeyFieldValue", cnn, adOpenForwardOnly, , adCmdText
    NewKeyFieldValue = rst.Fields("KeyFieldValue").value
    ...
...
Рейтинг: 0 / 0
запроcом ADO добавить строку и вернуть номер этой строки
    #37333135
Фотография mccc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
няка,
Спасибо, но почему то мне кажется, этот вариант не отвечает на "одним запроcом"
и спасибо за "ADODB.Command".

как-то обругать хочется разработчиков Helpов,
----- столько воды-95%,(хоть и в инете, от знатоков). а для того чтоб добратся до сути, надо быть исследователем
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / запроcом ADO добавить строку и вернуть номер этой строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]