Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос об определении последнего id / 25 сообщений из 29, страница 1 из 2
09.05.2001, 13:23
    #32005377
Yuriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
привет всем кто решил сюда заглянуть и заранее большое спасибо

проблема заключается в определении id послежней занесенной записи в таблицу

функция @@identity почему то возвращает NULL для реплицируемых таблиц
возможно еще так
DBCC CHECKIDENT
( 'table_name' [, { NORESEED | {RESEED [, new_reseed_value]} }]
)
это работает например из QueryAnalizer но если попробовать это вытащить из VisualBasic следующим образом то ничего не возвращается

dim cmd as new ADODB.Command
dim rs as new ADODB.Recordset

With cmd
.CommandType = adCmdStoredProc
.CommandText = "sp_def_identity" 'это хранимая процедура в которой "dbcc checkident"
Set .ActiveConnection = cn
Set rs = .Execute
End With

Может кто сталкивался с такой проблемой?
Может быть есть другой вариант?

С уважением Юрий.
...
Рейтинг: 0 / 0
10.05.2001, 12:49
    #32005414
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
А в реплицируемых таблицах вообще имеется поле с Idetity? Если нет, то понятно, почему NULL, правда тогда и DBCC CHECKIDENT должен ругаться. А если есть, тогда не понятно, почему не работает @@Identity...
По поводу DBCC - инофрмация возвращается аналогично оператору Print, а не в Recordset. Потому из VB ты его достать и не можешь.
...
Рейтинг: 0 / 0
10.05.2001, 18:52
    #32005435
Yuriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
ну конечно же поле identity там есть
и dbcc checkident его возвращает только вот проблема как эту информацию использовать можно если она в никуда возвращается
...
Рейтинг: 0 / 0
10.05.2001, 21:57
    #32005442
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Где-то (не помню где) я видел некое упоминание о том, что информацию, возвращаемую с помощью Print, все-таки как-то выцепить можно. Вроде бы она помещается в отдельный Recordset, который можно добыть с помощью метода ADOCommand.NextRecordset. Сам не пробовал, посему побожиться не могу.
...
Рейтинг: 0 / 0
11.05.2001, 09:33
    #32005451
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Насчет информации от принта.
Когда-то давно я что-то подобное пытался сделать, но из Delphi мне это сделать не получилось.

<%@SCRIPT LANGUAGE="VBSCRIPT"%>
<html><head><title> Err</title>

<%
Set con=Server.CreateObject("ADODB.Connection")
con.Open "DSN=SQL_Server_Name; UID=user_name; PWD=password"
set rs=con.Execute("print '33' print '44' ")
%>

<BODY>
ErrCount=<%=con.Errors.Count%> <br>
<h3> 1</h3>
Description= <%=con.Errors(0).Description %><br>
Number= <%=con.Errors(0).Number %><br>
Source= <%=con.Errors(0).Source %><br>
SQLState = <%=con.Errors(0).SQLState %><br>
NativeError= <%=con.Errors(0).NativeError %><br>

<h3> 2</h3>
Description= <%=con.Errors(1).Description %><br>
Number= <%=con.Errors(1).Number %><br>
Source= <%=con.Errors(1).Source %><br>
SQLState = <%=con.Errors(1).SQLState %><br>
NativeError= <%=con.Errors(1).NativeError %><br>
<%
For Each errLoop In con.Errors
%>
<br>
<%=errLoop.Description %>
<%
next
%>
</BODY></HTML>
...
Рейтинг: 0 / 0
11.05.2001, 09:35
    #32005452
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Все error/warnings/messages при работе с ADO помещаются в Connection->Errors. То, что выводится print, туда прекрасно попадает.
...
Рейтинг: 0 / 0
11.05.2001, 12:19
    #32005466
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Дополнение:
Сообщение от DBCC CHECKIDENT - Msg.No.7998 Severity - 0, равно, как и PRINT.
...
Рейтинг: 0 / 0
12.05.2001, 23:15
    #32005547
Yuriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
ну в connection.error точно ничего не возвращается
я проверил
...
Рейтинг: 0 / 0
12.05.2001, 23:52
    #32005548
Yuriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
и что бы это значило
Сообщение от DBCC CHECKIDENT - Msg.No.7998 Severity - 0, равно, как и PRINT.
как его конкретно вытащить в какую-либо переменную
...
Рейтинг: 0 / 0
13.05.2001, 11:23
    #32005549
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 Yuriy
Connection.Errors - это коллекция (или массив, кому как удобно понимать) объектов Error. Когда ты делал эксперимент, надо полагать, ты пробежался в цикле по этой коллекции (по числу элементов коллекции) и вывел код и описание КАЖДОЙ ошибки. По второму вопросу - информация берется из свойств ОДНОГО объекта коллекции Errors, а именно объекта Error. См. свойства Description, Number, SQLState, NativeError и др. (см хелп).
...
Рейтинг: 0 / 0
13.05.2001, 13:23
    #32005550
