Конвертировать соединение с БД

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Конвертировать соединение с БД

Сообщение sergey-911 » 23.10.2008 (Чт) 10:29

Доброго времени суток уважаемые.

В одной из книжек Дэвида Сэппы написано, что автор прибегает к приему: создает "OleDb" подключение, а затем его значение присваивает "SqlClient" подключению и работает с "SqlClient" подключением вдальнейшем. К сожалению, в книге не было разобрано, как автор это делает. Разобраться самостоятельно я не смог.

Как можно конвертировать
Код: Выделить всё
System.Data.OleDb.OleDbCommand

System.Data.SqlClient.SqlDataReader

?

Возможно ли
Код: Выделить всё
        'Создание объекта Connection
        Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection
        'Поиск файла "Biblio.mdb" в текущей директории
        Dim s As String
        s = IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        'Строка подключения
        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s
        'Открытие соединения
        cn.Open()
        'Создание объекта Command
        Dim cmd As System.Data.OleDb.OleDbCommand = cn.CreateCommand()
        cmd.CommandText = "SELECT * FROM vw_ElPhones"
        'Создание объекта DataReader
        Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()

        Dim r As System.Data.SqlClient.SqlDataReader
        r = rdr   '????Как конвертировать???

?
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 23.10.2008 (Чт) 20:32

Прогибаем матрицу?

Что изображаем?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 24.10.2008 (Пт) 8:46

Sebas писал(а):Прогибаем матрицу?

Что изображаем?


Ничего не изображаю. Нужно перевести проект с БД MS SQL2005 на Access. Вот и вспомнил, что в одной из книг упомянут прием, в котором автор упомянул об универсальном коде, где SqlConnection присваивалось OdbcConnection. Код приведен не был. Сейчас сижу, ищу в книге...

Объясните плиз, как пишут приложения, которые взаимодействуэт с несколькими БД, где пользователь настраивает подключение к нужной БД?
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 24.10.2008 (Пт) 10:02

Не понятна, конечная цель.

Если просто? чтобы программа работала вместо SQL Server с Aceess, то просто поменяй все префиксы c SQL на OleDB или ODBC, ну, и, соответственно, строку подключения нужно изменить.
Возможно, придётся подправить инструкции SQL в соответствии с синтаксисом Access.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 24.10.2008 (Пт) 10:35

Конечная цель - написать универсальный код, позволяющий работать с разными БД. Возможно, я ошибаюсь...
Спасибо Sebas, скорее всего последую твоему совеу.
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 24.10.2008 (Пт) 15:16

я понял, для этого Тебе нужно реализовать Фабрику

Public Shared Function GetFactory(ByVal providerInvariantName As String) As System.Data.Common.DbProviderFactory
Member of: System.Data.Common.DbProviderFactories
Summary:
Returns an instance of a System.Data.Common.DbProviderFactory.

Parameters:
providerInvariantName: Invariant name of a provider.

Return Values:
An instance of a System.Data.Common.DbProviderFactory for a specified provider name.


из которой Ты будешь получать объекты для работы с данными.

Код: Выделить всё
     Dim f as System.Data.Common.DbProviderFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OracleClient")

     Using  cn As System.Data.Common.DbConnection = f.CreateConnection()
            ....... код подключения итд.
     End Using
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 28.10.2008 (Вт) 13:24

Sebas писал(а):я понял, для этого Тебе нужно реализовать Фабрику

Public Shared Function GetFactory(ByVal providerInvariantName As String) As System.Data.Common.DbProviderFactory
Member of: System.Data.Common.DbProviderFactories
Summary:
Returns an instance of a System.Data.Common.DbProviderFactory.

Parameters:
providerInvariantName: Invariant name of a provider.

Return Values:
An instance of a System.Data.Common.DbProviderFactory for a specified provider name.


из которой Ты будешь получать объекты для работы с данными.

