Sql 尝试更新记录时收到错误

Sql 尝试更新记录时收到错误,sql,vb.net,ms-access,sqlparameter,sql-parametrized-query,Sql,Vb.net,Ms Access,Sqlparameter,Sql Parametrized Query,在我的程序中,我有一个名为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() DataAdapt

在我的程序中,我有一个名为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)
但是,单击save按钮后,runSQL函数的第7行(不包括空行,因此这是DataAdapter.Fill(DT)行)出现了一个错误,该行表示“没有为一个或多个必需参数提供值。”

我想知道是否有人知道这是为什么或者如何修复它

我确实想到的一件事是,在正在更新的表中,除了我的UPDATE语句中提到的字段之外,还有其他字段。例如,有一个名为“TeamMember”的Yes/no字段,我在update语句中没有提到它。 当使用更新函数时,我是否必须为每个字段提供值,即使是那些未更改的字段


谢谢你的阅读,希望能有所帮助

您不应该自己编写SQL查询。创建参数化查询或使用存储过程更容易、更安全(要避免SQL注入)。然后通过pasing查询或存储过程名称和参数值来执行它

此外,通过这种方式,您不必考虑特定值的正确格式。例如,如何设置日期格式?还有,如何设置布尔值的格式?您的查询最有可能出现的问题是您试图为
Smoker
列设置的
false
true
值,因为在TSQL中,这是一个位值,只能是
0
1

选中此项可查看使用参数的示例:(单击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 

请注意,您可以以不同的方式执行该命令,具体取决于您是否需要简单地执行该命令,或者获得一个标量值或完整的数据集。

老实说,我不知道。我只是在学校学习VisualBasic,我被告知要使用SQL部分,而不是教他们。你有没有看过所有代码生成的SQL语句?这将是第一件要做的事情,看看它是否是你所期望的。如果您看过,请告诉我们您看到了什么。UPDATE UserRecords set FirstName='Dave',LastName='Smith',Smoker=false,Weight=55,Gender='m',其中UserName='Dave1'runSQL函数看起来像是用于选择行并放入数据表的函数。您正在运行的sql是更新而不是选择。该命令只会返回受影响的行数,而不是可以插入数据表的数据行。我的老师向我们提供了帮助表PDF,这是他说要使用的,但与向数据库添加用户时相同,我现在学的是物理,不是计算机,但我会在电脑上再次检查代码。当我向数据库中添加用户时,我使用代码:(不管怎样,我认为注释不允许我将其粘贴并很好地格式化),但当添加用户时,我在access中的“是/否”列中使用的是或否,它可以用于添加,所以我假设它可以用于编辑我在这里使用代码的程序中的其他地方:(不确定站点上是否允许使用pastebin,但我不认为我可以在注释中正确设置代码格式),使用SQL函数,并使用true作为它的值,效果很好。(TeamMember与原始问题中的吸烟者相同)因此我相当确定问题出在其他地方。“我就是找不到你在哪里,”达特布鲁米说。对不起,我没有意识到这是访问。下一步,试着正确标记你的问题。我已经更正了标签。对不起,我的错。这是我在这个网站上的第一篇帖子,我不确定这些标签是否真的应该是。我发现了这个问题,这是我以前应该看到的非常愚蠢的事情。。。结果在sqlstring中,我试图填充一个名为“LastName”的字段,但在数据库中,该字段名为“姓氏”,我觉得自己像个白痴。如何标记问题的结束?