OleDbException抛出:按钮点击方法提示未提供对应值,如何定位解决?
问题原因分析
- SQL语句拼接存在语法错误和安全风险:如果
DCNOMINATION表的NOMINATION_NO字段为字符串类型,当前拼接逻辑没有给查询值加单引号,会直接触发OLEDB语法错误;如果字段为数字类型,若TextBox1.Text输入的内容不是合法数字,同样会触发语法错误。此外直接拼接用户输入内容存在严重SQL注入风险,攻击者可构造特殊输入窃取、篡改甚至删除全量数据。 - 存在冗余的命令调用:
ExecuteNonQuery仅用于执行增删改类SQL语句,查询场景无需调用,且OleDbDataAdapter的Fill方法会自动处理命令执行逻辑,额外调用属于冗余操作,还可能引发不必要的异常。 - 数据库连接资源管理不规范:将
OleDbConnection定义为类全局成员,在ASP.NET多请求并发场景下会出现线程安全问题;同时未使用using语句自动释放资源,若代码执行中途抛出异常,连接会一直处于打开状态,引发连接泄漏。
修正后的代码
public partial class _Default : Page { // 连接串提取为常量,便于统一维护 private const string ConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\Users\micky\OneDrive\Documents\DataBase Connection Porject\DCNoms.accdb; Persist Security Info=False;"; protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { DataTable table1 = new DataTable(); // 方法内创建连接,通过using语句自动释放资源,无需手动调用Close using (OleDbConnection connection = new OleDbConnection(ConnectionString)) using (OleDbCommand command = connection.CreateCommand()) { command.CommandType = CommandType.Text; // 使用参数化查询,规避语法问题和SQL注入风险 command.CommandText = "select * from DCNOMINATION where NOMINATION_NO = ?"; // OleDB参数按顺序匹配,与参数名称无关 command.Parameters.AddWithValue("@NominationNo", TextBox1.Text); using (OleDbDataAdapter da1 = new OleDbDataAdapter(command)) { // Fill方法会自动打开、关闭连接,无需手动调用Open da1.Fill(table1); } } GridView1.DataSource = table1; GridView1.DataBind(); } }
注意:连接串中的路径
DataBase Connection Porject存在拼写错误,正确拼写应为DataBase Connection Project,如果实际路径与拼写不一致会触发连接失败异常,建议核对数据库文件路径。
内容的提问来源于stack exchange,提问作者Michael Braham
相关产品推荐
相关产品推荐

