SP! Как правильно выполнить в VB.NET?

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

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

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

SP! Как правильно выполнить в VB.NET?

Сообщение sergey-911 » 02.06.2008 (Пн) 20:58

Доброго времени суток уважаемые.
Прошу прощение за беспокойство.
Хочу узнать:
1) Правильно ли я выполняю хранимую процедуру sp_login, возвращающую данные пользователя? Код запуска процедуры взят из форума и из MSDN. Получилось, что-то среднее:
Код: Выделить всё

        'Объявление подключения
        Dim SQLcon As SqlClient.SqlConnection
        SQLcon = New SqlClient.SqlConnection
        'Объявление команды
        Dim SQLcom As SqlClient.SqlCommand
        SQLcom = New SqlClient.SqlCommand
        'Объявление параметра
        Dim P As SqlClient.SqlParameter
        'Строка подключения
        SQLcon.ConnectionString = "Server=(local)\SQLEXPRESS;uid=Sa;pwd=Password;database=MyDB"
        'Подключение запроса
        SQLcom.Connection = SQLcon
        'Запрос к БД
        SQLcom.CommandType = CommandType.StoredProcedure
        SQLcom.CommandText = "sp_login"
        'Параметр "@Log"
        SQLcom.Parameters.Add("@Log", SqlDbType.NVarChar).Value = "Log1"
        'Параметр "@Pas"
        SQLcom.Parameters.Add("@Pas", SqlDbType.NVarChar).Value = "Pas1"
        'Подключение
        SQLcon.Open()
        'Выполнение запроса
        SQLcom.ExecuteNonQuery()
        'Отключение
        SQLcon.Close()
        SQLcon = Nothing
        SQLcom = Nothing

2) Как правильно получить данные хранимой процедуры:
Соответственно
Код: Выделить всё

        'Вывод результата
        MsgBox("Result = " & CStr(SQLcom("ID_Personal")) & "", MsgBoxStyle.OkOnly, "Connect")

выдает ошибку, впрочем, как и конструкция
Код: Выделить всё

        'Выполнение запроса
        Dim DR As SqlClient.SqlDataReader
        DR = SQLcom.ExecuteReader()
        'Вывод результата
        MsgBox("Result = " & CStr(DR("ID_Personal")) & "", MsgBoxStyle.OkOnly, "Connect")

3) Есть ли разница в передачи параметров процедуре способами:
а)
Код: Выделить всё

        'Параметр "@Log"
        SQLcom.Parameters.Add("@Log", SqlDbType.NVarChar).Value = "Log1"
        'Параметр "@Pas"
        SQLcom.Parameters.Add("@Pas", SqlDbType.NVarChar).Value = "Pas1"

и
б)
Код: Выделить всё

        'Параметр "@Log"
        P = New SqlClient.SqlParameter
        P.ParameterName = "@Log"
        P.SqlDbType = SqlDbType.NVarChar
        P.Direction = ParameterDirection.Input
        P.Value = "Log1"
        SQLcom.Parameters.Add(P)
        'Параметр "@Pas"
        P = New SqlClient.SqlParameter
        P.ParameterName = "@Pas"
        P.SqlDbType = SqlDbType.NVarChar
        P.Direction = ParameterDirection.Input
        P.Value = "Pas1"
        SQLcom.Parameters.Add(P)

?
4)
Разъясните плиз смысл
Код: Выделить всё

SQLcom.Connection = SQLcon

без которой
Код: Выделить всё

SQLcom.ExecuteNonQuery()

не работает
Спасибо.
С уважением, Сергей.

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

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

Неужели никто не скажет, как правильно программно запустить и получить результат Stored Procedures? :cry:
Буду рад ответу на любой из пунктов. :shock:
С уважением, Сергей.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 03.06.2008 (Вт) 15:17

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

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 03.06.2008 (Вт) 17:19

Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

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

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

Nord777, спасибо большое! Очень ценный ресурс. Всем рекомендую! :D
С уважением, Сергей.

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

Сообщение sergey-911 » 06.06.2008 (Пт) 9:31

Ссылка очень интересная, но код не идет. Возможно, что-то делаю не так...
Вот еще интересный ресурс...
http://support.microsoft.com/kb/301216/ru
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.06.2008 (Пт) 15:42

