Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

VB 2010 Express. Ошибки в работе с SQL Express

296
03 июня 2011 года
Virtuoso
331 / / 31.07.2005
Здравствуйте.
Происходят непонятные мне проблемы. Есть две процедуры. 1 - проверка соединения с БД. 2 - создание БД и таблиц. Всё делаю примитивным способом, но тем не менее...

Проверка БД:
Код:
Private Sub Проверить_соединение(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bCheck.Click
        Me.Cursor = Cursors.WaitCursor
        Dim connectionString As String
        connectionString = "Server=(local)\SQLEXPRESS;DataBase=;Integrated Security=SSPI"

        Try
            Dim connection As New SqlConnection(connectionString)
            connection.Open()
            connection.Close()
        Catch ex As Exception
            MsgBox("SQL Server не существует, или доступ запрещён", vbExclamation)
            Me.Cursor = Cursors.Default
            Exit Sub
        End Try

        connectionString = "Server=(local)\SQLEXPRESS;DataBase=DKP;Integrated Security=SSPI"

        Try
            Dim connection = New SqlConnection(connectionString)
            connection.Open()
            connection.Close()
            MsgBox("Проверка соединения выполнена.", vbInformation)
        Catch ex As Exception
            MsgBox("Невозможно открыть базу данных " & Chr(34) & tBD.Text & Chr(34), vbExclamation)
        End Try
        Me.Cursor = Cursors.Default
    End Sub


Создание БД и таблиц:
Код:
Private Sub СоздатьБД()
        Dim connectionString As String
        Dim sqlStatement As String = _
            "IF EXISTS (" & _
            "SELECT * " & _
            "FROM master..sysdatabases " & _
            "WHERE Name = 'DKP')" & vbCrLf & _
            "DROP DATABASE DKP" & vbCrLf & _
            "CREATE DATABASE DKP"

        connectionString = "Server=(local)\SQLEXPRESS;DataBase=;Integrated Security=SSPI"

        'ПРОВЕРКА SQL
        Try
            Dim connection As New SqlConnection(connectionString)
            connection.Open()
        Catch ex As Exception
            MsgBox("SQL Server не существует, или доступ запрещён", vbExclamation)
            Me.Cursor = Cursors.Default
            Exit Sub
        End Try

        'СОЗДАНИЕ БД
        Try
            Dim connection1 As New SqlConnection(connectionString)
            Dim cmd As New SqlCommand(sqlStatement, connection1)
            connection1.Open()
            cmd.ExecuteNonQuery()
            connection1.Close()
        Catch ex As Exception
            MsgBox("Невозможно создать базу данных " & Chr(34) & tBD.Text & Chr(34), vbExclamation)
            Me.Cursor = Cursors.Default
        End Try

        'СОЗДАНИЕ ТАБЛИЦ
        Dim strSQL As String
        connectionString = "Server=(local)\SQLEXPRESS;DataBase=DKP;Integrated Security=SSPI"

        Try
            Dim connection As New SqlConnection(connectionString)
            connection.Open()

            strSQL = ПараметрыТаблицы("Base")
            Dim cmd As New SqlCommand(strSQL, connection)
            cmd.ExecuteNonQuery()

            strSQL = ПараметрыТаблицы("General")
            cmd = New SqlCommand(strSQL, connection)
            cmd.ExecuteNonQuery()

            strSQL = ПараметрыТаблицы("FindAuto")
            cmd = New SqlCommand(strSQL, connection)
            cmd.ExecuteNonQuery()

            strSQL = ПараметрыТаблицы("ExcludeAuto")
            cmd = New SqlCommand(strSQL, connection)
            cmd.ExecuteNonQuery()

            strSQL = ПараметрыТаблицы("Connect")
            cmd = New SqlCommand(strSQL, connection)
            cmd.ExecuteNonQuery()

            connection.Close()

            MsgBox("База данных успешно создана/очищена.", vbInformation)
        Catch ex As Exception
            MsgBox("Невозможно открыть базу данных " & Chr(34) & tBD.Text & Chr(34), vbExclamation)
        End Try
    End Sub

Так вот:
БД НЕ СОЗДАНА!
Если:
1) После запуска программы сразу выполняю создание БД и таблиц. Всё проходит прекрасно. Затем проверка соединения выполняется прекрасно.
2) После запуска программы выполняю проверку соединения, выполняется хорошо (ну в смысле говорит, что не может открыть БД). После этого запускаю создание БД. Выдаёт ошибку при создании таблиц на строке "connection.Open()". Говорит, что неправильный логин!

