Member 12561559 Ответов: 2

Byref и byval на oledb-соединении-быстрый вопрос


Прав ли я, предполагая, что:
(например): если у нас есть переменная под названием "DB" в качестве oledb.oledbconnection

и я хотел передать это соединение другой функции в модуле моего проекта, который имеет принимающая подфункция

функции testfunction(бывал дБ как oledb.метод oledbconnection)
означает, что "testfunction" создает новое соединение в то время как

функции testfunction(как byref дБ как oledb.метод oledbconnection)
будет ли использовать существующее соединение, открытое в другом месте моего проекта?

Спасибо!

Что я уже пробовал:

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

2 Ответов

Рейтинг:
5

Jochen Arndt

Переданный аргумент является "ссылочным классом". Это означает, что даже при использовании ByVal, ссылка передается, но вы получаете копию ссылки вместо самой ссылки (вы не получите копию ссылки). OleDBConnection пример).

Итак, ответ на ваш вопрос таков:
Существующее соединение используется в обоих случаях.


Рейтинг:
19

Member 12561559

Я читал это (кстати, спасибо за ссылку), но на самом деле там ничего не говорится о подключении к базе данных. Будет ли он воссоздан (я думаю, что это так, если его BYVAL) или если он будет повторно использован (BYREF) - я спрашиваю только потому, что недавно перешел с VB6 на VB.NET и я все еще пытаюсь понять, как все работает, и просто хотел получить подтверждение того, правильно ли я это понял? Спасибо!

Dave Kreskowiak

Объект DbConnection - это ссылочный тип. Все экземпляры класса (объекты) являются ссылочными типами. Типы значений - это такие вещи, как целые числа и структуры.

Нет, ничто никогда не создается заново. Для ссылочных типов вы всегда передаете ссылку на объект. Разница в том, что если вы передаете ByVal, вы передаете копию ссылки (а не копию объекта). Если вы попытаетесь заменить переданный объект другим объектом,ничего не произойдет с вызывающим объектом. Когда ваш метод возвращается, вызывающий объект все еще будет иметь исходный объект, который он передал.

В ситуации ByRef вы передаете исходную ссылку на объект. В этом случае, если вызываемый метод заменит объект другим, вызывающий получит этот измененный объект обратно, по существу заменив тот, который он передал.

Member 12561559

Благодарность! Причина, по которой я спрашиваю, заключается в следующем: в vb6 я пишу DLL, развертываю ее на IIS6 (да, нам серьезно нужно обновить), и все работает нормально, конфликтов нет, т.е. все, что работает в DLL для пользователя, подключенного к сеансу, " их "DLL, все переменные принадлежат этому конкретному пользователю, но с тех пор, как я использую VB.NET, я получаю представление (из того, что я читаю, хотя я могу неправильно понимать), что если у меня есть DLL и объявлены некоторые общедоступные переменные, это даже несмотря на то, что существует несколько пользователей, этот один пользователь, который обратился к нашей DLL, может получать значения этой общедоступной переменной, которые получает другой пользователь в другом сеансе, но все еще обращается к DLL - имеет ли это смысл? Извините, если я запутался. В основном из-за многопоточности VB.NET все, что объявлено как Public, доступно для всех, кто обращается к этой переменной. Я собираюсь написать простой тест, чтобы убедиться, что это правда. Его ошеломляющий переход от VB к .NET, поскольку .NET DLLS поддерживает .COM (что мне и нужно делать).

Richard MacCutchan

Извините, я не знаю ответа. Когда вы говорите "общедоступные" переменные, где и как они становятся доступными? Библиотека DLL не должна содержать информацию, принадлежащую клиентскому приложению.

Member 12561559

Я думаю, что мне нужно сделать гораздо больше чтения, различия в том, как .NET обрабатывает библиотеки DLL, а VB обрабатывает библиотеки DLL очень по-разному, хотя настройка очень похожа. Кажется, у меня возникают проблемы с потоковой передачей подключений к базе данных, но один и тот же код в VB прекрасно работает без тех же проблем. Больше читая меня, я думаю - во всяком случае, большое вам спасибо, Ричард, - мне есть о чем почитать и подумать. Ваше время было оценено по достоинству :)