Код: Выделить всё
     Dim f as System.Data.Common.DbProviderFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OracleClient")

     Using  cn As System.Data.Common.DbConnection = f.CreateConnection()
            ....... код подключения итд.
     End Using



Спасибо Sebas. Подключение работает.
Не мог бы порекомендовать ресурс (желательно русскоязычный), в котором более детально расписано реализация "Фабрики". В книге упомянуто вскользь, один абзац.
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 28.10.2008 (Вт) 13:45

А что не понятно? там же всё придельно просто. Спрашивай.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 28.10.2008 (Вт) 14:24

Спасибо Sebas.
1) Объясни плиз, что значит
Public Shared Function GetFactory(ByVal providerInvariantName As String) As System.Data.Common.DbProviderFactory
Member of: System.Data.Common.DbProviderFactories
Summary:
Returns an instance of a System.Data.Common.DbProviderFactory.

Parameters:
providerInvariantName: Invariant name of a provider.

Return Values:
An instance of a System.Data.Common.DbProviderFactory for a specified provider name.


2) Правильно ли я реализовываю фабрику?
Сделал 2-е функции
Код: Выделить всё
    Public Shared Function GetFactory _
    (ByVal providerInvariantName As String) _
    As System.Data.Common.DbProviderFactory
        Dim f As System.Data.Common.DbProviderFactory
        f = System.Data.Common.DbProviderFactories.GetFactory(providerInvariantName)
        f.CreateConnection()
        Return f
    End Function

    Public Shared Function Connection _
    (ByVal GetFactory As System.Data.Common.DbProviderFactory, ByVal ConnectionString As String) _
    As System.Data.Common.DbConnection
        Connection = GetFactory.CreateConnection()
        Connection.ConnectionString = ConnectionString
        Connection.Open()
    End Function


на форме расположил грид и 2-е кнопки(1) - Заполнить грид из Access и 2) - Заполнить грид из MS SQL)
Соответственно:
Код: Выделить всё
    Private Sub cmdAccess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAccess.Click
        'Подключение к Access
        'Создание объекта Connection
        Dim s As String
        s = IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s

        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.OleDb"), ConnectionString)

        'Создание объекта Command
        Dim cmd As System.Data.OleDb.OleDbCommand = cn.CreateCommand()
        cmd.CommandText = "SELECT * FROM vw_ElPhones"
        'Создание объекта DataReader
        Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()

        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl
        'Очистка "SqlReader"
        rdr.Close()
        rdr = Nothing
        'Очистка "tbl"
        tbl = Nothing
    End Sub

    Private Sub cmdSQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSQL.Click
        'Подключение к MS SQL
        Dim ConnectionString As String
        ConnectionString = "Data Source=.\SQLExpress;Initial Catalog=ARM69;User ID=Sa;Password=pas;Pooling=True"

        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.SqlClient"), ConnectionString)

        'Создание объекта Command
        Dim cmd As SqlClient.SqlCommand = cn.CreateCommand()
        cmd.CommandText = "Select * From vw_Personal"
        'Создание объекта DataReader
        Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()

        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl
        'Очистка "SqlReader"
        rdr.Close()
        rdr = Nothing
        'Очистка "tbl"
        tbl = Nothing
    End Sub

==> вызов функции подключения происходит:
Код: Выделить всё
        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.OleDb"), ConnectionString)

или
Код: Выделить всё
        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.SqlClient"), ConnectionString)

3) Все-равно, при объявлении DataReader(а), пишу для каждого провайдера данных по разному:
'Создание объекта DataReader в Access
Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()
'Создание объекта DataReader в MS SQL
Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()
Анологично обстоит дело и с объектом Command
Можно ли и к объектам DataReader и Command также применить фабрику?