Yuriy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
ну вот текст процедуры которая все это делает

Private Sub Command1_Click()

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim i As Integer

cn.CursorLocation = adUseClient
If cn.State = adStateOpen Then cn.Close
cn.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sd;PWD=sd;Initial Catalog=CIS;Data Source=svecha"
cn.Open

With cmd
.CommandType = adCmdStoredProc
.CommandText = "sp_dbcc"
Set .ActiveConnection = cn
Set rs = .Execute
End With

For i = 1 To cn.Errors.Count
Debug.Print cn.Errors(i).Description
Debug.Print cn.Errors(i).Number
Debug.Print cn.Errors(i).SQLState
Debug.Print cn.Errors(i).NativeError
Next i

End Sub

так вот cn.Errors.Count=0 т.е. не возвращает никаких ошибок
можете сами проверить

а sp_dbcc это
CREATE PROCEDURE sp_dbcc
AS
dbcc checkident ('firms',noreseed)

ну не возвращаются никакие ошибки
может я еще чего-то не понимаю
...
Рейтинг: 0 / 0
13.05.2001, 18:55
    #32005554
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
В твоем скрипте есть пара странных мест:
1. Dim rs As New ADODB.Recordset - Тут New совершенно ни к чему. Метод Execute объекта Cmd сам создает новый рекордсет.
2. If cn.State = adStateOpen Then cn.Close - С какой стати cn вдруг окажется открытым, если ты его только что создал?

Но это так, к слову, и это не главное. А главное то, что я не поленился и провел эксперимент. Ни с помощью Errors, ни с помощью NextRecordset добраться до Print-сообщения не удалось. Все мозги сломал, вспоминая, где же я видел информацию на эту тему - никак вспомнить не могу.
Возможно, просто наложилось то, что на MAUG когда-то сам советовал. Если кроме набора записей из SP нужно вернуть некоторую информацию, ее можно вернуть с помощью второго набора записей (то есть, вместо одного SELECT поместить в хранимую процедуру два или более). Второй (и все последующие) наборы записей добываются таким способом set Rst2 = Rst1.NextRecordset
Насчет того, как добраться до информации, возвращаемой Print, ничего более сообщить не могу.
...
Рейтинг: 0 / 0
13.05.2001, 21:09
    #32005558
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Аналогично Garya провёл эксперименты. Через ADO инф-цию получить не удалось. Хотя cn.Errors.Count и равен 1, но до Item добраться не удалось.
Item. Через OLEDB сообщение получается, если независимо от рез-та выполнения запроса выполнить обработчик ошибок.
Проще всего эта информация получается через DBLIB. Обработчик сообщений msg_handler работает на пару с обработчиком ошибок и м.б. настроен на любой уровень.
Не уверен, как реализовано теперь, но в ODS 6.0 srv_sendmessage мог посылать сообщения 2-х типов: SRV_MSG_INFO or SRV_MSG_ERROR
независимо от severity и других параметров, т.о. они (сообщения) попадали к соответствующему обработчику.
...
Рейтинг: 0 / 0
14.05.2001, 16:49
    #32005614
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Чтобы через ADO нормально получать все, что сыпется (errors/warnings/messages), нужно сразу после открытия коннекта выполнить set nocount on. Уж не знаю, почему это влияет на получение всех данных в connection->errors, но это ВЛИЯЕТ. Попробуйте.
У меня были сходные проблемы - на insert повешено 2 триггера. Так вот, если 1-й выполняется нормально, а 2-й нет, то ошибка приходит в connection->errors, отлавливается try...catch. Если в 1-м произошла ошибка, то откат происходит МОЛЧА. На ADO'шном клиенте не вываливается exception, errors->count = 0 и все такое. Жуть просто! После выполнения set nocount on при открытии коннекта такая ситуация вылечилась - ошибка теперь приходит в любом случае, да еще и стали приходить все сообщения с низкой severity. В том числе и от print.
Кстати, если кто знает, каким образом set nocount on влияет на поведение ADO, напишите. Интересно все-таки.
...
Рейтинг: 0 / 0
14.05.2001, 18:11
    #32005633