БД СОЗДАНА!
Если:
1) После запуска программы сразу выполняю создание БД и таблиц (это делаю для того, чтобы очистить БД). Всё проходит прекрасно. Затем проверка соединения выполняется прекрасно.
2) После запуска программы выполняю проверку соединения, выполняется хорошо (хоть сколько раз). После этого запускаю создание БД. Выдаёт ошибку при создании БД на строке "cmd.ExecuteNonQuery()". Говорит, что БД используется!
3) После запуска программы сразу выполняю создание БД и таблиц. Всё проходит прекрасно. Затем снова запускаю создание БД. Ругается как и во втором пункте.

Что за ерунда происходит? Каких нюансов я не знаю при работе с SQL? Очень прошу помочь.

Может есть другие быстрые способы очистки БД?

Заранее благодарен!
327
07 июня 2011 года
UserNet2008
748 / / 03.04.2010
А после перезапуска редактора, тоже ругаеться на "cmd.ExecuteNonQuery()" дело в том без явного удаления объекта, объект может продолжать жить и поэтому Говорит, что БД используется!
И еще замените
СоздатьБД() , Проверить_соединение , ПараметрыТаблицы и т.д [COLOR="blue"]хотя бы на латынь[/COLOR]

P.S
Выдаёт ошибку при создании БД на строке "cmd.ExecuteNonQuery()".
В какой строке выдаёт ошибку из вашего кода выше если
[COLOR="#ff8c00"]strSQL = ПараметрыТаблицы("General")
cmd = New SqlCommand(strSQL, connection)
cmd.ExecuteNonQuery()
[/COLOR]
тогда пробуйте без [COLOR="blue"]NEW[/COLOR]
[COLOR="#2e8b57"]strSQL = ParametryTablitsy("General")
cmd = SqlCommand(strSQL, connection)
cmd.ExecuteNonQuery()
[/COLOR]

и т.д
296
07 июня 2011 года
Virtuoso
331 / / 31.07.2005
Спасибо за совет. Но это не решило проблему. В общем, просто перед drop/create БД проверяю есть ли она уже, и выполняю создание только если её нет. Try в Try-е получился) Работает нормально.
P.S.
Все dim connection и dim cmd вынес из try-ев.

А нет...... не всегда ПОЧЕМУ-ТО!!! При создании таблиц иногда не может открыть БД. Почему ИНОГДА?? понять не могу. Чо попало...
296
07 июня 2011 года
Virtuoso
331 / / 31.07.2005
Короче как я понял, ей нужно каждый раз разное время на "освобождение". К тому же не знаю кому "ей". Сделал так:
 
Код:
Do While connection.State = 0
            Try
                connection.Open()
            Catch ex As Exception
            End Try
        Loop

Иногда резко подключается и выходит, иногда может и секунд 5 крутиться. Но в конце концов открывает. Конечно нужно добавить ещё ручной выход из цикла по какому-нибудь флагу. Но способ решил оставить такой. Потому как если ставить задержку, то неизвестно на какое время... Тем более процы везде разные.
327
07 июня 2011 года
UserNet2008
748 / / 03.04.2010
[COLOR="#4169e1"]Try[/COLOR] это обработчик ошибок
Надо разобраться
[COLOR="#4169e1"]Try
[ Finally
[ finallyStatements ] ]
End Try[/COLOR]
Посмотрите здесь

Цитата:
Все dim connection и dim cmd вынес из try-ев.

А нет...... не всегда ПОРЧЕМУ-ТО!!!



Объявите на уровне формы, а не процедуры

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог