如何在c#中获得数据库(sql)表名和列以组合和列表框

本文关键字:列表 组合 sql 数据库 | 更新日期: 2023-09-27 18:15:51

我正试图"玩"一个小数据库,并做了一个程序,应该连接到一个数据库使用信息我给它(那部分工作良好)

登录后,程序的另一部分应该连接到数据库并做两件事:1. 获取所有表名并将其放入组合框中2. 获取表的所有列名(从组合框中选择)并在列表框

中显示它们

我计划从中检查列名并使用它在表上运行不同的SQL命令

我的问题是我不能使它工作

从stackoverflow和Google搜索了其他例子,我知道我错过了一些小的东西,使这个东西不起作用,但我不知道是什么。

向比我更了解这件事的人寻求帮助

表示组合框

    private void listTables()
    {
        const string query = "SELECT * FROM [dstut].sys.Tables";
        SqlConnection sqlConn = new SqlConnection(lw.ConnectionString);
        sqlConn.Open();
        SqlCommand cmd = new SqlCommand(query, sqlConn);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        List<string> l = new List<string>();
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            l.Add(dr[0].ToString());
        }
        cbTables.DataSource = l;
    }
    public DataSet GetAllColumns()
    {
        string query = "SELECT name FROM " + TableName;
        SqlConnection sqlConn = new SqlConnection(lw.ConnectionString);
        sqlConn.Open();
        SqlCommand cmd = new SqlCommand(query, sqlConn);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            MessageBox.Show(Convert.ToString(dr["Field_1"]));
        }
        return ds;
    }

如何在c#中获得数据库(sql)表名和列以组合和列表框

我使用SMO来拉下信息。

public class SqlDatabaseAdapter
{
    private readonly ServerConnection _serverConnection;
    public SqlDatabaseAdapter(string connectionString)
    {
        _serverConnection = new ServerConnection(new SqlConnection(connectionString));
    }
    public DataSet GetTables(string databaseName = "master")
    {
        var server = new Server(_serverConnection);
        var database = server.Databases.Cast<Database>().FirstOrDefault(d => d.Name == databaseName);
        var dataSet = new DataSet(databaseName);
        if (database == null) return dataSet;
        foreach (var table in database.Tables.Cast<Table>())
        {
            var dataTable = new DataTable(table.Name);
            FillColumns(table, dataTable);
            dataSet.Tables.Add(dataTable);
        }
        return dataSet;
    }
    public DataTable GetTable(string tableName, string databaseName = "master")
    {
        var server = new Server(_serverConnection);
        var database = server.Databases.Cast<Database>().FirstOrDefault(d => d.Name == databaseName);
        var dataTable = new DataTable(tableName);
        if (database == null) return dataTable;
        database.Refresh();
        var table = database.Tables.Cast<Table>().FirstOrDefault(f => f.Name == tableName);
        if (table == null) return dataTable;
        FillColumns(table, dataTable);
        return dataTable;
    }
    private static void FillColumns(Table table, DataTable dataTable)
    {
        foreach (Column column in table.Columns)
        {
            var type = ConvertToClrType(column.DataType.SqlDataType, column.Nullable);
            var dataColumn = new DataColumn(column.Name, type);
            dataTable.Columns.Add(dataColumn);
        }
    }
    private static Type ConvertToClrType(SqlDataType sqlDataType, bool nullable)
    {
        switch (sqlDataType)
        {
            case SqlDataType.BigInt:
                return nullable ? typeof (long?) : typeof (long);
            case SqlDataType.Binary:
            case SqlDataType.Image:
            case SqlDataType.Timestamp:
            case SqlDataType.VarBinary:
                return typeof (byte[]);
            case SqlDataType.Bit:
                return nullable ? typeof (bool?) : typeof (bool);
            case SqlDataType.Char:
            case SqlDataType.NChar:
            case SqlDataType.NText:
            case SqlDataType.NVarChar:
            case SqlDataType.Text:
            case SqlDataType.VarChar:
            case SqlDataType.Xml:
                return typeof (string);
            case SqlDataType.DateTime:
            case SqlDataType.SmallDateTime:
            case SqlDataType.Date:
            case SqlDataType.Time:
            case SqlDataType.DateTime2:
                return nullable ? typeof (DateTime?) : typeof (DateTime);
            case SqlDataType.Decimal:
            case SqlDataType.Money:
            case SqlDataType.SmallMoney:
            case SqlDataType.Numeric:
                return nullable ? typeof (decimal?) : typeof (decimal);
            case SqlDataType.Float:
                return nullable ? typeof (double?) : typeof (double);
            case SqlDataType.Int:
                return nullable ? typeof (int?) : typeof (int);
            case SqlDataType.Real:
                return nullable ? typeof (float?) : typeof (float);
            case SqlDataType.UniqueIdentifier:
                return nullable ? typeof (Guid?) : typeof (Guid);
            case SqlDataType.SmallInt:
                return nullable ? typeof (short?) : typeof (short);
            case SqlDataType.TinyInt:
                return typeof (byte?);
            case SqlDataType.Variant:
                return typeof (object);
            case SqlDataType.DateTimeOffset:
                return nullable ? typeof (DateTimeOffset?) : typeof (DateTimeOffset);
            default:
                throw new ArgumentOutOfRangeException("sqlDataType");
        }
    }
}

前两个子部分可以使用以下方法完成。最后一部分,你需要使用自己的UI。请记住,您不是第一个创建Query Expression Builder工具的人。所以它值得检查或谷歌免费/开源Query Expression Builder工具。

使用下面的查询返回连接数据库中的所有表,并将其绑定到您的第一个组合。

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'

您可以执行以下查询来返回第一个组合中所选表中的所有列

SELECT COLUMN_NAME, * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='SelectedValueFromCombo1' ORDER BY ORDINAL_POSITION