1

晚上好,

我刚开始 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 是列表框的名称。

此代码运行良好,每个数据库都显示在我的列表框中。但不,我完全停电。如何将选定数据库中的表放入 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。

4

1 回答 1

1

试试这个选择语句:

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

由于要在 inside 中找到数据库名称,因此也要在其中找到每个数据库的sys.databases表。mastersys.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.
    }
}
于 2013-11-12T14:52:05.857 回答