В книжке сказано, что ProvidederFactory - новый класс в ADO.NET 2.0, действующий как фабрика объектов. Каждый класс ProvidederFaktory предлагает метод Create, в котором создаются объекты Connection, ConnectionStringBuilder, Command, Parameter, DataAdapter и CommandBuilder. Больше про фабрику ничего не написано, не примеров, ни доп. комментариев. Получается к объекту "DataReader" фабрику применить нельзя?
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 28.10.2008 (Вт) 16:09

sergey-911 писал(а):Спасибо Sebas.
1) Объясни плиз, что значит
Public Shared Function GetFactory(ByVal providerInvariantName As String) As System.Data.Common.DbProviderFactory
Member of: System.Data.Common.DbProviderFactories
Summary:
Returns an instance of a System.Data.Common.DbProviderFactory.

Parameters:
providerInvariantName: Invariant name of a provider.

Return Values:
An instance of a System.Data.Common.DbProviderFactory for a specified provider name.


2) Правильно ли я реализовываю фабрику?
Сделал 2-е функции
Код: Выделить всё
    Public Shared Function GetFactory _
    (ByVal providerInvariantName As String) _
    As System.Data.Common.DbProviderFactory
        Dim f As System.Data.Common.DbProviderFactory
        f = System.Data.Common.DbProviderFactories.GetFactory(providerInvariantName)
        f.CreateConnection()
        Return f
    End Function

    Public Shared Function Connection _
    (ByVal GetFactory As System.Data.Common.DbProviderFactory, ByVal ConnectionString As String) _
    As System.Data.Common.DbConnection
        Connection = GetFactory.CreateConnection()
        Connection.ConnectionString = ConnectionString
        Connection.Open()
    End Function


на форме расположил грид и 2-е кнопки(1) - Заполнить грид из Access и 2) - Заполнить грид из MS SQL)
Соответственно:
Код: Выделить всё
    Private Sub cmdAccess_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAccess.Click
        'Подключение к Access
        'Создание объекта Connection
        Dim s As String
        s = IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s

        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.OleDb"), ConnectionString)

        'Создание объекта Command
        Dim cmd As System.Data.OleDb.OleDbCommand = cn.CreateCommand()
        cmd.CommandText = "SELECT * FROM vw_ElPhones"
        'Создание объекта DataReader
        Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()

        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl
        'Очистка "SqlReader"
        rdr.Close()
        rdr = Nothing
        'Очистка "tbl"
        tbl = Nothing
    End Sub

    Private Sub cmdSQL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSQL.Click
        'Подключение к MS SQL
        Dim ConnectionString As String
        ConnectionString = "Data Source=.\SQLExpress;Initial Catalog=ARM69;User ID=Sa;Password=pas;Pooling=True"

        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.SqlClient"), ConnectionString)

        'Создание объекта Command
        Dim cmd As SqlClient.SqlCommand = cn.CreateCommand()
        cmd.CommandText = "Select * From vw_Personal"
        'Создание объекта DataReader
        Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()

        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl
        'Очистка "SqlReader"
        rdr.Close()
        rdr = Nothing
        'Очистка "tbl"
        tbl = Nothing
    End Sub

==> вызов функции подключения происходит:
Код: Выделить всё
        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.OleDb"), ConnectionString)

или
Код: Выделить всё
        Dim cn As System.Data.Common.DbConnection
        cn = Connection(GetFactory("System.Data.SqlClient"), ConnectionString)

3) Все-равно, при объявлении DataReader(а), пишу для каждого провайдера данных по разному:
'Создание объекта DataReader в Access
Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader()
'Создание объекта DataReader в MS SQL
Dim rdr As SqlClient.SqlDataReader = cmd.ExecuteReader()
Анологично обстоит дело и с объектом Command
Можно ли и к объектам DataReader и Command также применить фабрику?

В книжке сказано, что ProvidederFactory - новый класс в ADO.NET 2.0, действующий как фабрика объектов. Каждый класс ProvidederFaktory предлагает метод Create, в котором создаются объекты Connection, ConnectionStringBuilder, Command, Parameter, DataAdapter и CommandBuilder. Больше про фабрику ничего не написано, не примеров, ни доп. комментариев. Получается к объекту "DataReader" фабрику применить нельзя?


