Второе Context Connection в CLR C#.NET
Пишу хранимую процедуру на c#.net для mssql 2005 и столкнулся с такой проблемой.
Создаю соединение
conn.ConnectionString = "Context Connection=true";
Создаю команду
cmd.Connection = conn;
И пользуюсь ею просто ExecuteNonQuery.
Потом в коде идет
И после этого ExecuteNonQuery не выполняется. Пишет There is already an open DataReader associated with this Command which must be closed first.
Создал новую команду
cmd1.Connection = conn;
И выясняется, что соединение conn уже используется.
Создал еще одно соединение
conn1.ConnectionString = "Context Connection=true";
И хотел было привязать на него новую команду, но оно стало ругаться, что Context Connection уже используется.
Помогите справиться с проблемой. Заранее спасибо
Потом в коде идет
1) Вы английский знаете? Все ведь написано.
2) Пользуйтесь конструкцией using:
using(SqlCommand cmd = new SqlCommand(con)) {
...
using(SqlDataReader reader = cmd.ExecuteReader()) {
//чтение ридера
}
}
Написано конечно.. Но мне нельзя закрывать DataReader
while (rdr.Read()) {
cmd.CommandText = "update ..................";
cmd.ExecuteNonQuery();
.................
Открывается select * from table и потом каждая строка table обрабатывается и апдейтится.
В общем, мне надо открыть второй connection к базе, чтобы на одном висел ридер, а на другом выполнять ExecuteNonQuery запросы.
Строку соединения подобрать не могу. Даже та, которая из внешней программы соединяется (из того же C#.NET)
выдает ошибку
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" от безысходности...
Помогите
DataReader - это не курсор. Способ работы SqlClient тут такой же как и в обычном клиенте СУБД. Сначала прочитайте данные из датаридера в буфер (список, словарь и т.п.), потом производите с ними что угодно.
Если выхода не будет, то так и сделаю...
А почему бы с DataReaderом не поработать как с курсором, если он допускает... И не соединиться другим коннектом, как я и хочу. ?
По поводу второго контекстного подключения ничего сказать не могу - я не работал с сиквель сервером "изнутри", думаю, что можно открывать.
Открывать второе контекстное нельзя. Выдает ошибку что уже открыто.
Можно ли открыть неконтекстное? И строку соединения, которая бы обошла ошибку
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 и поискал.
Нашел всеспасающего адаптера
DataSet data = new DataSet();
adapt.Fill(data);
foreach (DataRow row in data.Tables[0].Rows) {
............
Спасибо за участие.
Но все таки вопрос о втором контекстном соединении остается в силе.. Есть ли какая нибудь альтернатива ему?
У меня в проекте две процедуры, одна вызывает другую. А так как в первой создается контекстное соединение, то вторая не может его создать. И передать не получается
......
}
Пишет что типа SqlConnection не существует.
Наверно SqlConnection не относится к типам которые можно передавать.
Что можно сделать?
conn.Close();
Все равно пишет, что контекстное соединение используется. Еще в коде есть адаптер и SqlCommand. У них нет функции закрыть.
Кто занял контекстное соединение?
Какова цель всего этого действа?
Что вас заставило взяться за CLR расширения MSSQL? Для этого должны быть очень веские причины.
Что вас заставило взяться за CLR расширения MSSQL? Для этого должны быть очень веские причины.
обработка данных в базе.
Запросов на селект 40к*15к*60к плюс запросов на апдейт 40к*15к.
Сначала это делал из программы с++. Познакомился с нормализацией базы и в итоге программа с 40минут оптимизировалась до 15.
Это все равно много.
Перешел на T-SQL. Результат 2 минуты как и у конкурентов.
Но в T-SQL не хватает некоторой гибкости, которая есть в CLR. Честно говоря, можно реализовать и на T-SQL, но это будет как-то квадратно, а мне хочется некоторой округлости, скажем так. Да и CLR выучить хочется.
Мне не хватает совсем чуть-чуть чтобы перенести код T-SQL на CLR C#.NET, а никто не хочет помочь..
Существенно быстрее работать от этого не станет. Подозреваю, что будет даже медленнее. Возможности CLR нужны в SqlServer не часто: а) для сложной обработки строк, б) нетривиальных агрегирующих функций (вроде изощренной математики), в) для работы с управляемыми типами, если таковые хранятся в базе.
Не, низзя создавать неконтекстные подключения во внедрённых в базы MS SQL Server сборках, и низя открывать более одного контекстного подключения. Там вообще очень много ограничений.