Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
Здравствуйте.

Пытаюсь работать с SQL server 2005, через ADO C++, выполняя стандартные действия INSERT (через связываемые переменные), COMMIT TRANSACTION, BEGIN TRANSACTION.
Просматривая SQL Server Profiler, вижу непонятные Login и Logout.

Делаю все стандартно:

#include "stdafx.h"
#include <stdio.h>
#include <iostream>

using namespace std;

#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

int _tmain(int argc, _TCHAR* argv[])
{

setlocale( LC_ALL, "russian_Russia.1251" );

_bstr_t connectionstring = "Driver={SQL Native Client};Server=LABNOTE_TOSHIBA;Persist Security Info=True;User ID=username;Password=mypass;";
_CommandPtr pCom = NULL;
_ConnectionPtr Con = NULL;
VARIANT *RecordsAffected = NULL;

try
{
::CoInitialize(NULL); 
if (Con.CreateInstance(__uuidof(Connection), NULL) != 0) 
{ 
cout << "Couldn't create the connection variable" << endl; 
} 
if (pCom.CreateInstance( __uuidof( Command ), NULL ) != 0)
{
cout << "Couldn't create the pCom variable" << endl; 
}

Con->Open(connectionstring, "", "", ConnectOptionEnum::adConnectUnspecified); // BLOCK №0

_bstr_t execute = "INSERT INTO Primer.dbo.test (mycolumn) VALUES (?)"; 
_bstr_t begtrans = "BEGIN TRANSACTION";
_bstr_t comtrans = "COMMIT TRANSACTION";


pCom->CommandText = begtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdText); // BLOCK №1

pCom->CommandText = execute;
Param1 = pCom->CreateParameter("p", DataTypeEnum::adLongVarChar, ParameterDirectionEnum::adParamInput, -1);
Param1->Value = "123";
pCom->Parameters->Append(Param1);

pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdText); // BLOCK №2

pCom->CommandText = comtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdUnspecified); // BLOCK №3
}
catch (_com_error e)
{
cout << e.Description() << endl;
}
}


Вывод SQL Server Profiler далее по блокам:
BLOCK №0 :
Audit Login -- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language русский
set dateformat dmy
set datefirst 1
set transaction isolation level read committed

SQL:BatchStarting select c.name,c.description from master.dbo.syscharsets c where c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset'))
SQL:BatchCompleted select c.name,c.description from master.dbo.syscharsets c where c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset'))

BLOCK №1 :
SQL:BatchStarting BEGIN TRANSACTION
SQL:BatchCompleted BEGIN TRANSACTION

BLOCK №2 :
Audit Login -- network protocol: TCP/IP
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language русский
set dateformat dmy
set datefirst 1
set transaction isolation level read committed
SQL:BatchStarting select c.name,c.description from master.dbo.syscharsets c where c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset'))
SQL:BatchCompleted select c.name,c.description from master.dbo.syscharsets c where c.id = convert(tinyint, databasepropertyex ( db_name() , 'sqlcharset'))
RPC:Completed exec [sys].sp_datatype_info_90
Audit Logout

RPC:Completed exec sp_executesql N'INSERT INTO Primer1.dbo.test (t) VALUES (@P1)',N'@P1 text','123'

BLOCK №3 :
SQL:BatchStarting COMMIT TRANSACTION
SQL:BatchCompleted COMMIT TRANSACTION

Т.е. программа в цикле выполняет INSERT, по требованиям бизнес-логики
каждый INSERT предваряется установкой Savepoint. Использую
связываемые переменные. В трассировке видно, что сессия к базе для каждого
INSERT каждый раз переустанавливается, хотя я ее ничего такого не
ожидаю. Вопрос - в чем причина такого поведения, куда копать?
30 апр 13, 10:55    [14248048]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Erches, давайте команды одним батчем


_bstr_t execute = "BEGIN TRANSACTION; INSERT INTO Primer.dbo.test (mycolumn) VALUES (?);COMMIT TRANSACTION;"; 
30 апр 13, 11:53    [14248530]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
HandKot, спасибо за ответ.
Насколько мне известно, автокоммит стоит по умолчанию.
Мне важно фиксировать транзакции после вставки определенного числа записей.
30 апр 13, 12:33    [14248776]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Erches
HandKot, спасибо за ответ.
Насколько мне известно, автокоммит стоит по умолчанию.
Мне важно фиксировать транзакции после вставки определенного числа записей.


не знаю насчет автокоммита, но, я так думаю, если стоит BEGIN TRAN, то оно должно сопровождаться COMMIT TRAN иначе транзакция будет незавершенной и откатится. Не обязательно они должны быть на каждой иттерации.
30 апр 13, 12:55    [14248930]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
LogrusAS
Member

Откуда: Киев
Сообщений: 197
В Google забанили?
Нужно вызывать метод объекта, а не команды ему передавать.
BeginTrans, CommitTrans, and RollbackTrans Methods Example
30 апр 13, 13:19    [14249053]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
LogrusAS
В Google забанили?
Нужно вызывать метод объекта, а не команды ему передавать.
BeginTrans, CommitTrans, and RollbackTrans Methods Example


У меня проблема не в транзакциях, а в том что в сессии постоянное переподключение идет. Собственно и вопрос так звучит, куда копать?
30 апр 13, 13:48    [14249232]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
HandKot
Erches
HandKot, спасибо за ответ.
Насколько мне известно, автокоммит стоит по умолчанию.
Мне важно фиксировать транзакции после вставки определенного числа записей.


не знаю насчет автокоммита, но, я так думаю, если стоит BEGIN TRAN, то оно должно сопровождаться COMMIT TRAN иначе транзакция будет незавершенной и откатится. Не обязательно они должны быть на каждой иттерации.


Да, но если BEGIN TRAN не стоит, то происходит автокоммит. При этом в COMMIT TRAN нет надобности.
30 апр 13, 13:56    [14249279]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Erches
В трассировке видно, что сессия к базе для каждого
INSERT каждый раз переустанавливается, хотя я ее ничего такого не
ожидаю.
А SPID каждый раз новый, или один и тот же?
30 апр 13, 13:58    [14249285]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Erches
Собственно и вопрос так звучит, куда копать?
А вообще это вопрос не по сиквелу, а по программированию в ADO, OLEDB, C++

Мне вот непонятно из вашего кода, как вообще связаны Con и Com?
Откуда объект-команда получает коннект? Такое впечатление, что они у вас несвязаны, коннект вы солздаёте, а каждая команда пользуется не им, а делает свой коннект.

Если вы всё это делаете на локальном сервере, у вас есть виндовый доступ к сиквелу, и вы используете полные имена (с именем базы), то это вообще вполне возможно.
30 апр 13, 14:06    [14249348]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Erches
Да, но если BEGIN TRAN не стоит, то происходит автокоммит. При этом в COMMIT TRAN нет надобности.
Вы не понимаете, что такое автокоммит. Если транзакция начата явно инструкцией begin tran, то придется ее явно подтверждать или откатывать..
30 апр 13, 14:12    [14249371]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Erches
HandKot
не знаю насчет автокоммита, но, я так думаю, если стоит BEGIN TRAN, то оно должно сопровождаться COMMIT TRAN иначе транзакция будет незавершенной и откатится. Не обязательно они должны быть на каждой иттерации.
Да, но если BEGIN TRAN не стоит, то происходит автокоммит. При этом в COMMIT TRAN нет надобности.
Лучше в таких случаях не думать, а знать. Откуда это вообще взялось - автокоммит? У сиквела этого точно нету, у ADO в принципе есть, но правильно не полагаться в таких ответственных вещах на какие то настройки по умолчанию, как минимум выставляйте этот режим для объекта явно.

Кроме того, в случае, если автокоммит действительно есть, он для вас не подходит, поскольку вам не нужно после каждой команды делать коммит (в частности, после команды BEGIN TRAN тоже сработает коммит и далее транзакции не будет).
30 апр 13, 14:14    [14249377]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
alexeyvg
Erches
Собственно и вопрос так звучит, куда копать?
А вообще это вопрос не по сиквелу, а по программированию в ADO, OLEDB, C++

Мне вот непонятно из вашего кода, как вообще связаны Con и Com?
Откуда объект-команда получает коннект? Такое впечатление, что они у вас несвязаны, коннект вы солздаёте, а каждая команда пользуется не им, а делает свой коннект.

Если вы всё это делаете на локальном сервере, у вас есть виндовый доступ к сиквелу, и вы используете полные имена (с именем базы), то это вообще вполне возможно.


Связываю так:
pCom->ActiveConnection = Con; 
Прошу прощения, неправильно оформил вопрос.
30 апр 13, 15:34    [14249930]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
alexeyvg
Erches
пропущено...
Да, но если BEGIN TRAN не стоит, то происходит автокоммит. При этом в COMMIT TRAN нет надобности.
Лучше в таких случаях не думать, а знать. Откуда это вообще взялось - автокоммит? У сиквела этого точно нету, у ADO в принципе есть, но правильно не полагаться в таких ответственных вещах на какие то настройки по умолчанию, как минимум выставляйте этот режим для объекта явно.

