0

我正在尝试“玩”一个小型数据库并制作了一个程序,该程序应该使用我提供的信息连接到数据库(该部分工作正常)

登录后程序的另一部分应该连接到数据库并做两件事: 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;

    }
4

2 回答 2

2

前两个子部分可以使用以下方法使其工作。对于最后一部分,您必须使用自己的 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
于 2013-05-29T19:25:30.857 回答
1

我使用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");
        }
    }
}
于 2013-05-29T19:14:59.713 回答