使用VB.NET运行SQL不会产生任何输出

时间:2019-03-15 18:50:58

标签: sql vb.net

我一直在尝试创建一个可以在VB.NET中操纵Microsoft Access的程序。我已经看过/阅读过有关如何通过VB.NET运行SQL命令的教程,但是我编写的代码在运行时绝对没有变化。没有错误会提醒您,什么也不会发生。

更具体地说,我正在尝试使程序首先从程序内部在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,因此在Access 2016和Excel 2016中使用。从编程角度而言,我正在从Visual Studio 2017中使用VB.NET Framework 4.6.1。

编辑:标题问题已解决,但是现在程序引发“ 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 个答案:

答案 0 :(得分:3)

您没有运行查询。您创建了连接,将其打开,但未设置任何要运行的内容,因此它无需执行任何操作即可打开和关闭。

并使用参数而不是直接执行文本来执行查询,以避免对数据库造成任何可能的损害。无论如何,没有参数,它应该看起来像这样:

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

将其包含在Try Catch块中也不是坏主意。