C# WinForm如何将Oracle数据库PROVA表数据加载显示到GridView
Oracle数据库绑定WinForm DataGridView代码修正
原代码存在的问题
- 命名空间引用错误:同时引用了已废弃的
System.Data.OracleClient类库,且缺少官方托管驱动的核心命名空间Oracle.ManagedDataAccess.Client - 连接字符串语法错误:末尾多写多余右括号,导致参数解析失败
OracleCommand未关联已打开的数据库连接,执行查询时会抛出异常- DataGridView的
DataSource是属性而非方法,原调用语法错误 - 未对数据库相关非托管资源做自动释放处理,存在资源泄漏风险
- 无异常捕获逻辑,数据库操作出错时会直接导致程序闪退
修正后完整代码
using System; using System.Data; using System.Windows.Forms; using Oracle.ManagedDataAccess.Client; // 仅保留官方托管驱动引用 namespace dbOracleForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void label2_Click(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { // 修正连接字符串多余右括号的问题 string connectionString = "Data Source = (DESCRIPTION = " + "(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))" + "(CONNECT_DATA = " + " (SERVER = DEDICATED) " + " (SERVICE_NAME = orcl.home) " + "))" + "; User Id = system;password = orcl;"; // 用using块自动释放所有非托管资源 using (OracleConnection con = new OracleConnection(connectionString)) { try { con.Open(); // 创建命令时直接关联连接对象 using (OracleCommand cmd = new OracleCommand("SELECT NOME, COGNOME, NUMTELEFONO FROM PROVA ORDER BY COGNOME DESC", con)) { cmd.CommandType = CommandType.Text; using (OracleDataReader dr = cmd.ExecuteReader()) { DataTable dt = new DataTable(); dt.Load(dr); // 修正DataSource赋值语法,属性用=赋值而非方法调用 dataGridView1.DataSource = dt; } } } catch (Exception ex) { MessageBox.Show($"数据加载失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void Form1_Load(object sender, EventArgs e) { } } }
注意事项
- 使用前请先通过NuGet包管理器安装
Oracle.ManagedDataAccess官方驱动包 - 请根据自己实际的Oracle配置修改连接字符串中的服务名、账号、密码参数
- 确保system账号有PROVA表的查询权限,否则会触发权限不足错误
内容的提问来源于stack exchange,提问作者Fabio Palladino
相关产品推荐
相关产品推荐