1. см п2
2. Public Shared Function GetFactory ... - зачем тупо упаковывать медод из FW ?
Public Shared Function Connection _ - ну, да, только открывать (.Open) тут не надо, в коде открое, кады надо.

Dim rdr As System.Data.OleDb.OleDbDataReader = cmd.ExecuteReader() - какое ,нах, OleDb?!?!?!? Какой ,нах, SQLClient?!?!?! Забудь про эти префиксы! МЫ что делаем, Забыл?
Да, и почитай про DataAdapter (я про заполнение таблицы)

3.
Public MustInherit Class DbDataReader
Inherits System.MarshalByRefObject
Member of: System.Data.Common
Summary:
Reads a forward-only stream of rows from a data source.

фабрика выдаёт команд, а ридер ты из неё получаешь

---------------------------------------------

да, и вопросы скопом не вываливай, а то ответов не поймёшь
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 28.10.2008 (Вт) 17:16

Спасибо Sebas, весьма конструктивно! :eye:
Код: Выделить всё
        Dim CONNSTRING As String
        CONNSTRING = "Data Source=.\SQLExpress;Initial Catalog=ARM69;User ID=Sa;Password=pas;Pooling=True"
        Dim SQL As String
        SQL = "Select * From vw_Personal"
        Dim provider As System.Data.Common.DbProviderFactory
        provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient")
        Dim Connection As System.Data.Common.DbConnection
        Connection = provider.CreateConnection()
        Connection.ConnectionString = CONNSTRING
        Connection.Open()
        Dim Command As System.Data.Common.DbCommand
        Command = provider.CreateCommand()
        Command.Connection = Connection
        Command.CommandText = SQL
        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(Command.ExecuteReader())
        DataGridView1.DataSource = tbl


1) Не знаю, данный вариант правильный, или нет?
2) Как все-таки объявить DataReader?
3) В чем заполнение таблицы неправильное? Таблицу использую только для отображения, не для правки. Доступ к данным, как правило только через хранимые процедуры... А объект DataReader занимает меньша=е всего ресурсов.
4)
Public MustInherit Class DbDataReader
Inherits System.MarshalByRefObject
Member of: System.Data.Common
Summary:
Reads a forward-only stream of rows from a data source.
---------
Не понимаю, что в целом означают эти записи, прошу прощение за тупость.
в частности непонятно
--------
Public MustInherit Class DbDataReader
Member of: System.Data.Common
Summary:
Reads a forward-only stream of rows from a data source.
--------
5) Посмотрел пример на си http://www.aspnetdev.de/glossar/alle/743/DbProviderFactory.aspx
Попробовал на BV.NET, столкнулся с проблемой:
adapter.Connection = connection

------------------------------
Извини, что вопросы скопом, не стал плодить кучу топиков.
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 28.10.2008 (Вт) 17:22

Огромное человеческое спасибо Sebas.
Вот, что получилось:
Код: Выделить всё
        'Для MS SQL
        Dim CONNSTRING As String
        CONNSTRING = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=.\SQLExpress"
        Dim SQL As String
        SQL = "Select * from Employees"
        Dim provider As System.Data.Common.DbProviderFactory
        provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient")
        Dim Connection As System.Data.Common.DbConnection
        Connection = provider.CreateConnection()
        Connection.ConnectionString = CONNSTRING
        Connection.Open()
        Dim Command As System.Data.Common.DbCommand
        Command = provider.CreateCommand()
        Command.Connection = Connection
        Command.CommandText = SQL
        Dim rdr As System.Data.Common.DbDataReader
        rdr = Command.ExecuteReader()
        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl


