Frederic GIRARDIN Ответов: 1

Как найти лучший способ разоблачения .Объем данных в DLL ?


Привет.

Создание набора данных .NET легко с помощью Visual Studio, но нет никакого способа предоставить доступ к этому объекту из общей библиотеки DLL. Действительно, когда мы используем только один EXE-файл, у нас возникает та же проблема: динамическое изменение строки подключения набора данных, которая является только параметром, не кажется естественным: мы трафикуем значение, написанное чернилами в сборке!? Кроме того, один и тот же набор данных может использоваться для одновременного управления различными базами данных, что противоречит существованию одной переменной usage (connectionstring ресурса проекта).

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

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

Мое текущее решение : поиск и замена каждого "друга" на "public" в файле конструктора наборов данных, чтобы иметь возможность использовать код рефлексии на основе значения TableName, предсказывать Имя объекта TableAdapter, динамически создавать новый экземпляр TableAdapter из реального и передавать соединение в качестве параметра, уже управляемого до этого.

#Region "Dataset"
    Public Function TableAdapterRoot(_Name As String) As String

        'exemple : Dim x As ECI_Data.ESTX_DataSet_2TableAdapters.ARTICLETableAdapter

        'racine ECI_Data.
        Dim szRootObject As String = "ECI_Data." & _type.ToString & "_DataSet"
        '+ version
        szRootObject &= "_" & _Version.Major & "TableAdapters."
        '+ Nom classe 
        szRootObject &= _Name & "TableAdapter"
        Return szRootObject
    End Function

    Public Function ChargerTable(_TableName As String, Optional ByVal Reload As Boolean = False, Optional ByVal clone As Boolean = False) As DataTable

        Dim _ClassName As String
        Dim _Adapter As Object

        Try
            'si "rechargement forcé" pas actif et déjà pourvu alors on ne fait rien sinon que de renvoyer ce que l'on a
            If Not Reload And DataSet.Tables(_TableName).Rows.Count > 0 Then
                ChargerTable = DataSet.Tables(_TableName)
                Exit Function
            End If

            _ClassName = TableAdapterRoot(_TableName)
            '_Adapter = System.Activator.CreateInstance("ECI_Data", _ClassName).Unwrap()
            _Adapter = System.Reflection.Assembly.GetExecutingAssembly.CreateInstance(_ClassName)
            _Adapter.Connection = _Connexion
            _Adapter.Transaction = _Transaction
            Dim dt As DataTable = Nothing
            If clone Then
                dt = DataSet.Tables(_TableName).Clone
            Else
                dt = DataSet.Tables(_TableName)
            End If
            _Adapter.Fill(dt)
            ChargerTable = dt 'DataSet.Tables(_TableName)
            _Adapter.dispose()
            'End Using
        Catch ex As Exception
            MessageErreur("(Table [" & _TableName & "] " & ex.Message)
            ChargerTable = Nothing
        End Try
    End Function
#end region 


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

1 Ответов

Рейтинг:
1

Frederic GIRARDIN

Дело в том, что я неправильно понял TableAdapterManager, поэтому я попытался работать непосредственно с адаптером таблицы. Для этого я оперировал широкой заменой друга на публику. Операция, которая требовалась после каждого изменения конструктора наборов данных! И конечно, я ошибался.

В прошлую пятницу я нашел другой способ: в стороннем объекте, который будет использоваться в качестве точки входа, я сначала попытался переопределить свойство соединения TableAdapterManager, но оно не было предназначено для перегрузки; учитывая этот тупик, я смог динамически определить каждое соединение TableAdapter с помощью слоя отражения .net, прежде чем назначить его каждому типу свойств TableAdapter TableAdpaterManager (благодаря callbyname еще раз). Если я этого не делал, то соединение было тем, которое использовалось для определения набора данных. Сегодня я здесь, и хотя теперь я понимаю, что такое настоящее решение, я использую именно его.

Потому что реальное решение состоит в том, чтобы идентифицировать переменную, используемую для каждого набора данных, как цепочку соединений, а затем изменить ее перед созданием экземпляра TableAdapterManager и всех его свойств TableAdapter Тогда и только тогда механизм, созданный дизайнером, имеет смысл, потому что при создании экземпляра распознается только значение этой цепочки. Это также означает, что очень важно заблокировать этот экземпляр от начала до конца, чтобы избежать того, что несколько запросов генерируют ошибки перенаправления Я думаю о паттерне очередей и асинхронном разрешении.

Короче говоря, если вы знаете, как узнать переменную "строка подключения", используемую набором данных, вы выиграли. Конечно, мы должны выбрать имя этой переменной, поэтому мы не можем сделать это самостоятельно, но реальное решение состоит в том, чтобы получить его из самого набора данных. Может быть, и настоящий xml.