Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Второе Context Connection в CLR C#.NET

5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Здравствуйте.
Пишу хранимую процедуру на c#.net для mssql 2005 и столкнулся с такой проблемой.
Создаю соединение
 
Код:
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Context Connection=true";

Создаю команду
 
Код:
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;

И пользуюсь ею просто ExecuteNonQuery.
Потом в коде идет
 
Код:
SqlDataReader rdr = cmd.ExecuteReader();

И после этого ExecuteNonQuery не выполняется. Пишет There is already an open DataReader associated with this Command which must be closed first.
Создал новую команду
 
Код:
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = conn;

И выясняется, что соединение conn уже используется.
Создал еще одно соединение
 
Код:
SqlConnection conn1 = new SqlConnection();
conn1.ConnectionString = "Context Connection=true";

И хотел было привязать на него новую команду, но оно стало ругаться, что Context Connection уже используется.
Помогите справиться с проблемой. Заранее спасибо
5
01 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor

Потом в коде идет
 
Код:
SqlDataReader rdr = cmd.ExecuteReader();
И после этого ExecuteNonQuery не выполняется. Пишет There is already an open DataReader associated with this Command which must be closed first.


1) Вы английский знаете? Все ведь написано.
2) Пользуйтесь конструкцией using:

 
Код:
using(SqlConnection con = new SqlConnection("blablabla"))
using(SqlCommand cmd = new SqlCommand(con)) {
   ...
   using(SqlDataReader reader = cmd.ExecuteReader()) {
     //чтение ридера
   }
}
5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Цитата: hardcase
1) Вы английский знаете? Все ведь написано.


Написано конечно.. Но мне нельзя закрывать DataReader

 
Код:
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read()) {
      cmd.CommandText = "update ..................";
      cmd.ExecuteNonQuery();
.................

Открывается select * from table и потом каждая строка table обрабатывается и апдейтится.

В общем, мне надо открыть второй connection к базе, чтобы на одном висел ридер, а на другом выполнять ExecuteNonQuery запросы.
Строку соединения подобрать не могу. Даже та, которая из внешней программы соединяется (из того же C#.NET)
выдает ошибку
 
Код:
"server=10.0.1.50;uid=sa;user=sa;pwd=mypassword;database=prfxmng;Integrated Security=false;"

Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

А "Context Connection=true" дублировать нельзя, говорит. Попробовал даже "Context Connection=false" от безысходности...
Помогите
5
01 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor
Открывается select * from table и потом каждая строка table обрабатывается и апдейтится.

DataReader - это не курсор. Способ работы SqlClient тут такой же как и в обычном клиенте СУБД. Сначала прочитайте данные из датаридера в буфер (список, словарь и т.п.), потом производите с ними что угодно.

5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Цитата: hardcase
DataReader - это не курсор. Способ работы SqlClient тут такой же как и в обычном клиенте СУБД. Сначала прочитайте данные из датаридера в буфер (список, словарь и т.п.), потом производите с ними что угодно.


Если выхода не будет, то так и сделаю...
А почему бы с DataReaderом не поработать как с курсором, если он допускает... И не соединиться другим коннектом, как я и хочу. ?

5
01 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor
И не соединиться другим коннектом, как я и хочу. ?

По поводу второго контекстного подключения ничего сказать не могу - я не работал с сиквель сервером "изнутри", думаю, что можно открывать.

5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Цитата: hardcase
По поводу второго контекстного подключения ничего сказать не могу - я не работал с сиквель сервером "изнутри", думаю, что можно открывать.


Открывать второе контекстное нельзя. Выдает ошибку что уже открыто.
Можно ли открыть неконтекстное? И строку соединения, которая бы обошла ошибку
Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

Разобрался с ошибкой.
Hardcase, по Вашему совету отказался от DataReader'a и поискал.
Нашел всеспасающего адаптера

 
Код:
SqlDataAdapter adapt = new SqlDataAdapter("SELECT *FROM table", conn);
DataSet data = new DataSet();
adapt.Fill(data);
foreach (DataRow row in data.Tables[0].Rows) {
............

Спасибо за участие.
Но все таки вопрос о втором контекстном соединении остается в силе.. Есть ли какая нибудь альтернатива ему?
У меня в проекте две процедуры, одна вызывает другую. А так как в первой создается контекстное соединение, то вторая не может его создать. И передать не получается
 
Код:
public static int check_cover(SqlConnection conn) {
......
}

Пишет что типа SqlConnection не существует.
Наверно SqlConnection не относится к типам которые можно передавать.
Что можно сделать?
5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Попробовал закрыть контекстное соединение перед вызовом второй процедуры
conn.Close();
Все равно пишет, что контекстное соединение используется. Еще в коде есть адаптер и SqlCommand. У них нет функции закрыть.
Кто занял контекстное соединение?
5
01 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor
Что можно сделать?

Какова цель всего этого действа?
Что вас заставило взяться за CLR расширения MSSQL? Для этого должны быть очень веские причины.

5.4K
01 декабря 2009 года
cursor
114 / / 05.01.2008
Цитата: hardcase
Какова цель всего этого действа?
Что вас заставило взяться за CLR расширения MSSQL? Для этого должны быть очень веские причины.



обработка данных в базе.
Запросов на селект 40к*15к*60к плюс запросов на апдейт 40к*15к.
Сначала это делал из программы с++. Познакомился с нормализацией базы и в итоге программа с 40минут оптимизировалась до 15.
Это все равно много.
Перешел на T-SQL. Результат 2 минуты как и у конкурентов.
Но в T-SQL не хватает некоторой гибкости, которая есть в CLR. Честно говоря, можно реализовать и на T-SQL, но это будет как-то квадратно, а мне хочется некоторой округлости, скажем так. Да и CLR выучить хочется.
Мне не хватает совсем чуть-чуть чтобы перенести код T-SQL на CLR C#.NET, а никто не хочет помочь..

5
01 декабря 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: cursor
Мне не хватает совсем чуть-чуть чтобы перенести код T-SQL на CLR C#.NET, а никто не хочет помочь..

Существенно быстрее работать от этого не станет. Подозреваю, что будет даже медленнее. Возможности CLR нужны в SqlServer не часто: а) для сложной обработки строк, б) нетривиальных агрегирующих функций (вроде изощренной математики), в) для работы с управляемыми типами, если таковые хранятся в базе.

341
02 декабря 2009 года
Der Meister
874 / / 21.12.2007
Цитата: hardcase
По поводу второго контекстного подключения ничего сказать не могу - я не работал с сиквель сервером "изнутри", думаю, что можно открывать.


Не, низзя создавать неконтекстные подключения во внедрённых в базы MS SQL Server сборках, и низя открывать более одного контекстного подключения. Там вообще очень много ограничений.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог