如何使用C# Firebird执行数据库select查询并在Shell中展示结果
C# 连接Firebird数据库执行SELECT查询的实现方案
现有代码核心问题
FbCommand实例未关联已打开的数据库连接和事务对象,直接运行会抛出执行上下文缺失的错误- 查询操作调用了
ExecuteNonQuery()方法,该方法仅用于INSERT/UPDATE/DELETE等写操作,只会返回受影响行数,无法获取查询结果 - 只读查询场景下不需要显式开启事务,属于冗余代码
前置准备
首先确保你的项目已经安装了Firebird官方驱动:在Visual Studio的NuGet包管理器中搜索安装FirebirdSql.Data.FirebirdClient即可。
修正后的完整可运行代码
using System; using FirebirdSql.Data.FirebirdClient; namespace ConsoleApp1 { class Program { static public void Main() { // 连接字符串可按需添加Charset=utf8避免中文乱码 string connStr = "database=SECRET.FB;user=SYSDBA;password=masterkey;DataSource=serverip;Port=3050;Charset=utf8"; // using语法会自动释放连接资源,无需手动Close using (var con = new FbConnection(connStr)) { con.Open(); // 构造查询命令,关联已打开的连接 string sql = "SELECT n.nrdokwew, n.datadok, k.nazwaskr FROM nagl n JOIN kontrah k on (n.id_kontrah = k.id_kontrah)"; using (var cmd = new FbCommand(sql, con)) { // 执行查询返回数据读取器 using (var reader = cmd.ExecuteReader()) { // 逐行读取查询结果 while (reader.Read()) { // 按字段名读取对应值,类型可按需转换 string nrdokwew = reader["nrdokwew"].ToString(); DateTime datadok = Convert.ToDateTime(reader["datadok"]); string nazwaskr = reader["nazwaskr"].ToString(); // 控制台输出结果 Console.WriteLine($"单据号:{nrdokwew},单据日期:{datadok:yyyy-MM-dd},承包商简称:{nazwaskr}"); } } } } Console.ReadKey(); } } }
实现逻辑拆解
- 连接初始化:通过
FbConnection传入合法的连接字符串,调用Open()方法建立和Firebird数据库的物理连接 - 命令构造:
FbCommand需要绑定SQL语句和已打开的连接对象,作为查询执行的上下文 - 结果读取:调用
ExecuteReader()返回FbDataReader对象,通过Read()方法逐行遍历结果集,通过字段名或索引获取对应列的值 - 资源释放:所有实现了
IDisposable接口的对象(连接、命令、读取器)都用using包裹,退出代码块时自动释放资源,避免连接泄露
如果需要把查询结果存到内存表后续处理,可以使用FbDataAdapter填充DataTable,示例代码片段如下:
using (var adapter = new FbDataAdapter(cmd)) { System.Data.DataTable dt = new System.Data.DataTable(); adapter.Fill(dt); // dt中存储了全部查询结果,可直接绑定到UI控件或者遍历 }
内容的提问来源于stack exchange,提问作者shade999
相关产品推荐
相关产品推荐

