当前位置: 首页 > news >正文

C# 用统一代码动态查询数据库并显示数据

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        编写数据库程序很头疼的是如果表很多但操作都差不多怎么办,比较灵活的方式是用代码来动态处理,只需要提供查询语句和相关控制参数,就可以灵活地处理适应不同的表。

        这个思路和定制化思路不同,定制化实现的实体字段、表名都是明确定义的,具有强类型安全,如果有错误编译无法通过。但是缺点是难以提供不同表的通用限制,比如对相同的字段进行过滤(或许是我不知道?不管怎么说,我们还是需要考虑一下不同的解决方案)。

        动态处理由于涉及到表结构的信息都是动态的,无法在编译阶段检查,因此如何在编码时自我约束、避免留坑就是最大的问题。至于技术,倒是很简单的。

        以下以包Mysql.data提供的功能为例,不过任何数据库都提供了相似的功能。

目录

一、执行动态查询

二、动态获取结果集信息

2.1 获取字段数reader.FieldCount

2.2 获取字段名reader.GetName(i)

2.3 获取字段类型reader.GetFieldType(i)

2.4 获取字段值reader[0].ToString()

三、完整示例


一、执行动态查询

        执行动态查询通常使用一个command对象,传入一个字符串类型的SQL语句,如果语句中包含了参数,再后面添加参数到command对象,最后执行command对象就可以获得结果集。

        因为SQL语句是字符串,所以我们可以随意定制语句(当然此时就不太方便使用参数化查询了)。

        代码示例:

MySqlCommand cmd = new("select * from table", connection);
MySqlDataReader reader = cmd.ExecuteReader();

        connection是已经完成连接的数据库连接对象。 

二、动态获取结果集信息

        结果集里面包含了有多少字段、每个字段的名称和类型,根据这些信息可以从容地把结果集显示在控件里或者打印出来。

2.1 获取字段数reader.FieldCount

        使用这个属性即可获得结果集的字段数,即使没有一行记录返回(只要执行正确)。

2.2 获取字段名reader.GetName(i)

        使用这个方法获取指定字段的名称。字段名称如果不满意可以直接在SQL语句里指定,标准语法是使用as关键字,“原始字段名 as 新字段名”,比如“count(*) as total”。

2.3 获取字段类型reader.GetFieldType(i)

        为啥不是GetType?因为GetType返回的是reader的类型。其实错的是GetName,用GetFieldName更好。也不是大厂设计的东西就经过了大脑。

        我用的这个包返回的类型是C#的类型,比如System.Int。其实有时候我们更想知道数据库里面的类型,这需要查架构视图才行,如果我自己设计,就会加上一个方法返回数据库里面的类型。

2.4 获取字段值reader[0].ToString()

        reader[i]即可访问字段,如果只是为了显示可以用ToString()转换任何类型。

三、完整示例

MySqlCommand cmd = new(sql.ToString(), connection);
MySqlDataReader reader = cmd.ExecuteReader();if (0 == dataGridView.Columns.Count)
{for (int i = 0; i < reader.FieldCount; ++i){_ = dataGridView.Columns.Add(reader.GetName(i), reader.GetName(i) + " " + reader.GetFieldType(i));}
}while (reader.Read())
{int item = dataGridView.Rows.Add(reader[0].ToString());for(int i=1;i<reader.FieldCount;++i){dataGridView.Rows[item].Cells[i].Value = reader[i].ToString();}
}
reader.Close();

(这里是文档结束)


http://www.mrgr.cn/news/35809.html

相关文章:

  • 芒果TV《航海少年团》强强联合,优质少儿动画乘风起航
  • W39-02-jmeter中如何实现:下一个请求是需要根据前一个请求返回值进行循环请求
  • Latex学习
  • 【每天学点AI】五个阶段带你了解人工智能大模型发展史!
  • PLC控制系统应用的抗干扰问题
  • 可变剪接分析一步到位,这个 R 包够猛!
  • 表观项目文章速递,平均IF=9.7
  • 【tbNick专享】虚拟机域控、成员服务器、降级等管理
  • oracle 分表代码示例
  • Jetpack02-LiveData 数据驱动UI更新(类似EventBus)
  • 《AI设计类工具系列之三——Magic Design》
  • 7大网络安全机构真实测评:零基础转行网安这么选就对了~
  • 【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示
  • 邦芒干货:职场上快速适应工作新环境的十大举措
  • 表单多个输入框校验
  • 外网SpringBoot项目迁移到内网无法加载maven依赖
  • 逆概率加权(R和Python案例)
  • implementation ‘com.lxj:xpopup:2.2.1‘失败
  • 【Linux】驱动的基本架构和编译
  • TON生态系统开发指南:从零开始构建你的Web3应用