简体   繁体   English

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

[英]how to get database (sql) table names and colums in C# to combo and list box

i'm trying to "play" with a small database and made a program that should connect to a database using info i give it (that part works fine) 我正在尝试用一个小型数据库“玩”并制作一个应该使用我提供的信息连接到数据库的程序(该部分工作正常)

after login another part of the program should connect to the database and do 2 things: 1. get all the table names and put it into a combobox 2. get all the column names of a table (choose form the combobox) and display them in a listbox 登录后,程序的另一部分应连接到数据库并执行以下两项操作:1。获取所有表名并将其放入组合框2.获取表的所有列名(从组合框中选择)并显示在列表框

from that i plan to check a column name and use it to run different SQL commands on the tables 从那我计划检查列名称并使用它在表上运行不同的SQL命令

my problem is that i can't make it work 我的问题是我无法使其发挥作用

searched other examples from stackoverflow and google and i know i'm missing something small that makes this thing not work, but i don't know what. 从stackoverflow和谷歌搜索其他例子,我知道我错过了一些小东西,这使得这个东西不起作用,但我不知道是什么。

ask for help from people with greater info then my own on this matter 在这个问题上向我提供更多信息的人寻求帮助

for the combobox 对于组合框

    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;

    }

The first two sub section can be get it worked using following approach. 前两个子部分可以使用以下方法使其工作。 And for the last part, you have to go with your own UI. 而对于最后一部分,您必须使用自己的UI。 Keep in mind, you are not the first person to create Query Expression Builder tool. 请记住,您不是第一个创建Query Expression Builder工具的人。 So its worth checking or google for free/open source Query Expression Builder tools. 所以值得检查或google免费/开源的Query Expression Builder工具。

Use following query to return all tables from the connected database and bind it to your first combo. 使用以下查询从连接的数据库返回所有表,并将其绑定到您的第一个组合。

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

You can execute following query to return all columns from selected table from your first combo 您可以执行以下查询以从第一个组合中返回所选表中的所有列

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

I use SMO to pull down the information. 我使用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");
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM