VS2013+Access添加数据时出现Object Reference未实例化错误
解决"Object reference not set to an instance of an object"空引用异常的问题
嘿,我一眼就看出问题所在了——你只是声明了cn(OleDbConnection)和cmd(OleDbCommand)变量,但没有实际创建它们的实例(也就是没使用New关键字初始化对象)!这就是触发空引用异常的核心原因。
下面一步步帮你修复问题,同时优化代码的安全性和健壮性:
1. 核心修复:初始化连接与命令对象
你需要在使用cn和cmd之前,用New关键字创建它们的实例,同时要确保数据库连接字符串正确指向你的Access文件。
2. 强烈推荐:改用参数化查询
直接拼接文本到SQL语句里不仅有SQL注入的安全风险,还可能因为输入内容包含单引号等特殊字符导致SQL语法错误,参数化查询能完美规避这些问题。
3. 优化:用Using语句自动释放资源
Using语句可以帮你自动关闭连接、释放资源,避免因忘记关闭连接导致的数据库资源泄漏问题。
修改后的完整代码
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click ' 替换成你的Access数据库连接字符串,注意文件路径要正确 Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\YourDatabasePath\YourDatabase.accdb;" Try ' Using语句自动管理连接和命令对象的生命周期,不用手动关闭 Using cn As New OleDb.OleDbConnection(connectionString) Using cmd As New OleDb.OleDbCommand() cn.Open() cmd.Connection = cn ' 参数化SQL语句,避免字符串拼接的各种问题 cmd.CommandText = "INSERT INTO gradess (StudentNo, StudentName, StudentSection, SubjectNo1, SubjectNo2, SubjectNo3, SubjectNo4, SubjectNo5, SubjectNo6, SubjectNo7, SubjectNo8, TotalAverage) " & _ "VALUES (@StudentNo, @StudentName, @StudentSection, @SubjectNo1, @SubjectNo2, @SubjectNo3, @SubjectNo4, @SubjectNo5, @SubjectNo6, @SubjectNo7, @SubjectNo8, @TotalAverage)" ' 给每个参数赋值 cmd.Parameters.AddWithValue("@StudentNo", txtStudentNo.Text) cmd.Parameters.AddWithValue("@StudentName", lblName.Text) cmd.Parameters.AddWithValue("@StudentSection", lblSection.Text) cmd.Parameters.AddWithValue("@SubjectNo1", txtSubject1.Text) cmd.Parameters.AddWithValue("@SubjectNo2", txtSubject2.Text) cmd.Parameters.AddWithValue("@SubjectNo3", txtSubject3.Text) cmd.Parameters.AddWithValue("@SubjectNo4", txtSubject4.Text) cmd.Parameters.AddWithValue("@SubjectNo5", txtSubject5.Text) cmd.Parameters.AddWithValue("@SubjectNo6", txtSubject6.Text) cmd.Parameters.AddWithValue("@SubjectNo7", txtSubject7.Text) cmd.Parameters.AddWithValue("@SubjectNo8", txtSubject8.Text) ' 如果TotalAverage是数值类型,建议转换为对应类型,比如CDbl(lblTotalAverage.Text) cmd.Parameters.AddWithValue("@TotalAverage", lblTotalAverage.Text) cmd.ExecuteNonQuery() refreshlist() disablebutton() MsgBox("Successfully Added!!", vbInformation, "Successful") clear() End Using End Using Catch ex As Exception ' 捕获更详细的错误信息,方便排查 MessageBox.Show($"错误提示:{ex.Message}" & vbCrLf & $"详细错误:{ex.ToString()}") End Try End Sub
额外检查点
- 确认所有控件(比如
txtStudentNo、lblName等)都正确添加到窗体上,没有拼写错误 - 验证连接字符串中的数据库路径是否正确,Access文件是否存在且没有被其他程序占用
- 如果
TotalAverage字段是数值类型,要确保lblTotalAverage.Text可以正确转换为对应数值(比如用CDbl(lblTotalAverage.Text))
内容的提问来源于stack exchange,提问作者Adrian Adriano
相关产品推荐
相关产品推荐

