使用C#上的SqlClient获取列是否可为空(声明为非null或隐式声明为可为空)

问题描述 投票:0回答:2

我有这段代码显示了我使用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) + $"" + ',');
                        }
                    }
                }
            }
        }
    }
});
c# sql-server
2个回答
0
投票

这不是100%可靠的,但是数据读取器上的GetSchemaTable()可以显示此信息,如果知道(并非总是如此);具体来说,您正在寻找AllowDBNull属性。不过,它并不是一个很好的API-它返回您需要调查的DataTable,因此可能需要花点时间才能找到想要的内容。

citation


0
投票

您的方法似乎很难提取这类信息。数据库中有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")}");
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.