数据适配器更新命令导致异常

时间:2016-06-15 09:05:53

标签: sql-server vb.net oledb dataadapter

只是头了-----这不再适用于我。我通过在form.load中添加以下两行来修复它。

    cb.QuotePrefix = "["
    cb.QuoteSuffix = "]"

它为我解决了这个问题,我希望它也可以为你排序。

好的,所以,我在VB.net中有一个应用程序,作为我工作公司的培训师的调度程序。在编辑模式下(因此可以对存储信息的数据库进行更新)有许多按钮,添加和删除培训师,或者向表中添加周数。

导致我出现问题的按钮是保存/更新按钮。它中有三组命令,一组用于更新添加的列,一组用于删除列,另一组用于简单地更新其他修改后的数据。我知道这可能会更有效但是哦,我稍后会谈到它。

问题是,最后一块代码包括" da.update(ds)"这是更新数据源的数据适配器。虽然这个命令在我们连接到我们的SQL服务器的其他应用程序中运行得很好,但它在这里引起了问题。

第一个单元格值为null的任何列都会导致异常

"' 列标题前两个字符附近的语法不正确'。"

现在,我认为这个问题源于 - 由于例外 - 我使用了不正确的列名称,这是每周星期一的日期(例如2016年2月1日)所以它& #39; d在' 01'附近显示不正确的语法。在这种情况下。

但是,更改命名约定并没有像异常建议的那样解决这个问题,而且只发生在FIRST值为空的列上 - 这意味着第一个培训师现在没有计划在本周进行任何计划。

任何人都有任何关于这方面的想法,并没有涉及基本上填写这个相当大的表上的每个空?我知道这会有用,但它耗费时间,而且如果没有其他解决方案可以解决这个问题,我愿意这样做。

我在互联网上环顾四周,并没有找到与我们的确切问题相关的解决方案,所以非常感谢帮助。

如果它很重要 - 这是导致问题的功能。

Dim da As OleDbDataAdapter 'The datasets and adapters variables.
Dim da2 As OleDbDataAdapter
Public ds As DataSet = New DataSet
Public ds2 As DataSet = New DataSet


    'Connection String. Connects to the server and finds the database and table listed.
    cs = "Provider=SQLOLEDB;"
    cs &= "Server=SOFWAREDEVSQLSE\SQLEXPRESS;"
    cs &= "Database=MTS2;"
    cs &= "User Id=;" 'You don't need to see that to be fair.
    cs &= "Password=;" 'You don't need to see that to be fair.
    sql = "Select * FROM MTS2;"

    'Runs the string. Flares up a timed out error if connection could not be established.
    Try
        da = New OleDbDataAdapter(sql, cs)
        da.Fill(ds)
        da2 = New OleDbDataAdapter(sql, cs)
        da2.Fill(ds2)
    Catch ex As Exception
        MsgBox("Connection failed. Please ensure you have a suitable connection to the Training network. Otherwise, refer to helpdesk support for further assistance.")
        Me.Close()
    End Try
    dgvSchedule.DataSource = ds.Tables(0)


Private Function save()

    'Try
    ''This section reads the SQL server for column names, and adds any that are listed in the DGV, but not the database. I know its a little messy but itll do.
    Dim columnnum As Integer = -1
    Dim columname As String
    For Each column In ds.Tables(0).Columns
        columnnum = columnnum + 1
        columname = dgvSchedule.Columns(columnnum).HeaderText
        If Not ds2.Tables(0).Columns.Contains(columname) Then
            Dim SqlAddCol As String = "ALTER TABLE MTS2 ADD [" & columname.Trim() & "] nvarchar(255)"
            Using con As New OleDbConnection(cs)
                Using cmd As New OleDbCommand(SqlAddCol, con)
                    con.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using

        End If
    Next

    columnnum = -1
    For Each column In ds2.Tables(0).Columns
        columnnum = columnnum + 1
        columname = ds2.Tables(0).Columns(columnnum).ColumnName
        If Not ds.Tables(0).Columns.Contains(columname) Then
            Dim SqlDelCol As String = "ALTER TABLE MTS2 DROP COLUMN [" & columname.Trim() & "]"
            Using con As New OleDbConnection(cs)
                Using cmd As New OleDbCommand(SqlDelCol, con)
                    con.Open()
                    cmd.ExecuteNonQuery()
                End Using
            End Using
        End If
    Next

    ds2.Tables.Clear()
    da2 = New OleDbDataAdapter(sql, cs)
    da2.Fill(ds2)

    da.Update(ds) ''''' The exception is thrown here. " Incorrect syntax near '01'."
    DataTableColours()
    MessageBox.Show("Data saved successfully. New weeks and trainers added and deleted. Changed values updated.")
    'Catch
    '   MessageBox.Show("Data failed to update properly. Please ensure you are connected to the Baltic network and try again. If the problem persists, seek IT support.")
    'End Try

End Function

该函数将数据网格视图(DGVSchedule)中的值保存到服务器,方法是将DS中的当前列与其原始列(在DS2中)一起运行。然后运行Sql查询以添加或删除任何列不匹配。然后更新DS2以使用与DS相同的值。最后,调用DA.update(DS),从理论上将所有其他修改后的值更新到SQL服务器中。它反而造成了我们特殊的例外。

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

我已经解决了我遇到的问题。我通过在form.load中添加以下两行来修复它。

    cb.QuotePrefix = "["
    cb.QuoteSuffix = "]"

基本上,我现在觉得自己像个笨蛋,但这解决了这个问题。