You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET运行OleDb插入代码报错Parameter "@Fname" Has no default value如何解决

报错原因排查与解决方案

核心错误原因

  • 参数重复添加且存在未赋值项:代码中调用cmd.Parameters.Clear()后,先通过New OleDbParameter()添加了6个仅定义了类型、没有赋值的参数,后续又用AddWithValue()重复添加了7个带值的参数,最终参数列表共有13个参数。而OleDb驱动不按参数名匹配取值,严格按照参数的添加顺序和SQL语句中占位符的顺序一一对应,第一个被匹配的就是未赋值的@Fname参数,因此抛出无默认值的错误。
  • 参数名与占位符不统一:SQL语句中用户名、密码的占位符是@Username、@Password,但你最开始定义参数时用的是@User、@Pass,二者不匹配,即使没有重复加参数的问题也会导致赋值失败。

修复方案

删除冗余的未赋值参数定义代码,严格按照SQL语句中占位符的顺序添加带值的参数即可,推荐直接指定参数类型避免AddWithValue的自动类型推断风险,修正后的代码如下:

Sub Save()
    Try
        con = New OleDbConnection(cs)
        con.Open()
        ' 后续加参数要和此处占位符顺序严格对应
        Dim cb As String = "insert into [Data] ([Fname],[Lname],[User],[Pass],[Birthday],[Role],[Pic]) VALUES (@Fname,@Lname,@Username,@Password,@Birthday,@Role,@Pic)"
        Dim i As Integer
        cmd = New OleDbCommand(cb)
        cmd.Connection = con
        cmd.Parameters.Clear()
        
        ' 按顺序添加参数并直接赋值,删除原有冗余的未赋值参数定义
        cmd.Parameters.Add("@Fname", OleDbType.VarChar, 250).Value = txt_Fname.Text
        cmd.Parameters.Add("@Lname", OleDbType.VarChar, 250).Value = txt_Lname.Text
        cmd.Parameters.Add("@Username", OleDbType.VarChar, 250).Value = txt_User.Text
        cmd.Parameters.Add("@Password", OleDbType.VarChar, 250).Value = txt_Pass.Text
        cmd.Parameters.Add("@Birthday", OleDbType.Date).Value = CDate(Birthday.Value)
        cmd.Parameters.Add("@Role", OleDbType.VarChar, 250).Value = cb_role.Text

        ' 处理头像数据
        Dim mstream As New System.IO.MemoryStream
        Register_picture.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
        Dim picture() As Byte = mstream.GetBuffer
        mstream.Close()
        cmd.Parameters.Add("@Pic", OleDbType.Binary).Value = picture

        i = cmd.ExecuteNonQuery
        If i > 0 Then
            MsgBox("New User Register Succesfully!", vbInformation)
        Else
            MsgBox("New User Register Fail!", vbCritical)
        End If
        con.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        ' 异常时主动关闭连接避免泄漏
        If con.State = ConnectionState.Open Then con.Close()
    End Try
End Sub

内容的提问来源于stack exchange,提问作者Mark Malvar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:09:03