вот примерчик с возвратом в xml (FOR XML в селекте):

Код: Выделить всё
    Public Function ClientSearch(ByVal Login As String) As XmlDocument
        '[dbo].[ClientSearch]()
        '@ClientId int=null,
        '@Login varchar(16)=null,
        '@Number varchar(50)=null,
        '@ContractType tinyint=0
        Dim cmd As New SqlCommand
        Dim reader As XmlReader
        Dim doc As New XmlDocument
        Dim parameters() As SqlParameter = { _
        New SqlParameter("RETURN_VALUE", SqlDbType.Int, 0, ParameterDirection.ReturnValue, False, 0, 0, Nothing, DataRowVersion.Current, Nothing), _
        New SqlParameter("@ClientId", SqlDbType.Int, 0, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, Nothing), _
        New SqlParameter("@Login", SqlDbType.VarChar, 16, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, Login), _
        New SqlParameter("@Number", SqlDbType.VarChar, 50, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, Nothing), _
        New SqlParameter("@ContractType", SqlDbType.TinyInt, 0, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, Nothing) _
        }

        cmd.CommandText = "sys_ClientSearch"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Connection = GetConnect()
        cmd.Parameters.AddRange(parameters)
        reader = cmd.ExecuteXmlReader()
        doc.Load(reader)
        Return doc


    End Function

    Public Function GetConnect() As SqlConnection

        If con Is Nothing Then
lb_reconnect:
            con = New SqlConnection(GetConnectionString())
            con.Open()
        Else
            If con.State = Data.ConnectionState.Closed Or con.State = Data.ConnectionState.Broken Then
                GoTo lb_reconnect
            End If
        End If
        GetConnect = con

    End Function

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

Сообщение sergey-911 » 09.06.2008 (Пн) 21:14

Спасибо Konst_One большое.
Можно спросить:
1) Для чего создавать XmlReader, в чем его плюс?
Код: Выделить всё

        Dim reader As XmlReader
        Dim doc As New XmlDocument

по сравнению с
Код: Выделить всё

        Dim SqlDataSet As DataSet

2) Правильно ли использовать, в следующем виде:
Код: Выделить всё

    Private Function GetConnection() As SqlClient.SqlConnection
    'Подключение
        'Параметры подключения
        GetConnection = Nothing
        Dim sConnectionString As String
        sConnectionString = "Server=(local)\SQLEXPRESS;" & _
        "uid=Sa;pwd=Password;database=AMS"
        GetConnection = Nothing
        'GetConnection = New SqlClient.SqlConnection
        GetConnection = New SqlClient.SqlConnection(sConnectionString)
        GetConnection.Open()
    End Function



    Private Function ExecSP(ByVal SpName As String, ByVal Parameters() As SqlClient.SqlParameter) As DataSet
    'Функция выполнения хранимой процедуры
        'Вывод результата запроса храримой процедуры через SqlDataSet
        'DataSetName
        Dim sDataSetName As String
        sDataSetName = "Tbl"
        'Параметры SqlCommand
        Dim SqlCommand As SqlClient.SqlCommand
        SqlCommand = New SqlClient.SqlCommand
        SqlCommand.CommandType = CommandType.StoredProcedure
        SqlCommand.CommandText = SpName
        'Передача параметров хранимой процедуре
        SqlCommand.Parameters.AddRange(Parameters)
        'Установка соединения с источником данных
        Dim SqlConnect As SqlClient.SqlConnection
        SqlConnect = GetConnection()
        'Подключение SQL операции к соединению
        SqlCommand.Connection = SqlConnect
        'Объект "DataAdapter", обеспечивающий связь между
        'источником данных и объектом "DataSet"
        Dim SqlDataAdapter As SqlClient.SqlDataAdapter
        SqlDataAdapter = New SqlClient.SqlDataAdapter
        SqlDataAdapter.SelectCommand = (SqlCommand)
        'Перед загрузкой данных необходимо создать объект "DataSet"
        'Имя может содержать различные таблицы
        ExecSP = New DataSet
        ExecSP.DataSetName = sDataSetName
        'Метод "FillSchema" загружает все доступные метаданные о конкретной таблице
        SqlDataAdapter.FillSchema(ExecSP, SchemaType.Source, sDataSetName)
        'Метод "Fill" загружает непосредственно данные
        SqlDataAdapter.Fill(ExecSP, sDataSetName)
        'Метод "AddWithKey" загружает информацию о первичных ключах
        SqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
        SqlDataAdapter.Fill(ExecSP, sDataSetName)
    End Function


    Private Sub cmdFunction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFunction.Click
    'Заполнение грида при щелчке кнопки "cmdFunction"
        Dim SqlDataSet As DataSet
        'Объявление параметров хранимой процедуры
        Dim parameters() As SqlClient.SqlParameter = { _
        New SqlClient.SqlParameter("@Log", SqlDbType.NVarChar, 30, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, "Log1"), _
        New SqlClient.SqlParameter("@Pas", SqlDbType.NVarChar, 30, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, "Pas1") _
        }
        'Выполнение хранимой процедуры
        SqlDataSet = ExecSP("sp_login", parameters)
        'Вы можете использовать данное имя при обращении к определенной таблице
        Dim tblAuthors As DataTable
        tblAuthors = SqlDataSet.Tables(SqlDataSet.DataSetName)
        'Заполняем грид
        DataGridView1.DataSource = SqlDataSet.Tables(SqlDataSet.DataSetName)
    End Sub


