#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
в базе данных.