Как обновить одну таблицу DataSet с помощью TableAdapter, без жесткого кодирования имени таблицы? - PullRequest
2 голосов
/ 13 ноября 2009

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

Моя ситуация такова: у меня есть проект, который содержит большое количество таблиц поиска, и у меня есть все эти таблицы поиска, представленные в одном типизированном DataSet, который содержит адаптеры таблиц для каждого поиска. Я разработал редактор для этих таблиц поиска, который должен позволять редактировать одну из них одновременно. Мой внешний интерфейс написан на VB и WinForms, а внутренний - это SOAP-веб-сервис; Я могу успешно передать изменения в DataSet обратно в веб-службу, но не могу найти способ использовать TableAdapter для обновления одной таблицы, которая была изменена.

Я пытаюсь создать экземпляр соответствующего адаптера таблиц для обновленной таблицы данных, отправив имя таблицы обратно в веб-службу вместе с набором данных, а затем сослаться на адаптер таблицы с динамическим именем. Обычный способ создания TableAdapter:

Dim ta As New dsLookupsTableAdapters.tlkpMyTableTableAdapter

Что я хотел бы сделать, так это, но, конечно, это не работает:

strTableName = "tlkpMyTable"
Dim ta As New dsLookupsTableAdapters(strTableName & "TableAdapter")

Есть ли способ достичь этого или я вообще ошибочен? Другой вариант - написать отдельный код для каждой таблицы, чего я бы предпочел избегать!

Ответы [ 4 ]

2 голосов
/ 10 декабря 2009

Вы можете использовать Activator для создания экземпляра вашего TableAdapter из его строкового имени, как вы хотите:

object adapter = Activator.CreateInstance(Type.GetType("My.Namespace.MyDataSetTableAdapters." + myTable.Name + "TableAdapter"));

Тогда, поскольку у адаптеров таблиц нет общего интерфейса, вы должны использовать отражение для вызова его метода Update:

adapter.GetType().GetMethod("Update").Invoke(adapter, null);

http://msdn.microsoft.com/en-us/library/system.type.getmethod.aspx

Это по памяти, но достаточно близко. Вы также можете использовать GetProperty, чтобы получить свойство соединения и установить его как требуется.

1 голос
/ 23 ноября 2009

Не уверен, что я на 100% понимаю, у вас есть один DataTable в вашем DataSet или один DataTable для таблицы поиска?

В любом случае, возможно, вы могли бы этот подход фильтровать по таблице поиска?

1 голос
/ 24 ноября 2009

Если вы используете VB.Net 2008, тогда используйте tableadaptermanager (http://msdn.microsoft.com/en-us/library/bb384426.aspx). Я думаю, что было бы намного проще кодировать против:)

Wade

1 голос
/ 18 ноября 2009

Довольно просто создавать типы во время выполнения по имени типа (строка).

Вот отдельный класс VB, который иллюстрирует один из способов сделать это: используйте System.Activator.CreateInstance для создания экземпляров типов, используя строковое представление имени типа. Затем вы можете привести его к базовому классу DataAdapter и использовать его, как и любой другой DataAdapter.

Public Class dsLookupsTableAdapters

    Public Function CreateInstance(ByVal strName As String) As Object
        CreateInstance = Nothing

        For Each a As System.Reflection.Assembly In System.AppDomain.CurrentDomain.GetAssemblies()
            Try
                Dim strAssemblyName As String() = a.FullName.Split(New Char() {","c})
                Dim strNameTemp As String = strAssemblyName(0) & "." & strName
                Dim instance As Object = System.Activator.CreateInstance(a.FullName, strNameTemp)
                If instance IsNot Nothing Then
                    Dim handle As System.Runtime.Remoting.ObjectHandle
                    handle = CType(instance, System.Runtime.Remoting.ObjectHandle)
                    Dim o As Object = handle.Unwrap()
                    CreateInstance = o
                    Exit For
                End If
            Catch ex As System.Exception
                Continue For ' ignore exception, means type isn't there
            End Try
        Next
    End Function


    Public Class tlkpMyTableTableAdapter
        Inherits System.Data.Common.DataAdapter

    End Class


    Public Sub Test()
        ' define type name. note that, in this sample, tlkpMyTableTableAdapter is a nested
        ' class and dsLookupsTableAdapters is the containing class, hence the "+". If, however,
        ' dsLookupsTableAdapters is a namespace, replace the "+" with a "."
        Dim typeName As String = "dsLookupsTableAdapters+tlkpMyTableTableAdapter"
        Dim adapter As System.Data.Common.DataAdapter
        Dim o As Object = CreateInstance(typeName)
        adapter = CType(o, System.Data.Common.DataAdapter)

    End Sub

End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...