3) Есть ли разница при передаче параметра, между
Код: Выделить всё

        'Объявление параметров хранимой процедуры
        Dim parameters() As SqlClient.SqlParameter = { _
        New SqlClient.SqlParameter("@Log", SqlDbType.NVarChar, 30, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, "Log1"), _
        New SqlClient.SqlParameter("@Pas", SqlDbType.NVarChar, 30, ParameterDirection.Input, True, 0, 0, Nothing, DataRowVersion.Current, "Pas1") _
        }

и
Код: Выделить всё

        'Параметр @Log
        Dim parameter As New SqlClient.SqlParameter()
        parameter.ParameterName = "@Log"
        parameter.SqlDbType = SqlDbType.NVarChar
        parameter.Direction = ParameterDirection.Input
        parameter.Value = "Log1"
        SqlCommand.Parameters.Add(parameter)
        'Параметр @Pas
        Dim parameter1 As New SqlClient.SqlParameter()
        parameter1.ParameterName = "@Pas"
        parameter1.SqlDbType = SqlDbType.NVarChar
        parameter1.Direction = ParameterDirection.Input
        parameter1.Value = "Pas1"
        SqlCommand.Parameters.Add(parameter1)
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 10.06.2008 (Вт) 11:10

xml мне был нужен для удобства работы с данными, так как хп возвращала FOR XML набор данных.
по остальным вопросам - это все возможные варианты работы, пользуйтесь.

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

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

Спасибо Konst_One.
С уважением, Сергей.

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

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

Объясните плиз, для чего нужен объект
Код: Выделить всё

SqlDataAdapter

, как он взаимодействует с
Код: Выделить всё

DataSet

.
Также хотелось бы узнать про объект
Код: Выделить всё

SqlDataReader

Каким объектом воспользоваться при заполнении грида?
Хочу узнать немного глубже. В документации, в основном приведены примеры, а в книге, вообще все примеры рассмотрены с применением мастера и не строчки кода...
Прошу прощения за свой вопрос. :oops:
С уважением, Сергей.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 10.06.2008 (Вт) 19:55

sergey-911
ну это уже слишком!
читай документацию, msdn например :!:

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

Сообщение sergey-911 » 11.06.2008 (Ср) 7:23

Читаю. Нашел, рабочий пример. А почему именно так - нет. Не могу понять назначение вышеперечисленных объектов. Видимо, плохо ищу.
http://support.microsoft.com/kb/301216/ru
http://support.microsoft.com/default.aspx?scid=kb;en-us;308049
:oops:
С уважением, Сергей.

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

Сообщение sergey-911 » 11.06.2008 (Ср) 8:06

Прошу прощения за некорректные вопросы. Нашел книгу VB.NET - Библия пользователя. Она хоть и старая (2002 г.), но основные концепции доступа к данным ADO.NET, надеюсь, не изменились.
С уважением, Сергей.

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 11.06.2008 (Ср) 9:24

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

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

Сообщение sergey-911 » 11.06.2008 (Ср) 11:39

Спасибо за поддержку Рамзес.
С уважением, Сергей.


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

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

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

    TopList