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();
(这里是文档结束)