Alexandr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Я, может, и не въехал в тему, но у меня тоже была проблема с определением identity, и никакими DBCC и @@identity она не решалась, а решалась опросом фунции Ident_Current - она для отдельной таблицы и возвращает текущий идентити
...
Рейтинг: 0 / 0
14.05.2001, 18:16
    #32005636
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 Alexandr: все бы замечательно, только функция Ident_Current в SQL2К появилась... А народ на предыдущих версиях писал и еще долго писать будет.
...
Рейтинг: 0 / 0
14.05.2001, 18:30
    #32005641
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 Fompro: через OLEDB вообще все рулит замечательно! Там и извращаться с set nocount не надо. Ну так что вы хотите - ADO это вообще довольно уродская надстройка над OLEDB. Для скриптописателей. А если нет необходимости ковыряться с вижуал басиком, то OLEDB - лучший выход. А DBLibrary MS постепенно вычеркивает из обращения. Во всяком случае, в MSDN написано, что DB-Library API не обновлялся со времен SQL 6.5 и все приложения, работающие через dblibrary могут работать только с уровнем совместимости 6.5. Не стоит для новых приложений закладываться на умирающую технологию.
...
Рейтинг: 0 / 0
14.05.2001, 21:10
    #32005650
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Точно - довольно уродская надстройка. Только вот угораздило меня 2.5 года назад строить проект над ADO (тоже пакость редкостная, но крупное предприятие обслуживает ). Так вот: из проекта A2K собираю пример чтобы ловить мессагу от print. Использую CurrentProject.Connection. Не работает (все в точности как у Fompro). Создаю новый коннект (cn.Open "Provider=sqloledb;Data Source=BillGates;Initial Catalog=Store;User Id=sa;Password=;") - текст print'а приходит без всякого No Count!!! Т.е. родной коннект-то изначально кривой! И что еще озадачило - а что за ублюдский 'родной' connectionstring: "Provider=MSDataShape.1;Persist Security Info=False;Data Source=BILLGATES;User ID=sa;Initial Catalog=Store;Data Provider=SQLOLEDB.1" ?
...
Рейтинг: 0 / 0
14.05.2001, 23:53
    #32005658
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Болтовня ...
2 GreenSunrise. Ну люблю я его ... В добавок PB7.0 умеет работать через OLEDB, но:
Уж больно г...ый интерфейс разработчика они в нём сотворили, и руки не поднимаются с ним работать.
Все возможности работы, к-ые присутствовали при работе через DBLIB не реализованы ...
...
Рейтинг: 0 / 0
15.05.2001, 02:00
    #32005659
Александр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
yuriy!
Посмотри в тригер Insert и убери оттуда все Insert для Всех таблиц (даже для тех у которых нет столбца Identity). Оббычно из-за последних и возникает NULL.
...
Рейтинг: 0 / 0
15.05.2001, 12:01
    #32005675
Vasya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Есть способ формировать id самому, для этого все лишь нужно знать последний существующий id.
Есть два способа:
1) делать это за 2 транзакции
Query1: select max(id) from table
C++ : idValue = id+1
Query2: insert into table (id,name) values (idValue,nameValue)
Т.е. ты уже заранее знаешь id последней вставленной записи
Надо убрать Identity с поля id таблицы table

2) делать за одну транзакцию и возвращать каким-нибудь образом id
этот вариант обсуждался выше
...
Рейтинг: 0 / 0
15.05.2001, 12:17
    #32005676
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 Vasya
И Вы рискнули бы использовать первый вариант??

select max(id) from table - это shared lock, а теперь предположите, что одновременно такой селект выполняет несколько юзеров, как думаете, какие айдишки они получат?

А вобще у меня была как то задача получения своего ID, решение правда придумал не я, точнее сказать, что когда возникла необходимость решение уже было

Если кому интересно могу показать.
...
Рейтинг: 0 / 0
15.05.2001, 12:20
    #32005677
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
Забыл добавить:
Vasya, как вы думаете если в таблице ну хотя бы 100000 записей - select max(id) from table сколько будет выполняться?
...
Рейтинг: 0 / 0
15.05.2001, 14:21
    #32005681
GreenSunrise
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 Павел: а в чем проявляется "ублюдочность" родного connection string'а ? Ну разбей его по свойствам - provider, userid, password и т.д., если не нравится подход "все в одном" ?

2 Fompro: подход "люблю - не люблю" - это, конечно, очень профессионально
Насчет интерфейса можно было бы поспорить... Вот только неохота целую дискуссию затевать - все равно пустой треп получится, как это обычно бывает в подобных случаях. Ну да, прикрыли они кое-что из dblib, не без того. Но, по-моему, отказ MS от его дальнейшей поддержки - это весомый аргумент в пользу того, чтобы не начинать писать на нем новые приложения.
...
Рейтинг: 0 / 0
15.05.2001, 15:29
    #32005686
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос об определении последнего id
2 GreenSunrise: Дело в том, что Currentproject.Connection строит сам А2K, и исзменить ее невозможно. Можно в коде использовать собственные коннекты, но это только в коде. Источники данных форм(таблицы, зпросы, представления, процедуры) используют CurrentProject.Connection. Хотя все вполне решаемо, если в качестве источника записей использовать классы. Вот только во многих случаях при работе с классами коннект, который нормально ловит print, глючит, а 'родной' - нет.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос об определении последнего id / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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