【问题标题】:Using an update statement for Access database (VB 2008)使用 Access 数据库的更新语句 (VB 2008)
【发布时间】:2013-04-06 05:13:29
【问题描述】:

我正在尝试为我的程序创建一个更新语句,该语句将根据用户输入的数据使用 SQL 更新数据库,不幸的是,我遇到的问题是我一次只能更新一列,有时一个也不能更新工作。我知道这个功能非常基础,对攻击不是很安全,但这是我正在做的一个小项目。不幸的是,我只有基本的编程技能,所以我无法让这部分工作。如果可以提供任何帮助,将不胜感激。

Private Sub btnsave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnsave.Click

    Dim con As New OleDb.OleDbConnection

    Dim d1 As New OleDb.OleDbDataAdapter
    Dim d2 As New OleDb.OleDbDataAdapter
    Dim d3 As New OleDb.OleDbDataAdapter
    Dim d4 As New OleDb.OleDbDataAdapter
    Dim d5 As New OleDb.OleDbDataAdapter
    Dim d6 As New OleDb.OleDbDataAdapter
    Dim d7 As New OleDb.OleDbDataAdapter
    Dim d8 As New OleDb.OleDbDataAdapter
    Dim d9 As New OleDb.OleDbDataAdapter
    Dim d10 As New OleDb.OleDbDataAdapter

    Dim dt As New DataTable("Animals")

    'uses the 2010 compatible connection string
    con.ConnectionString = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source = h:\Animals.accdb"
    con.Open()

    MsgBox("UPDATE Animals SET LatinName = '" & latintxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'")
    d1 = New OleDb.OleDbDataAdapter("UPDATE Animals SET LatinName = '" & latintxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d2 = New OleDb.OleDbDataAdapter("UPDATE Animals SET LocationFound = '" & locationtxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d3 = New OleDb.OleDbDataAdapter("UPDATE Animals SET AverageHeight = '" & heighttxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d4 = New OleDb.OleDbDataAdapter("UPDATE Animals SET AverageWeight = '" & weighttxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d5 = New OleDb.OleDbDataAdapter("UPDATE Animals SET DietaryNeeds = '" & diettxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d6 = New OleDb.OleDbDataAdapter("UPDATE Animals SET ConservationStatus = '" & statustxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d7 = New OleDb.OleDbDataAdapter("UPDATE Animals SET AverageLifeSpan = '" & lifetxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d8 = New OleDb.OleDbDataAdapter("UPDATE Animals SET BreedingSeason = '" & breedtxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d9 = New OleDb.OleDbDataAdapter("UPDATE Animals SET AverageLength = '" & lengthtxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)
    d10 = New OleDb.OleDbDataAdapter("UPDATE Animals SET AnimalName = '" & nametxt.Text & "'" & " WHERE AnimalName = " & "'" & Form1.txtname.Text & "'", con)

    d1.Fill(dt)
    d2.Fill(dt)
    d3.Fill(dt)
    d4.Fill(dt)
    d5.Fill(dt)
    d6.Fill(dt)
    d7.Fill(dt)
    d8.Fill(dt)
    d9.Fill(dt)
    d10.Fill(dt)

    con.Close()

End Sub

【问题讨论】:

  • 是什么让您相信您“一次只能更新一个”?从您的代码的外观看来,您的印象是您一次只能更新一个 (字段)。 (提示:这根本不是真的。)
  • 对不起,我的意思是,我一次只能更新一列,例如我不能简单地将数据输入多个字段并让它们全部更新。

标签: vb.net sql-update ms-access-2010


【解决方案1】:

要执行更新命令,您可以编写一条语句并使用 OleDbCommandExecuteNonQuery 方法。

Dim cmdText As String = "UPDATE Animals SET LatinName=?,LocationFound=?,AverageHeight=?," + 
                 "AverageWeight = ?, DietaryNeeds = ?, ConservationStatus = ?, " + 
                 "AverageLifeSpan = ?, BreedingSeason = ?, AverageLength = ? " +
                 "WHERE AnimalName = ?"

Using con = new OleDbConnection("PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source = h:\Animals.accdb")
Using cmd = new OleDbCommand(cmdText, con)
    con.Open()
    cmd.Parameters.AddWithValue("@p1",latintxt.Text)
    cmd.Parameters.AddWithValue("@p2",locationtxt.Text)
    cmd.Parameters.AddWithValue("@p3",heighttxt.Text)
    cmd.Parameters.AddWithValue("@p4",weighttxt.Text)
    cmd.Parameters.AddWithValue("@p5",diettxt.Text)
    cmd.Parameters.AddWithValue("@p6",statustxt.Text)
    cmd.Parameters.AddWithValue("@p7",lifetxt.Text)
    cmd.Parameters.AddWithValue("@p8",breedtxt.Text)
    cmd.Parameters.AddWithValue("@p9",lengthtxt.Text)
    cmd.Parameters.AddWithValue("@p10",nametxt.Text)
    cmd.ExecuteNonQuery()
End Using
End Using

有几个问题需要注意,这可能会导致更新失败。
首先,所有参数值都是字符串类型,这可能是您的主要问题。如果数据库字段不是文本类型,那么您需要将这些值转换为适当的类型。
例如,如果字段AverageHeight 是数字(双精度),则参数应写为:

cmd.Parameters.AddWithValue("@p3",Convert.ToDouble(heighttxt.Text))

当然,heighttxt 中的文本应该可以转换为 double。

第二个问题是用于查找要更新的记录的参数的内容。
在您的查询中,该字段名为AnimalName,您使用Form1.txtname.Text 搜索记录,但在同一查询文本中,您尝试使用nametxt.Text 更新WHERE 子句中使用的相同字段。从逻辑上讲,这两个字段包含相同的值,因此您只需要一个参数。

最后一点要记住,在 OleDb 中,参数不是通过它们的名称来识别的,而是通过它们在命令文本中的位置来识别的。所以要注意参数添加到参数集合中的正确顺序

【讨论】:

  • 感谢您的回复,但正如我所说,我的编程技能非常基础,所以希望您不要介意我有几个问题。我将如何使用您提供的代码,我会将它集成到我自己的代码中还是简单地替换我的代码?以及 cmdText 究竟是如何工作的,它的作用是什么?
  • @user2092379 另一个注意事项:UPDATE 只会更新数据库中的现有记录,不会添加新记录。要添加新记录,您需要使用 INSERT 命令,其语法与 UPDATE 命令略有不同。
  • @user2092379,cmdText 是您的查询,没有要更新和搜索的值的字符串连接,这更好,因为占位符 (?) 将被相关参数集合中的值替换。这种替换是由更了解如何传递这些值的框架完成的(例如,文本框中的单引号可能会对字符串连接造成严重破坏)
  • @user2092379,提供的代码应该替换您的所有代码。
  • @Steve 比你的解释。我尝试使用您在我的程序中提供的代码,但我遇到了一些问题。 using 语句需要额外的括号,但我似乎无法将其放在可以解决问题的地方。 oleDbconnection 未声明,我不确定将它们声明为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多