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
相关产品推荐
相关产品推荐

