Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: выбирать при установке OLEdb или SQLdb а дальше ? Добавлено: 27.09.05 16:58  

Автор вопроса:  student-uni
Проблема такая
При установке программы надо предложить юзверю
выбор или работать с OLEdb или с SQLdb
А дальше исходя из его выбора программа
должна соответвтенно работать либо
с OLEdb connection /adapter/ либо с sqldb.

Прогу я написал для OLEdb.

И что теперь делать ?

Гляньте плз мои варианты решения и
может кто предложит что по умнее.

Вар1. - Написать вторую копию проги с SQLdb и при инсталяции разворачивать либо одну либо другую
в зависимости от выбора юзверя.
Но тут потери- объём инсталляшки.

Вар2. - Копию не делать а Прописать в проге везде выбор
по IF выбор либо OLEdb connection либо sqldb.
В зависимости от выбора при сетапе.
Но тут будет теряться время.

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

Вар4. Создать текстовую переменную например

DIM strDBperemennaja As String = "BAZAXXX"

При инсталляции просмотреть всю экзешку в бинарном
режиме найти символы BAZAXXX и заменить побитово
ХХХ на SQL или OLE. А программа привыполнении
будет смотреть о принимать решение в зав-сти
от значени я этой переменной.

Но все эти варианты какието каличные.

Может кто делал что либо подобное по красивее ?
Спасибо

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 27.09.05 17:21
В программе везде оперировать не конкретными классами, а интерфейсами.
Например, вместо OleDbConnection - IDBConnection. Создать класс,
который будет создавать объекты.

Friend Class DBObjectsFactory
   Friend Enum DBType
      SQL=1
      OleDb=2
   End Enum

   Private _DBType As DBType

   Friend Sub New (ByVal MyDBType As DBType)
      Me._DBType = MyDBType
   End Sub

   Friend Function GetConnection (ByVal ConnectionString As String) As IDBConnection
      Select Case Me._DBType
         Case DBType.SQL
            Return New SQLConnection(ConnectionString)
         Case DBType.OleDb
            Return New OleDbConnection(ConnectionString)
         Case Else
            Return Nothing
      End Select
   End Function


   'Так же для других классов

   

   '...

   'Использовать:
   
   Dim DBType As DBObjectsFactory.DBType
   'Переменная DBType инициализируется из файла настроек или реестра
   
   Dim Factory As New DBObjectsFactory(DBType)

   '...

   Dim Conn As IDBConnection = Factory.GetConnection(ConnString)
   Conn.Open

   '...

Ответить

Номер ответа: 2
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #2 Добавлено: 27.09.05 19:35
Красиво,
спасибо.

Но один вопрос,
а откуда брать
SQL=1
OleDb=2 ???

Ведь надо как то передать в прогу,
что юзверь выбрал при инсталляции.

Это что же каждый раз в конфиг файл лазить ?

Ответить

Номер ответа: 3
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #3
Добавлено: 27.09.05 19:44
При инсталляции сохраняй в конфигурационный файл или в реестр. А при запуске программы читай оттуда значение. Туда же можно и строку соединения сохранять.

Ответить

Номер ответа: 4
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #4 Добавлено: 12.10.05 22:25
Всё работает великолепно!!
Спасибо огромное. Спас.
Ещё один вопрос,
А как сделать интерфейс для датаридера ?
У меня для всего получилось,
а для Дата ридера - не идёт.
В принципе и так работает, но все же где ошибка ?

 Friend Function GetDataReader(ByVal SelectString As String, ByVal ConnectionString As IDbConnection) As IDataReader
            Select Case Me._DBType
                Case DBType.SQL
                    Return New SqlDataReader 'тут орёт - в контексте недоступна тк приват
                Case DBType.OleDb
                    Return New OleDbDataReader 'тут орёт - в контексте недоступна тк приват

                Case Else
                    Return Nothing
            End Select
        End Function

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 13.10.05 12:22
у DataReader'а нет доступныз извне конктрукторов. Он создается только с помощью Command:

        Dim reader As SqlDataReader
        reader = command.ExecuteReader()

Ответить

Номер ответа: 6
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #6 Добавлено: 08.12.05 14:04
У меня Проблема

мне нужно теперъ добавлятъ параметры в этот IDbCommand типа

CommandeTA.Parameters.Add("@Picture", OleDbType.LongVarBinary).Value = bytes

Естественно для разных типоб БД это будет
OleDbType.LongVarBinary
MySQLDbType.Binary
и т д

Когда же мои объект типа Command так сказатъ "универсален":
Dim CommandeTA As IDbCommand = Factory.GetCommand(strAbfrage, Conn1)
(вместо однобазового
Dim CommandeTA As OleDb.OleDbCommand = New OleDb.OleDbCommand(strAbfrage, Conn1)
)

то

CommandeTA.Parameters.Add позволяет вводитъ толъко имя "@Picture"
и не имеет места для параметра OleDbType.LongVarBinary
и не понимает .Value и как следствие не позволяет ему присваиватъ значение = bytes

Вопрос:

Как мне модифицироватъ дружественную функцию,
чтобы IDbCommand позволял не толъко исполъзоватъ параметр
но и задаватъ его значение.
(можно не LongVarBinary можно просто Binary)

Что пробовал я:
я посмотрел, что
CommandeTA.Parameters вызывает далъше OleDbParameter
который собственно и позволяет выйти на DbType.Binary
и написал ф-ю As IDataParameter
которая говорит
"при вызове объекта типа As IDataParameter вызыватъ
(в зав-сти от Case Me._DBType)
соответствующий DbParameter"

Но CommandeTA. все равно его не видит.
Возмойно надо модифицироватъ IDbCommand ?

Спасибо

Ответить

Номер ответа: 7
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #7 Добавлено: 30.08.06 20:32
Павел, ещё вопросик можно ?

Запрос в Аксессе выглядит так

SELECT ... FROM (SELECT ... FROM ...INNER JOIN .. WHERE ...) GROUP BY ... ORDER BY ... DESC

в MS SQL надо перед GROUP BY добавлять DERIVEDTBL

SELECT ... FROM (SELECT ... FROM ...INNER JOIN .. WHERE ...) DERIVEDTBL GROUP BY ... ORDER BY ... DESC

моя прога должна иметь возможность работы и с SQL и с Access
естественно я могу с помощью программной логики
выбирать ту или иную строку

Но Можно ли как то унифицироваться по другому ?

Заранее благодарю.

Ответить

Номер ответа: 8
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #8 Добавлено: 01.09.06 15:55
пардон скобками всё решается [DERIVEDTBL]

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам