簡體   English   中英

如何在C#中獲取數據庫(sql)表名和列以組合和列表框

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

我正在嘗試用一個小型數據庫“玩”並制作一個應該使用我提供的信息連接到數據庫的程序(該部分工作正常)

登錄后,程序的另一部分應連接到數據庫並執行以下兩項操作:1。獲取所有表名並將其放入組合框2.獲取表的所有列名(從組合框中選擇)並顯示在列表框

從那我計划檢查列名稱並使用它在表上運行不同的SQL命令

我的問題是我無法使其發揮作用

從stackoverflow和谷歌搜索其他例子,我知道我錯過了一些小東西,這使得這個東西不起作用,但我不知道是什么。

在這個問題上向我提供更多信息的人尋求幫助

對於組合框

    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;

    }

前兩個子部分可以使用以下方法使其工作。 而對於最后一部分,您必須使用自己的UI。 請記住,您不是第一個創建Query Expression Builder工具的人。 所以值得檢查或google免費/開源的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

我使用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