Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / запроcом ADO добавить строку и вернуть номер этой строки / 8 сообщений из 8, страница 1 из 1
30.06.2011, 18:23
    #37331261
mccc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
Код: 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
30.06.2011, 18:31
    #37331269
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
mccc,

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

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

никогда так не делай, если добавлять данные в таблицу могут несколько пользователей одновременно
...
Рейтинг: 0 / 0
30.06.2011, 20:47
    #37331397
mccc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
Верблюд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
30.06.2011, 22:24
    #37331491
няка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
mccc,

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

первый запрос вставка, второй выборка @@IDENTITY
все должно работать, в старом проекте на VB6 и ADO так и работает, проблем нет
а исходник не покажете? Спасибо
...
Рейтинг: 0 / 0
01.07.2011, 12:13
    #37332149
няка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
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
01.07.2011, 21:07
    #37333135
mccc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запроcом ADO добавить строку и вернуть номер этой строки
няка,
Спасибо, но почему то мне кажется, этот вариант не отвечает на "одним запроcом"
и спасибо за "ADODB.Command".

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


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