2017-03-31 138 views
0

我正在尝试对Access 2016数据库进行简单更新。我正在使用Visual Studio/VB.net。我已经能够以不同的形式做到这一点,没有问题使用相同类型的编码(这是非常基本的,这是一个学校项目,但不再是)。我曾尝试使用更新表适配器两种不同的方式做到这一点...,例如:使用Visual Studio 2015更新Access数据库 - VB.net

  MediatorsListTableAdapter.UpdateMediators(MediatorIDTextBox.Text, MediatorNameTextBox.Text, MaskedTextBox1.Text, MaskedTextBox2.Text, DateTimePicker1.Value, 
      AvailabilityTextBox.Text, EmailTextBox.Text) 

使用方法,我总是得到notImplemented抛出异常,即使我已经使用了类似类型的适配器别处。我也尝试过使用过紧的方法(我知道,不理想):

saveInfo = "UPDATE mediatorsList(mediatorName, email, mediatorPrimaryPhone, mediatorSecondaryPhone, lastMediationDate, availability) 
       VALUES('" & MediatorNameTextBox.Text & "','" & EmailTextBox.Text & "','" & MaskedTextBox1.Text & "','" & MaskedTextBox2.Text & "', 
      '" & DateTimePicker1.Value & "','" & AvailabilityTextBox.Text & "', WHERE mediatorID = '" & MediatorIDTextBox.Text & "') " 

但这种方法让我语法错误的UPDATE语句错误。我再次在别处使用这种方法,没有任何问题。下面我将发布此表单的所有代码。

Imports System.Data 
Imports System.Data.Odbc ' Import ODBC class 
Imports System.Data.OleDb 
Imports System.Data.SqlClient 

Public Class editMediators 

Dim NewData As Boolean 
Dim objConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ECRDatabase.accdb") 


' create functions for save or update 
Private Sub runAccessSQL(ByVal sql As String) 
    Dim cmd As New OleDbCommand 
    connect() ' open our connection 
    Try 
     cmd.Connection = conn 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = sql 
     cmd.ExecuteNonQuery() 
     cmd.Dispose() 
     conn.Close() 
     MsgBox("Data Has Been Saved !", vbInformation) 
    Catch ex As Exception 
     MsgBox("Error when saving data: " & ex.Message) 
    End Try 
End Sub 

Private Sub editMediators_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    Me.MediatorsListTableAdapter.Fill(Me.ECRDatabaseDataSet.mediatorsList) 'loads current mediator information 
    DateTimePicker1.Value = Today() 

End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'update button 
    NewData = True 
    alertMsgBox2() 

End Sub 

Private Sub alertMsgBox2() 

    Select Case MsgBox("Yes: Saves Changes," & vbNewLine & 
      "No: Exits the mediator update window without saving," & vbNewLine & 
      "Cancel: Returns to the mediator update window.", MsgBoxStyle.YesNoCancel, "Update Mediator Information") 
     Case MsgBoxResult.Yes 

      MediatorsListBindingSource.EndEdit() 
      updateMediator() 

     'intentionally commented out     
     'MediatorsListTableAdapter.UpdateMediators(MediatorIDTextBox.Text, MediatorNameTextBox.Text, MaskedTextBox1.Text, MaskedTextBox2.Text, DateTimePicker1.Value, 
      'AvailabilityTextBox.Text, EmailTextBox.Text) 

      ' Me.Close() 

     Case MsgBoxResult.No 
      MediatorsListBindingSource.CancelEdit() 
      Me.Close() 
    End Select 

End Sub 

Private Sub updateMediator() 
    Dim saveInfo As String 
    If NewData Then 
     Dim Message = MsgBox("Are you sure you want to update mediator information? ", vbYesNo + vbInformation, "Information") 
     If Message = vbNo Then 
      Exit Sub 
     End If 
     Try 
      'Update mediator information 
      saveInfo = "UPDATE mediatorsList(mediatorName, email, mediatorPrimaryPhone, mediatorSecondaryPhone, lastMediationDate, availability) 
       VALUES('" & MediatorNameTextBox.Text & "','" & EmailTextBox.Text & "','" & MaskedTextBox1.Text & "','" & MaskedTextBox2.Text & "', 
      '" & DateTimePicker1.Value & "','" & AvailabilityTextBox.Text & "', WHERE mediatorID = '" & MediatorIDTextBox.Text & "') " 
     Catch ex As Exception 
     End Try 

    Else 
     Exit Sub 

    End If 
    runAccessSQL(saveInfo) 

End Sub 

很明显我缺少一些东西,虽然我不确定它是否缺少代码。我检查了我的数据库字段,并将它们设置为字符串/文本字段,以查看是否可以使其工作。有一次,我有两个电话号码字段被设置为错误的数据类型,所以您只能按照int32的要求输入一个数字。实际上我有几个月前使用这些方法之一来处理/更新数据库,但是我无法弄清楚以后发生了什么。我知道Visual Studio给了我一些可能贡献的问题,但是记住发生的事情太长了。

我很遗憾还有其他的尝试,因为这似乎应该以某种方式工作。任何想法看什么和/或尝试?希望我能指出正确的方向。

谢谢:)

+1

那么,正在执行的'UPDATE'语句是什么?显然它有一个语法错误。请注意,这段代码对SQL注入是开放的,所以你基本上盲目地执行*作为代码*你的用户发送给你的任何值。看起来像一个或多个这些值是无效的语法。 (希望这些值都不会是恶意的,甚至是偶然的。你可能想看看参数化查询来解决这个问题。) – David

回答

0

你的更新语句是不正确的WHERE子句是VALUES()内的部分,应该是后。

试试这个: (编辑)

saveInfo = "UPDATE mediatorsList SET mediatorName='" & _ 
    MediatorNameTextBox.Text & "', email='" & EmailTextBox.Text & "', .... WHERE " & _ 
    mediatorID = '" & MediatorIDTextBox.Text & "'" 

此外,一定要正确处理日期。我通常强制格式化为yyyy/mmm/dd格式。

+1

不应该是UPDATE mediatorsList SET mediatorName = ... WHERE ... '(加上应参数化,如上面注释中所述)? – Mark

+0

PLus在WHERE之前的外部逗号 – peterG

+0

PLUS将日期转换为文本 – Plutonix