Код: Выделить всё
        'Для MS Access
        Dim CONNSTRING As String
        Dim s As String
        s = IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s
        CONNSTRING = ConnectionString
        Dim SQL As String
        SQL = "SELECT * FROM vw_ElPhones"
        Dim provider As System.Data.Common.DbProviderFactory
        provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OleDb")
        Dim Connection As System.Data.Common.DbConnection
        Connection = provider.CreateConnection()
        Connection.ConnectionString = CONNSTRING
        Connection.Open()
        Dim Command As System.Data.Common.DbCommand
        Command = provider.CreateCommand()
        Command.Connection = Connection
        Command.CommandText = SQL
        Dim rdr As System.Data.Common.DbDataReader
        rdr = Command.ExecuteReader()
        'Загрузка таблицы
        Dim tbl As New DataTable()
        tbl.Load(rdr)
        DataGridView1.DataSource = tbl


Буду признателен за комментарии... :D
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 28.10.2008 (Вт) 17:42

не забываем Dispose `ить объекты!


Код: Выделить всё
            'Для MS SQL
            Dim CONNSTRING As String
            CONNSTRING = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=.\SQLExpress"

            Dim SQL As String
            SQL = "Select * from Employees"

            Dim provider As System.Data.Common.DbProviderFactory
            provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient")

            Using Connection As System.Data.Common.DbConnection = provider.CreateConnection()

                Connection.ConnectionString = CONNSTRING
                Connection.Open()
                Using Command As System.Data.Common.DbCommand = provider.CreateCommand()

                    Command.Connection = Connection
                    Command.CommandText = SQL
                    Using rdr As System.Data.Common.DbDataReader = Command.ExecuteReader()

                        'Загрузка таблицы
                        Dim tbl As New DataTable()
                        tbl.Load(rdr)
                        DataGridView1.DataSource = tbl

                    End Using
                End Using
            End Using
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 29.10.2008 (Ср) 16:10

Спасибо Sebas. :D
Sebas, а если в модуле создать объект "Connection", в нужный момент его открывать (производить действие с БД), затем закрывать, а при выходе из программы диспосить? Такой подход неправильный, почему?
Может ли при таком подходе сборщик мусора убрать "Connection?"
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 29.10.2008 (Ср) 16:46

используй, глобальный конекшн. Не вопрос. Только соединение, если речь идёт о удалённом или (out of process) сервере БД, закрывай сразу после использования.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 30.10.2008 (Чт) 14:48

Столкнулся с новой проблемой - параметрические запросы при "Фабричном методе"!
Если
Код: Выделить всё
        Dim SqlQuery As String
        SqlQuery = "Select * From Personal Where PersonalID @ID"
        Dim SqlCommand As SqlClient.SqlCommand
        SqlCommand = New SqlClient.SqlCommand()
        SqlCommand.Parameters.AddWithValue("@ID", 7)
        'Выполнение параметризованного запроса
        Dim CONNSTRING As String
        CONNSTRING = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=.\SQLExpress"
        Dim SqlConnection As System.Data.SqlClient.SqlConnection
        SqlConnection.ConnectionString = CONNSTRING
        SqlConnection.Open()
        SqlCommand.Connection = SqlConnection
        SqlCommand.CommandText = SqlQuery
        ......

- то все работает, если применить фабричный метод
Код: Выделить всё
        Dim SqlQuery As String
        SqlQuery = "Select * From Personal Where PersonalID @ID"
        Dim provider As System.Data.Common.DbProviderFactory
        provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OleDb")
        Dim Connection As System.Data.Common.DbConnection
        Connection = provider.CreateConnection()
        Connection.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
        IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        Connection.Open()
        Dim Command As System.Data.Common.DbCommand
        Command = provider.CreateCommand()
        'Здесь ошибка
        Command.Parameters.AddWithValue("@ID", 7)
        'Выполнение параметризованного запроса
        Command.Connection = Connection
        Command.CommandText = SqlQuery
        ........

, то в записи Command.Parameters.AddWithValue("@ID", 7) сразу ошибка, если не ошибаюсь, то "метод AddWithValue" не может быть использован.

Как обойти ошибку и выполнить параметризованный запрос (либо хранимую процедуру) при фабричном методе???
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 31.10.2008 (Пт) 0:50

Доброго времени суток уважаемые. У кого есть идеи, как прии реализации "Фабрики" подключений передавать параметры хранимой процедуре. Плиз, очень надо. Sebas, на тебя надежда! :roll:
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 31.10.2008 (Пт) 16:19

Правильный ли код?
Код: Выделить всё
        Dim SqlQuery As String
        SqlQuery = "Select * From vw_ElPhones Where Улица = @Street And ФИО = @Fio"
        Dim provider As System.Data.Common.DbProviderFactory
        provider = System.Data.Common.DbProviderFactories.GetFactory("System.Data.OleDb")
        Dim Connection As System.Data.Common.DbConnection
        Connection = provider.CreateConnection()
        Connection.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
        IO.Path.Combine(Application.StartupPath, "TelSpr.mdb")
        Connection.Open()
        Dim Command As System.Data.Common.DbCommand
        Command = provider.CreateCommand()

        'Параметр 1
        Dim Parameter As System.Data.Common.DbParameter
        Parameter = provider.CreateParameter()
        Parameter.ParameterName = "@Street"
        Parameter.DbType = DbType.AnsiString
        Parameter.Value = "Николаева"
        'Параметр 2
        Command.Parameters.Add(Parameter)
        Parameter = provider.CreateParameter()
        Parameter.ParameterName = "@Fio"
        Parameter.DbType = DbType.AnsiString
        Parameter.Value = "Самохин С И"
        Command.Parameters.Add(Parameter)

        'Выполнение параметризованного запроса
        Command.Connection = Connection
        Command.CommandText = SqlQuery
        Using rdr As System.Data.Common.DbDataReader = Command.ExecuteReader()
            'Загрузка таблицы
            Dim tbl As New DataTable()
            tbl.Load(rdr)
            DataGridView1.DataSource = tbl
        End Using


В частности, меня интересует, как правильно передать параметры (формируются в коде, число их заранее неизвестно) запросу. Поступил так:
Код: Выделить всё
        'Параметр 1
        Dim Parameter As System.Data.Common.DbParameter
        Parameter = provider.CreateParameter()
        Parameter.ParameterName = "@Street"
        Parameter.DbType = DbType.AnsiString
        Parameter.Value = "Николаева"
        'Параметр 2
        Command.Parameters.Add(Parameter)
        Parameter = provider.CreateParameter()
        Parameter.ParameterName = "@Fio"
        Parameter.DbType = DbType.AnsiString
        Parameter.Value = "Самохин С И"
        Command.Parameters.Add(Parameter)


Есть ли еще способ при реализации фабрики?
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 03.11.2008 (Пн) 1:39

Ну, параметр можно создать ещё и из команды.

Тут другая проблема, а именно ИМЯ ПАРАМЕТРА.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Re: Конвертировать соединение с БД

Сообщение sergey-911 » 04.11.2008 (Вт) 14:58

Sebas писал(а):Ну, параметр можно создать ещё и из команды.

Тут другая проблема, а именно ИМЯ ПАРАМЕТРА.


Спасибо Sebas.
Напиши плиз, как создать параметр из команды?
Почему с ИМЕНЕМ параметра проблема? А если передавать параметры в строгом порядке? Понятно, что с возвращением параметра, здесь может возникнуть заморочка.
С уважением, Сергей.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Конвертировать соединение с БД

Сообщение Sebas » 04.11.2008 (Вт) 22:30

Public Function CreateParameter() As System.Data.Common.DbParameter
Member of System.Data.Common.DbCommand

впринципе, не важно откуда создавать.

Имя параметра для SQL Server @name, а для аксесс не покатит такое название
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 57

    TopList