Страница: 1 |
Страница: 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-сайт:
Профиль | | #1
Добавлено: 27.09.05 17:21
В программе везде оперировать не конкретными классами, а интерфейсами.
Например, вместо OleDbConnection - IDBConnection. Создать класс,
который будет создавать объекты.
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-сайт:
Профиль | | #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-сайт:
Профиль | | #5
Добавлено: 13.10.05 12:22
у DataReader'а нет доступныз извне конктрукторов. Он создается только с помощью Command:
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]