Кроме того, в случае, если автокоммит действительно есть, он для вас не подходит, поскольку вам не нужно после каждой команды делать коммит (в частности, после команды BEGIN TRAN тоже сработает коммит и далее транзакции не будет).


Почему я думаю что по умолчанию стоит автокоммит, потому что без явного вызова BEGIN TRANS, выполняя:
_bstr_t execute = "INSERT INTO Primer.dbo.test (mycolumn) VALUES (?)"; 

pCom->CommandText = execute;
Param1 = pCom->CreateParameter("p", DataTypeEnum::adLongVarChar, ParameterDirectionEnum::adParamInput, -1);
Param1->Value = "123";
pCom->Parameters->Append(Param1);

pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdText);

запись в базу добавляется.
30 апр 13, 15:41    [14249970]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Erches
запись в базу добавляется.

а почему бы ей туда не попасть?

ЗЫЖ такое поведение я встречал в ОРАКЛ, когда после инсерта или апдейта необходимо было явно комитить. Но не факт, что это зависит от СУБД, возможно это зависит от клиента (я работал с PL-SQL DEVELOPER)
30 апр 13, 16:20    [14250199]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Erches
Почему я думаю что по умолчанию стоит автокоммит, потому что без явного вызова BEGIN TRANS,
запись в базу добавляется.
Естественно, как же иначе.

Но это не называется "автокоммит", я даже не знаю, откуда вообще взялось это слово в данном контексте.

У сиквела такого нет, это либо у других СУБД, либо какие то тонкости средств доступа (ADO & C++), как я вначале и подумал.
1 май 13, 00:25    [14251863]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
alexeyvg
Erches
Почему я думаю что по умолчанию стоит автокоммит, потому что без явного вызова BEGIN TRANS,
запись в базу добавляется.
Естественно, как же иначе.

Но это не называется "автокоммит", я даже не знаю, откуда вообще взялось это слово в данном контексте.

У сиквела такого нет, это либо у других СУБД, либо какие то тонкости средств доступа (ADO & C++), как я вначале и подумал.


Как мне кажется, я зря начал строить приложении в связке c++ & ado, c++ обязателен, поскольку используются сторонние библиотеки на c++, времени оберточные классы под .net писать нет. Запарился копаться с добавлением файлов и всякой прочей хрени. Ответов в google нет, скорей всего я просто плохо ищу, а в документации так просто не сориентируешься.
1 май 13, 01:17    [14251938]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
тебе же по-русски обяснили убери эту муру

pCom->CommandText = begtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdText); // BLOCK №1


pCom->CommandText = comtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdUnspecified); // BLOCK №3


и поставь BeginTran, CommitTran - и все заработает

что за люди - напишут глупости потом обвиняют технологии
1 май 13, 18:46    [14252851]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
Lepsik
тебе же по-русски обяснили убери эту муру

pCom->CommandText = begtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdText); // BLOCK №1


pCom->CommandText = comtrans;
pCom->Execute(NULL, NULL, CommandTypeEnum::adCmdUnspecified); // BLOCK №3


и поставь BeginTran, CommitTran - и все заработает

что за люди - напишут глупости потом обвиняют технологии


Меня тоже удивляют люди, которые напишут глупость, не проверив на работоспособность!
Вызывая BeginTrans и CommitTrans объекта _ConnectionPtr, предварительно не закрыв активное соединение _CommandPtr - не работает! Вариант с закрытием активного соединения для объекта _CommandPtr мне не подходит.
1 май 13, 20:34    [14252964]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Erches
Меня тоже удивляют люди, которые напишут глупость, не проверив на работоспособность!


зачем мне проверят заведомо неправильно написанный код, человеком, который пихает инструкции не понимая как они работают

Тебя новичка ( судя по твоим словам в первом посте) ткнули носом в msdn с примером как правительно писать.
открыть рекордсет и в него вставлять

http://msdn.microsoft.com/en-us/library/windows/desktop/ms675942(v=vs.85).aspx

Не хочешь слушать советов - не слушай и найди другую работу по-проше
1 май 13, 21:07    [14253021]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
Lepsik
Erches
Меня тоже удивляют люди, которые напишут глупость, не проверив на работоспособность!


зачем мне проверят заведомо неправильно написанный код, человеком, который пихает инструкции не понимая как они работают

Тебя новичка ( судя по твоим словам в первом посте) ткнули носом в msdn с примером как правительно писать.
открыть рекордсет и в него вставлять

http://msdn.microsoft.com/en-us/library/windows/desktop/ms675942(v=vs.85).aspx

Не хочешь слушать советов - не слушай и найди другую работу по-проше

Еще раз. Нужна вставка на основе bind variables, ReсordSet не подходит. Что не понятного?
1 май 13, 22:44    [14253253]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Erches
Еще раз. Нужна вставка на основе bind variables, ReсordSet не подходит. Что не понятного?



всем остальным девелоперам ReсordSet почему-то для работы с параметризованными запросами подходит, в примере msdn binding тоже присуствует
1 май 13, 22:57    [14253293]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Что такое автокоммит:
http://msdn.microsoft.com/en-us/library/ms187878(v=sql.105).aspx
Autocommit mode is the default transaction management mode of the SQL Server Database Engine. Every Transact-SQL statement is committed or rolled back when it completes. If a statement completes successfully, it is committed; if it encounters any error, it is rolled back. A connection to an instance of the Database Engine operates in autocommit mode whenever this default mode has not been overridden by either explicit or implicit transactions. Autocommit mode is also the default mode for ADO, OLE DB, ODBC, and DB-Library.

A connection to an instance of the Database Engine operates in autocommit mode until a BEGIN TRANSACTION statement starts an explicit transaction, or implicit transaction is set on. When the explicit transaction is committed or rolled back, or when implicit transaction mode is turned off, the connection returns to autocommit mode.

Erches
Т.е. программа в цикле выполняет INSERT, по требованиям бизнес-логики
каждый INSERT предваряется установкой Savepoint.
В приведенном вами коде нет никакой работы с savepoint'ами. Вам нужна одна длинная транзакция с возможностью отката отдельных стейтментов? Если нет, то вообще никакого управления транзакциями не требуется - работайте в автокоммите.
Erches
В трассировке видно, что сессия к базе для каждого
INSERT каждый раз переустанавливается, хотя я ее ничего такого не
ожидаю. Вопрос - в чем причина такого поведения, куда копать?
Опять же, в вашей трассе ничего похожего не видно. Там просто драйвер использует служебное соединение для своих нужд.
Если же действительно каждая инструкция начинает выполняться в своем собственном соединении, то это может быть вызвано, например, наличием недофетченных данных в основном соединении.
1 май 13, 23:52    [14253422]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
invm
Что такое автокоммит:
http://msdn.microsoft.com/en-us/library/ms187878(v=sql.105).aspx
Autocommit mode is the default transaction management mode of the SQL Server Database Engine. Every Transact-SQL statement is committed or rolled back when it completes. If a statement completes successfully, it is committed; if it encounters any error, it is rolled back. A connection to an instance of the Database Engine operates in autocommit mode whenever this default mode has not been overridden by either explicit or implicit transactions. Autocommit mode is also the default mode for ADO, OLE DB, ODBC, and DB-Library.

A connection to an instance of the Database Engine operates in autocommit mode until a BEGIN TRANSACTION statement starts an explicit transaction, or implicit transaction is set on. When the explicit transaction is committed or rolled back, or when implicit transaction mode is turned off, the connection returns to autocommit mode.

Erches
Т.е. программа в цикле выполняет INSERT, по требованиям бизнес-логики
каждый INSERT предваряется установкой Savepoint.
В приведенном вами коде нет никакой работы с savepoint'ами. Вам нужна одна длинная транзакция с возможностью отката отдельных стейтментов? Если нет, то вообще никакого управления транзакциями не требуется - работайте в автокоммите.
Erches
В трассировке видно, что сессия к базе для каждого
INSERT каждый раз переустанавливается, хотя я ее ничего такого не
ожидаю. Вопрос - в чем причина такого поведения, куда копать?
Опять же, в вашей трассе ничего похожего не видно. Там просто драйвер использует служебное соединение для своих нужд.
Если же действительно каждая инструкция начинает выполняться в своем собственном соединении, то это может быть вызвано, например, наличием недофетченных данных в основном соединении.

Спасибо. Разобрался. Вопрос решен.
2 май 13, 00:43    [14253551]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
Erches
Member

Откуда:
Сообщений: 12
Lepsik
Erches
Еще раз. Нужна вставка на основе bind variables, ReсordSet не подходит. Что не понятного?



всем остальным девелоперам ReсordSet почему-то для работы с параметризованными запросами подходит, в примере msdn binding тоже присуствует

Диплом пишу. С ado впервые, не знал что можно использовать RecordSet с Binding. Спасибо.
2 май 13, 00:47    [14253563]     Ответить | Цитировать Сообщить модератору
 Re: C++, ADO, _Commandptr и непонятные Audit Login/Logout в SQL Server Profiler.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
Erches
Диплом пишу. С ado впервые, не знал что можно использовать RecordSet с Binding. Спасибо.
А что такую трудную связку для дипрома выбрали? Взяли бы что попроще.
2 май 13, 01:29    [14253652]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить