求助:为何执行代码时出现“ExecuteReader: Connection property has not been initialized.”错误?
分析你的GetGolfer函数代码问题
兄弟,盯着代码俩小时确实容易视觉疲劳,我帮你梳理下这段代码里可能藏着的问题:
1. 严重的SQL注入风险+潜在语法错误
你直接把cboGolfer.Text拼接进SQL语句的写法,不仅会带来SQL注入漏洞(恶意输入能直接篡改你的SQL逻辑),还会因为输入中的特殊字符(比如单引号'、百分号%)导致SQL语法错误。比如用户输入O'Neil,拼接后的SQL会变成:
SELECT * FROM TGolfers where strFirstName like '%O'Neil%' or strLastName like '%O'Neil%'
这会直接触发语法错误,因为单引号被截断了。
2. 代码资源未正确释放
你的drSourceTable(DataReader)没有用Using块包裹,DataReader会一直占用数据库连接直到手动关闭,很容易导致连接泄漏,影响后续数据库操作。另外你创建了DataTable但没有把DataReader的数据加载进去,逻辑不完整。
3. 其他潜在排查点
- 确认数据库表名
TGolfers和字段名strFirstName、strLastName的拼写完全一致(部分数据库对大小写敏感); - 检查
m_conAdministrator数据库连接是否处于打开状态,ExecuteReader执行时需要连接是打开的; - 若
cboGolfer.Text为空,拼接后的SQL会变成like '%%',虽然不会报错,但可能不符合你的业务预期。
修正后的示例代码
推荐用参数化查询重构这段代码,既安全又能避免语法错误,同时正确管理资源:
Dim searchPattern As String = $"%{cboGolfer.Text}%" Dim strSelect As String = "SELECT * FROM TGolfers WHERE strFirstName LIKE ? OR strLastName LIKE ?" ' 用Using块自动释放Command、DataReader、DataTable资源 Using cmdSelect As New OleDb.OleDbCommand(strSelect, m_conAdministrator) ' OleDb参数是按位置匹配,不是按名称,所以顺序要和SQL里的占位符一致 cmdSelect.Parameters.Add(New OleDb.OleDbParameter("@FirstName", OleDbType.VarChar)).Value = searchPattern cmdSelect.Parameters.Add(New OleDb.OleDbParameter("@LastName", OleDbType.VarChar)).Value = searchPattern ' 确保连接处于打开状态 If m_conAdministrator.State = ConnectionState.Closed Then m_conAdministrator.Open() End If Using drSourceTable As OleDb.OleDbDataReader = cmdSelect.ExecuteReader() Using dt As New DataTable() dt.Load(drSourceTable) ' 这里添加你的DataTable处理逻辑,比如绑定到控件等 End Using End Using End Using
另外,建议你把具体的错误信息贴出来(比如异常提示的内容),能更快定位问题!
内容的提问来源于stack exchange,提问作者Mugen893
相关产品推荐
相关产品推荐

