2015-02-23 47 views
2

在我的节目,我有名为runSQL函数时的错误,那就是:接收试图更新记录

Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TrainingLog.accdb") 
    Dim DT As New DataTable 
    Dim DataAdapter As OleDb.OleDbDataAdapter 

    Connection.Open() 
    DataAdapter = New OleDb.OleDbDataAdapter(query, Connection) 
    DT.Clear() 
    DataAdapter.Fill(DT) 
    Connection.Close() 
    Return DT 

我试图在使用更新字符串数据库更新记录,从这个源代码:

Dim sqlString As String 

    sqlString = "UPDATE UserRecords set FirstName = '" & txtName.Text 
    sqlString = sqlString & "', LastName = '" & txtSurname.Text 

    If ChkSmoker.Checked = True Then 
     sqlString = sqlString & "', Smoker = true" 
    ElseIf ChkSmoker.Checked = False Then 
     sqlString = sqlString & "', Smoker = false" 
    End If 

    sqlString = sqlString & ", Weight = " & txtWeight.Text 

    If RdoMale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'm'" 
    ElseIf RdoFemale.Checked = True Then 
     sqlString = sqlString & ", Gender = 'f'" 
    End If 

    sqlString = sqlString & " WHERE UserName = '" & LstUsers.SelectedItem.ToString & "'" 

    runSQL(sqlString) 

然而,一旦我点击保存按钮,我从runSQL功能的7号线的错误(不包括空行,所以这是DataAdapter.Fill方法(DT)线)说: “没有给出一个或多个必需参数的值。”

我想知道是否有人知道这是为什么或如何解决它。

我确实想到的一件事是,在更新的表中,除UPDATE语句中提到的字段外,还有其他字段。例如,有一个标题为“TeamMember”的是/否字段,我在更新声明中没有提及。 当使用更新功能时,我是否必须为每个字段提供值,即使那些没有更改?

感谢您的阅读,并希望有所帮助!

+0

您使用TSQL吗? – Hockenberry 2015-02-23 07:13:38

+0

老实说我不知道​​。我刚刚在学校学习Visual Basic,并且我已经被告知要使用的SQL部分,而不是教给他们。 – DatBrummie 2015-02-23 07:16:07

+0

您是否真的看过所有代码生成的SQL语句?这将是首先要做的,看看它是否是你期望的。如果你看过,请告诉我们你看到了什么。 – jmcilhinney 2015-02-23 07:19:06

回答

0

你不应该自己编写SQL查询。它非常简单和安全(用于强化SQL注入)来创建参数化查询或使用存储过程。然后通过放置查询或存储过程名称和参数值来执行它。

此外,用这种方法,您不必考虑正确的格式对于特定的值是什么。例如,你如何格式化日期?而且,如何格式化布尔值?大多数情况下,您的查询的问题是您尝试为Smoker列设置的值为falsetrue,因为在TSQL中这是一个比特值,并且只能是01

选中此项可查看使用参数的示例:ADO.NET Code Examples(单击VB标签在VB中查看它)。您会看到,您在查询中定义了一个参数,指定一个名称前缀为@的前缀,然后您只需为查询中的每个参数传递一个值,并且它将以正确的格式传递给服务器,而无需关心的。

从样品的一个措施:

Dim queryString As String = _ 
     "SELECT ProductID, UnitPrice, ProductName from dbo.Products " _ 
     & "WHERE UnitPrice > @pricePoint " _ 
     & "ORDER BY UnitPrice DESC;" 
Dim command As New SqlCommand(queryString, connection) 
command.Parameters.AddWithValue("@pricePoint", paramValue) 

'' command.ExecuteXXX 

请注意,您可以用不同的方式执行命令,根据您的需要简单地执行,或得到一个标值或全部数据集作为结果。

+0

当我添加一个用户到数据库,虽然,我使用的代码︰(nevermind,评论我不认为会允许我粘贴和格式很好)但添加用户时,真或错误是我用于访问中的是/否列,它用于添加,所以我认为它可以编辑 – DatBrummie 2015-02-23 10:58:10

+0

在程序的其他地方,我在这里使用了代码:http://pastebin.com/qPwW2zTw(不是当然,如果pastebin被允许在网站上,但我不会我可以在注释中正确地格式化代码)并且工作正常,使用SQL函数,并使用true作为它的值。 (TeamMember的复选框与原始问题中的吸烟者相同),所以我相当确定问题在于其他地方。我只是找不到 – DatBrummie 2015-02-23 13:50:33

+0

你是wirgt,@DatBrummie。对不起,我没有意识到它是Access。 Nexttiem,试着标记你的问题。我已更正了标签。 – JotaBe 2015-02-23 20:19:01