powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вопрос об определении последнего id
25 сообщений из 29, страница 1 из 2
вопрос об определении последнего id
    #32005377
Yuriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
привет всем кто решил сюда заглянуть и заранее большое спасибо

проблема заключается в определении 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
вопрос об определении последнего id
    #32005414
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в реплицируемых таблицах вообще имеется поле с Idetity? Если нет, то понятно, почему NULL, правда тогда и DBCC CHECKIDENT должен ругаться. А если есть, тогда не понятно, почему не работает @@Identity...
По поводу DBCC - инофрмация возвращается аналогично оператору Print, а не в Recordset. Потому из VB ты его достать и не можешь.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005435
Yuriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну конечно же поле identity там есть
и dbcc checkident его возвращает только вот проблема как эту информацию использовать можно если она в никуда возвращается
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005442
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то (не помню где) я видел некое упоминание о том, что информацию, возвращаемую с помощью Print, все-таки как-то выцепить можно. Вроде бы она помещается в отдельный Recordset, который можно добыть с помощью метода ADOCommand.NextRecordset. Сам не пробовал, посему побожиться не могу.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005451
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет информации от принта.
Когда-то давно я что-то подобное пытался сделать, но из 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
вопрос об определении последнего id
    #32005452
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все error/warnings/messages при работе с ADO помещаются в Connection->Errors. То, что выводится print, туда прекрасно попадает.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005466
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение:
Сообщение от DBCC CHECKIDENT - Msg.No.7998 Severity - 0, равно, как и PRINT.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005547
Yuriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну в connection.error точно ничего не возвращается
я проверил
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005548
Yuriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что бы это значило
Сообщение от DBCC CHECKIDENT - Msg.No.7998 Severity - 0, равно, как и PRINT.
как его конкретно вытащить в какую-либо переменную
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005549
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Yuriy
Connection.Errors - это коллекция (или массив, кому как удобно понимать) объектов Error. Когда ты делал эксперимент, надо полагать, ты пробежался в цикле по этой коллекции (по числу элементов коллекции) и вывел код и описание КАЖДОЙ ошибки. По второму вопросу - информация берется из свойств ОДНОГО объекта коллекции Errors, а именно объекта Error. См. свойства Description, Number, SQLState, NativeError и др. (см хелп).
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005550
Yuriy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот текст процедуры которая все это делает

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
вопрос об определении последнего id
    #32005554
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В твоем скрипте есть пара странных мест:
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
вопрос об определении последнего id
    #32005558
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аналогично 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
вопрос об определении последнего id
    #32005614
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы через 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
вопрос об определении последнего id
    #32005633
Alexandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, может, и не въехал в тему, но у меня тоже была проблема с определением identity, и никакими DBCC и @@identity она не решалась, а решалась опросом фунции Ident_Current - она для отдельной таблицы и возвращает текущий идентити
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005636
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexandr: все бы замечательно, только функция Ident_Current в SQL2К появилась... А народ на предыдущих версиях писал и еще долго писать будет.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005641
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Fompro: через OLEDB вообще все рулит замечательно! Там и извращаться с set nocount не надо. Ну так что вы хотите - ADO это вообще довольно уродская надстройка над OLEDB. Для скриптописателей. А если нет необходимости ковыряться с вижуал басиком, то OLEDB - лучший выход. А DBLibrary MS постепенно вычеркивает из обращения. Во всяком случае, в MSDN написано, что DB-Library API не обновлялся со времен SQL 6.5 и все приложения, работающие через dblibrary могут работать только с уровнем совместимости 6.5. Не стоит для новых приложений закладываться на умирающую технологию.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005650
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно - довольно уродская надстройка. Только вот угораздило меня 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
вопрос об определении последнего id
    #32005658
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Болтовня ...
2 GreenSunrise. Ну люблю я его ... В добавок PB7.0 умеет работать через OLEDB, но:
Уж больно г...ый интерфейс разработчика они в нём сотворили, и руки не поднимаются с ним работать.
Все возможности работы, к-ые присутствовали при работе через DBLIB не реализованы ...
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005659
Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yuriy!
Посмотри в тригер Insert и убери оттуда все Insert для Всех таблиц (даже для тех у которых нет столбца Identity). Оббычно из-за последних и возникает NULL.
...
Рейтинг: 0 / 0
вопрос об определении последнего id
    #32005675
Vasya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть способ формировать 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
вопрос об определении последнего id
    #32005676
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Vasya
И Вы рискнули бы использовать первый вариант??

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

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

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

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


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