我有这段代码显示了我使用SqlClient
创建的数据库,但是我不知道如何检查列是否被添加为表中的可空值或不可空值。
string[] defaultTables = { "AspNetUsers", "AspNetRoleClaims", "AspNetUserClaims", "AspNetUserLogins", "AspNetUserRoles", "AspNetUserTokens", "AspNetRoles", "__EFMigrationsHistory" };
dblist.ForEach((string DbName) => {
strConnection = $@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog={DbName};Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";
using (SqlConnection conn = new SqlConnection(strConnection)) {
conn.Open();
using (cmdSql = new SqlCommand(strConnection, conn)) {
DataTable dt = conn.GetSchema("Tables");
foreach (DataRow row in dt.Rows) {
string tablename = row[2].ToString();
if (!defaultTables.Any(x => x == tablename)) {
tables.Add(tablename);
using (cmdSql = new SqlCommand($"Select * FROM {tablename}", conn)) {
SqlDataReader reader = cmdSql.ExecuteReader();
if (reader.Read()) {
for (int i = 0; i < reader.FieldCount; i++)
Console.Write(reader.GetName(i) + " " + reader.GetDataTypeName(i) + $"" + ',');
}
}
}
}
}
}
});
这不是100%可靠的,但是数据读取器上的GetSchemaTable()
可以显示此信息,如果知道(并非总是如此);具体来说,您正在寻找AllowDBNull
属性。不过,它并不是一个很好的API-它返回您需要调查的DataTable
,因此可能需要花点时间才能找到想要的内容。
您的方法似乎很难提取这类信息。数据库中有INFORMATION_SCHEMA视图,其中包含所需的确切信息。
例如:
using(SqlConnection con = new SqlConnection(.....))
{
con.Open();
DataTable dt = new DataTable();
// Get info on all tables...
SqlCommand cmd = new SqlCommand(@"SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'", con);
dt.Load(cmd.ExecuteReader());
foreach (DataRow r in dt.Rows)
{
// Get info on the current table's columns
string sqltext = $"SELECT * FROM INFORMATION_SCHEMA.Columns
WHERE TABLE_NAME = '{r.Field<string>("TABLE_NAME")}'";
SqlCommand cmd1 = new SqlCommand(sqltext, con);
DataTable dt1 = new DataTable();
dt1.Load(cmd1.ExecuteReader());
foreach (DataRow x in dt1.Rows)
{
Console.WriteLine($"Table:{x.Field<string>("TABLE_NAME")}");
Console.WriteLine($"Column:{x.Field<string>("COLUMN_NAME")}");
Console.WriteLine($"Data type:{x.Field<string>("DATA_TYPE")}");
Console.WriteLine($"Nullable:{x.Field<string>("IS_NULLABLE")}");
}
}