本文旨在介绍Dapper中使用getschema获取表信息的方法和注意事项。
一、获取某张表的所有列信息
使用Dapper获取某张表信息,可以使用 `IDbConnection.GetSchema()` 方法。这个方法通过填写不同的参数,可以获取数据库架构信息、表信息、视图信息以及约束信息等。
针对获取一个表的所有列信息,可以通过以下代码实现:
var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
var columns = new List();
connection.Open();
var sqlCommand = connection.CreateCommand();
sqlCommand.CommandText = "select * from TestTable where 1=0";
var dataReader = sqlCommand.ExecuteReader();
var schemaTable = dataReader.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
{
columns.Add(row.Field("ColumnName"));
}
dataReader.Close();
connection.Close();
代码解释:
1. 创建SqlConnection对象,连接数据库;
2. 创建一个List集合存储列名;
3. 执行一条查询语句,但是不返回任何数据,这样就可以获取该表的列名;
4. 使用GetSchemaTable()方法获取数据;
5. 遍历取到的表中的所有行,将行中的ColumnName存储到之前创建的List集合当中;
6. 关闭数据库连接。
通过这个方法可以得到被检索表的所有列信息。
二、获取某张表的主键信息
获取指定表的主键,可以通过以下代码实现:
var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
var primaryKeyColumns = new List();
connection.Open();
var schema = connection.GetSchema("Indexes");
var table = schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")).FirstOrDefault();
if(table!=null)
{
var indexName = (string)table["INDEX_NAME"];
var pkColumns = schema.Rows.Cast>DataRow<>()
.Where(p => p["INDEX_NAME"].ToString() == indexName && ((short)p["TYPE"] == 1 || (short)p["TYPE"] == 2))
.OrderBy(p => (short)p["TYPE"]).ThenBy(p => (int)p["ORDINAL_POSITION"]);
primaryKeyColumns.AddRange(pkColumns.Select(p => (string)p["COLUMN_NAME"]));
}
connection.Close();
代码解释:
1. 创建SqlConnection对象,连接数据库;
2. 创建一个List集合存储主键;
3. 执行GetSchema(“Indexes”)方法获取索引信息;
4. 通过Linq表达式获取指定表的索引信息,并且包含其中的所有第一顺位索引、第二顺位索引,主键需要表现为数字1或数字2,而非唯一性约束所代表的数字3;
5. 将索引的列名存入List集合,并且关闭数据库连接。
三、获取某张表的唯一性约束信息
一些数据库表的列值是唯一的,为了保证这个唯一性,可以在表的列上添加唯一性约束。Dapper可以获取这些唯一性约束信息。以下是获取该信息的代码:
var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
var uniqueColumns = new List<string>();
connection.Open();
var schema = connection.GetSchema("Columns");
var table = schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")).FirstOrDefault();
if(table!=null)
{
uniqueColumns.AddRange(schema.Rows.Cast<DataRow>()
.Where(p => p["TABLE_NAME"].ToString().Equals("TestTable") && ((bool)p["IsUnique"] == true))
.Select(p => (string)p["COLUMN_NAME"]));
}
connection.Close();
代码解释:
1. 创建SqlConnection对象,连接数据库;
2. 创建一个List集合存储唯一性约束列名;
3. 执行GetSchema(“Columns”)方法获取列信息;
4. 用Linq表达式获取特定的表信息;
5. 将具有唯一性约束的列名存入List集合,关闭数据库连接。
四、获取某张表的所有约束信息
获取指定表的所有约束信息,可以使用下面的代码:
var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
var constraints = new List<string>();
connection.Open();
var schema = connection.GetSchema("ConstraintColumns");
var constraintsTable = schema.Rows.Count > 0 ? schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")) : null;
if (constraintsTable != null)
{
foreach (var constraint in constraintsTable)
{
var constraintName = (string)constraint["CONSTRAINT_NAME"];
if (!constraints.Contains(constraintName))
constraints.Add(constraintName);
}
}
connection.Close();
代码解释:
1. 创建SqlConnection对象,连接数据库;
2. 创建一个List集合存储约束的名称;
3. 执行GetSchema(“ConstraintColumns”)方法获取约束信息;
4. 使用Linq表达式存储指定表的约束信息;
5. 将特定表中所有约束的名称存入List集合,并且关闭数据库连接。
五、获取某张表的所有外键信息
获取指定表的所有外键信息,可以使用下面的代码:
var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
connection.Open();
var schema = connection.GetSchema("Foreign Keys", new[] { null, null, "TestTable" });
var foreignKeys = new List<ForeignKey>();
foreach(DataRow item in schema.Rows)
{
foreignKeys.Add(new ForeignKey
{
Name = item["CONSTRAINT_NAME"].ToString(),
FromTableName = item["TABLE_NAME"].ToString(),
FromColumnName = item["COLUMN_NAME"].ToString(),
ToTableName = item["REFERENCED_TABLE_NAME"].ToString(),
ToColumnName = item["REFERENCED_COLUMN_NAME"].ToString()
});
}
connection.Close();
代码解释:
1. 创建SqlConnection对象,连接数据库;
2. 执行GetSchema(“Foreign Keys”)方法获取外键信息;
3. 创建一个列表存储ForeignKey对象;
4. 将表中的所有外键存储到列表中,并且关闭数据库连接。
六、总结
dapper 的 GetSchema 方法可以方便的获取表和数据库的架构信息。在这篇文章中,我们讨论了如何使用它来获取表中的列、主键、列的约束以及外键信息。这个技术可以在开发过程中方便的用来生成代码,进行表比较和同步、校验和更新表等等。
原创文章,作者:UMJBO,如若转载,请注明出处:https://www.506064.com/n/374172.html
微信扫一扫
支付宝扫一扫