【问题标题】:WPF/SQL - how to get tables from a selected database into a ListViewWPF/SQL - 如何从选定的数据库中获取表到 ListView
【发布时间】:2013-11-12 14:36:40
【问题描述】:

晚上好,

我刚开始 IT 学徒期,我已经开始了自己的小项目。我有以下问题:

我在 WPF 中创建了一个用于获取 SQL 连接数据的标准登录窗口。这个窗口工作正常,我只能在输入的登录数据正确时切换到下一个窗口。我的问题是第二个窗口。在第二个中,我有一个 ListBox 用于列出连接服务器中的每个数据库。在这个 ListBox 旁边,我有一个 ListView。在这个 ListView 中,我想查看所选数据库中的表。

列出数据库的代码:

SqlConnection GetConnection = new SqlConnection("Server=admin-pc;user Id=sa;Password=123;");
try
{
   this.libDatabase.Items.Clear();
   DataTable databases = new DataTable("Databases");

   using (IDbConnection connection = GetConnection)
   {
      IDbCommand command = connection.CreateCommand();
      command.CommandText = "SELECT * FROM sys.Databases";
      connection.Open();
      databases.Load(command.ExecuteReader(CommandBehavior.CloseConnection));
   }
   this.libDatabase.Items.Clear();

   foreach (DataRow row in databases.Rows)
        this.libDatabase.Items.Add(row[0].ToString());
   }
   catch (SqlException)
   {
      this.libDatabase.Items.Clear();
      this.libDatabase.Items.Add("Connection error");
   }
   catch (Exception ex)
   {
      MessageBox.Show("Error while loading available databases");
   }
   finally
   {
      GetConnection.Close();
   }

libDatabase 是 ListBox 的名称。

此代码运行良好,每个数据库都显示在我的列表框中。但不,我完全停电。如何将选定数据库中的表放入 ListView?我尝试了与数据库相同的方式,但使用不同的“SELECT”-Statement ==> “select * from {0}”,listbox.SelectedItem 这是我尝试过的不同代码,但我认为我做错了什么。

第一个版本:

            List<ListViewItem> gettables = new List<ListViewItem>();
        if (libDatabase.SelectedItem != null)
        {
            SqlConnection con = new SqlConnection("Server=admin-pc;user Id=sa;Password=123;");
            string strSQL = string.Format("select * from {0}", libDatabase.SelectedItem);

            SqlCommand cmd = new SqlCommand(strSQL, con);

            con.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {

            }


            reader.Close();
            con.Close();
        }

第二版:

SqlConnection GetConnection = new SqlConnection("Server=admin-pc;user Id=sa;Password=123;");
        try
        {
            this.libTables.Items.Clear();
            DataTable tables = new DataTable("Tables");
            using (IDbConnection connection = GetConnection)
            {
                IDbCommand command = connection.CreateCommand();
                if (libDatabase.SelectedItem != null)
                {
                    command.CommandText = string.Format("SELECT * FROM {0}", libDatabase.SelectedItem);
                    connection.Open();
                    tables.Load(command.ExecuteReader());
                }
            }
            this.libTables.Items.Clear();
            foreach (DataRow row in tables.Rows)
                this.libTables.Items.Add(row[0].ToString());
        }
        catch (SqlException)
        {
            this.libTables.Items.Clear();
            this.libTables.Items.Add("Connection error. Check server");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error while loading available tables" + ex);
        }
        finally
        {
            GetConnection.Close();
        }

libTables 是 ListView 的名称。

也许我做错了,或者只有一个代码块是假的。

感谢您的支持。

戴夫·S.

【问题讨论】:

    标签: c# sql wpf


    【解决方案1】:

    试试这个 select 语句:

                   command.CommandText = string.Format("SELECT * FROM {0}.sys.tables", libDatabase.SelectedItem);
    

    由于可以在master 内的sys.databases 中找到数据库名称,因此也可以在sys.tables 中找到每个数据库的表。

    使用调试器单步执行这种性质的代码,和/或在每个有意义的位置设置断点是值得的。验证代码中构建的每条 sql 语句完全符合您的预期,并在 Sql Management Studio 中使用与在您的代码中执行的相同权限执行每条语句,以确保该语句将生成你想要的结果。

    编辑触发表加载:

    您还必须确保表加载过程由适当的操作触发。在这种情况下,它很可能需要由用户在数据库列表框中选择一个数据库来触发。您需要将 SelectionChanged 事件的事件处理程序添加到列表框。 (请注意,根据您问题中包含的代码示例,我假设您没有使用 MVVM 模式。)

    将 SelectionChanged 属性添加到您的 ListBox 定义中:

    <ListBox Name="libDatabase" SelectionChanged="libDatabase_SelectionChanged">
    

    在代码隐藏中,定义事件处理程序:

    private void libDatabase_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        if(libDatabase.SelectedItem != null)
        {
            // open a database connection and select your tables here.
        }
    }
    

    【讨论】:

    • 对不起,这也不起作用!我认为 libDatabase.SelectedItem 有问题??或者我应该将此代码块放在与数据库代码块相同的方法中吗?这是 window_loaded 代码块。但是我不想在加载窗口时看到表格。只有在选择数据库时。 span>
    • 不清楚第二块代码在哪里(表加载过程)。根据您所说,听起来您希望加载表以响应数据库列表框的 SelectionChanged 事件。这是表格加载代码的位置吗?
    • in private void Window_Loaded 我加载了数据库列表,因为当窗口打开时,数据库应该在列表框中。在private void livTables_SelectionChanged 我想从选定的数据库中加载表列表。
    • 我已经修改了我的答案,以包含有关您需要的 libDatabase_SelectionChanged 事件的部分。您应该加载表以响应发生的数据库选择更改,而不是发生的表选择。听起来您已将其连接到 SelectionChanged 事件以获得错误的控件。
    • 哦,好吧,我知道了!我的 SelectionChanged="lbTodoList_SelectionChanged 不在 ListBox 标记中,而是在 ListView 标记中。也许这就是我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多