Запуск SQL с VB.NET Не приводит к выводу

#sql #vb.net

#sql #vb.net

Вопрос:

Я пытался создать программу, которая может управлять Microsoft Access изнутри VB.NET. Я видел / читал руководства о том, как вы можете запускать команды SQL через VB.NET однако созданный мной код не вносит абсолютно никаких изменений при запуске. Никаких ошибок, заметьте, не возникает, просто ничего не происходит.

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

Сначала начальные строки, которые вызывают функцию:

 Private Sub ViewJanuary_Click(sender As Object, e As EventArgs) Handles ViewJanuary.Click
    ImportFileDialog.ShowDialog()
    ImportFileName = ImportFileDialog.FileName
    ImportSheet3(ImportFileName, "January")
End Sub
  

И затем фактический код для установления соединения и (в идеале) создания новой таблицы.

 Sub ImportSheet3(ByVal ImportFileName As String, ByVal Month As String)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter

        MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="   ImportFileName   ";Extended Properties='Excel 12.0';")
        MyConnection.Open()
        MyCommand = New System.Data.OleDb.OleDbDataAdapter(
        "CREATE TABLE "   Month   Convert.ToString(YearSelected)   "
        (
        ID AUTOINCREMENT PRIMARY KEY,
        Field1 VARCHAR(63),
        Field2 VARCHAR(63),
        Field3 VARCHAR(63),
        Field4 VARCHAR(63),
        Field5 VARCHAR(63),
        Field6 VARCHAR(63),
        Field7 VARCHAR(63),
        Field8 VARCHAR(63),
        Field9 VARCHAR(63),
        Field10 VARCHAR(63),
        Field11 VARCHAR(63),
        Field12 VARCHAR(63),
        Field13 VARCHAR(63),
        Field14 VARCHAR(63),
        Field15 VARCHAR(63),
        Field16 VARCHAR(63),
        Field17 VARCHAR(63),
        Field18 VARCHAR(63),
        Field19 VARCHAR(63),
        Field20 VARCHAR(63)
        );", MyConnection
        )

        MyConnection.Close()
    End Sub
  

Я боролся с этим дольше, чем хотел бы признать, но ничего не могу найти. Все вопросы, которые я нашел, похожие на этот, пытаются делать разные вещи или используют разные версии программы. Есть ли проблема с моим подключением, эта команда SQL здесь невозможна, она неправильно отформатирована, мой код просто неправильный или это что-то еще? Любая помощь была бы высоко оценена.

С точки зрения программного обеспечения я использую Office 2016, поэтому получите доступ к 2016 и Excel 2016. С точки зрения программирования я использую VB.NET Framework 4.6.1, из Visual Studio 2017.

Редактировать: Проблема с заголовком была решена, однако теперь программа выдает ошибку для ‘ExecuteNonQuery()’, сообщающую ‘Операция не поддерживается для этого типа объекта’. Новый и пересмотренный код:

 Sub ImportSheet3(ByVal ImportFileName As String, ByVal Month As String)
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Dim MyCommand As System.Data.OleDb.OleDbCommand
        Dim SQLCode As String = "CREATE TABLE "   Month   Convert.ToString(YearSelected)   "
        (
        ID AUTOINCREMENT PRIMARY KEY,
        Field1 VARCHAR(63),
        Field2 VARCHAR(63),
        Field3 VARCHAR(63),
        Field4 VARCHAR(63),
        Field5 VARCHAR(63),
        Field6 VARCHAR(63),
        Field7 VARCHAR(63),
        Field8 VARCHAR(63),
        Field9 VARCHAR(63),
        Field10 VARCHAR(63),
        Field11 VARCHAR(63),
        Field12 VARCHAR(63),
        Field13 VARCHAR(63),
        Field14 VARCHAR(63),
        Field15 VARCHAR(63),
        Field16 VARCHAR(63),
        Field17 VARCHAR(63),
        Field18 VARCHAR(63),
        Field19 VARCHAR(63),
        Field20 VARCHAR(63)
        );"

        Try
            MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="   ImportFileName   ";Extended Properties='Excel 12.0';")
            MyConnection.Open()
            MyCommand = New System.Data.OleDb.OleDbCommand(SQLCode, MyConnection)

            MyCommand.ExecuteNonQuery()

            MyCommand.Dispose()
            MyConnection.Dispose()
        Catch ex As Exception
            MessageBox.Show(ErrorToString)
        End Try
    End Sub
  

Ответ №1:

Вы не выполняете запрос. Вы создали соединение, открыли его, но ничего не настроили для запуска, поэтому оно открывается и закрывается, ничего не делая.

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

 conn = New OleDbConnection(ConnectionString)
conn.Open()
Dim tb = "table"
Dim Sql = "CREATE TABLE " amp; tb amp; ";"
Dim cmd As New OleDbCommand(Sql, conn)
cmd.ExecuteNonQuery()
cmd.Dispose()
conn.Dispose()
  

Заключить его в Try Catch блок тоже было бы неплохо.

Комментарии:

1. Было бы хорошей идеей упомянуть OleDbCommand. Метод ExecuteNonQuery . Кроме того, в этом случае параметры не могут быть использованы, хотя было бы разумно заключить имя таблицы в квадратные скобки.

2. Обновите его снова. Спасибо за разъяснение.

3. Вау, я не ожидал ответов так быстро! Теперь я вижу, что мне нужна строка для выполнения команды, однако опция ‘.ExecuteNonQuery()’ не отображается.

4. Вы используете табличный адаптер вместо команды. Измените это OleDbDataAdapter на это OleDbCommand

5. Извините, но вы пытаетесь выполнить CREATE TABLE в файле Excel? Если это так, я не думаю, что это сработает. Вы должны удалить Extended Properties='Excel 12.0'; из строки подключения и попытаться использовать CREATE TABLE в базе данных.