Вывод sql запроса в windows forms

Приветствую всех, в этом примере я покажу как просто создать приложения позволяющее, изменять, обновлять и удалять запись в базе данных SQL.

Приветствую всех, в этом примере я покажу как просто создать приложения позволяющее, изменять, обновлять и удалять запись в базе данных SQL.

Шаг 1: Откройте менеджер Sql Server, нажмите на новую базу данных . Дайте базе данных имя «dbSchool».

Шаг 2: Теперь создайте таблицу в базе данных, вы можете назвать таблицу как хотите, здесь я назвал его “Student”. Существует три столбца в таблице IDFirstName и LastName, как показано ниже

Дизайн Формы:

Код C# :

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Data.SqlClient; //For SQL Connection

namespace Пример_SQL_Server_приложения

{

    public partial class Form1 : Form  //www.nookery.ru

    {

        public Form1()

        {

            InitializeComponent();

        }

        SqlConnection con;

        SqlDataAdapter da;

        SqlCommand cmd;

        DataSet ds;

        void GetList()

        {

            con = new SqlConnection(@»Data Source=.SQLEXPRESS; Initial Catalog=dbSchool; Integrated Security=True»);

            da = new SqlDataAdapter(«Select *From Student», con);

            ds = new DataSet();

            con.Open();

            da.Fill(ds, «Student»);

            dataGridView1.DataSource = ds.Tables[«Student»];

            con.Close();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            GetList();

        }

        private void button1_Click(object sender, EventArgs e) // Insert Button

        {

            cmd = new SqlCommand();

            con.Open();

            cmd.Connection = con;

            cmd.CommandText = «insert into Student(ID,FirstName,LastName) values (« + textBox1.Text + «,'» + textBox2.Text + «‘,'» + textBox3.Text + «‘)»;

            cmd.ExecuteNonQuery();

            con.Close();

            GetList();

        }

        private void button2_Click(object sender, EventArgs e)//Update Button

        {

            cmd = new SqlCommand();

            con.Open();

            cmd.Connection = con;

            cmd.CommandText = «update Student set FirstName='» + textBox2.Text + «‘,LastName='» + textBox3.Text + «‘ where ID=» + textBox1.Text + «»;

            cmd.ExecuteNonQuery();

            con.Close();

            GetList();

        }

        private void button3_Click(object sender, EventArgs e)//Delete Button

        {

            cmd = new SqlCommand();

            con.Open();

            cmd.Connection = con;

            cmd.CommandText = «delete from Student where ID=» + textBox1.Text + «»;

            cmd.ExecuteNonQuery();

            con.Close();

            GetList();

        }

    }

}

Всем привет, надеюсь мне здесь поможет кто нибудь.
Заранее хочу сказать что подобные темы видел, но подходящую себе не нашёл.
C# .NET 4.5

Проблема следующая, есть объёмный скрипт на выходе получаю 5 столбцов. с 1 по 4 идёт дубль так как поле 5 разное.
Необходимо весь результат вывести в textbox.

Код

private void button15_Click(object sender, EventArgs e)
        {
string query = @"select 
Column1,
Column2,
Column3,
Column4,
Column5,
from ALL_DOCUMENT";
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;
                cmd.CommandText = (query);
                cmd.Connection = MyConnect;
                cmd.CommandTimeout = 9000;
                MyConnect.Open();
                reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    textBox6.Text = reader[0].ToString();

                }

                MyConnect.Close();
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

Все операции с БД в графическом приложении

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную
форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.

Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет
выглядеть примерно следующим образом:

DataSet и DataGridView

Код формы будет выглядеть следующим образом:

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace AdoNetWinFormsApp
{
    public partial class Form1 : Form
    {
        DataSet ds;
        SqlDataAdapter adapter;
        SqlCommandBuilder commandBuilder;
        string connectionString = @"Data Source=.SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
        string sql = "SELECT * FROM Users";

        public Form1()
        {
            InitializeComponent();

            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.AllowUserToAddRows = false;

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                adapter = new SqlDataAdapter(sql, connection);

                ds = new DataSet();
                adapter.Fill(ds);
                dataGridView1.DataSource = ds.Tables[0];
				// делаем недоступным столбец id для изменения
                dataGridView1.Columns["Id"].ReadOnly = true;
            }
            
        }
        // кнопка добавления
        private void addButton_Click(object sender, EventArgs e)
        {
            DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable
            ds.Tables[0].Rows.Add(row);
        }
        // кнопка удаления
        private void deleteButton_Click(object sender, EventArgs e)
        {
			// удаляем выделенные строки из dataGridView1
            foreach(DataGridViewRow row in dataGridView1.SelectedRows)
            {
                dataGridView1.Rows.Remove(row);
            }   
        }
        // кнопка сохранения
        private void saveButton_Click(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();
                adapter = new SqlDataAdapter(sql, connection);
                commandBuilder = new SqlCommandBuilder(adapter);
                adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection);
                adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
                adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name"));
                adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age"));

                SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id");
                parameter.Direction = ParameterDirection.Output;

                adapter.Update(ds);
            }
        }
    }
}

Здесь для добавления объекта мы будем обращаться к хранимой процедуре sp_CreateUser, которая была добавлена в базу данных в прошлой теме.

В конструкторе данные загружаются в DataSet, первая таблица которого устанавливается в качестве источника данных для dataGridView1:

dataGridView1.DataSource = ds.Tables[0];

Также в конструкторе устанавливается полное выделение строки и запрет на ручное добавление новых строк:

dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView1.AllowUserToAddRows = false;

В обработчике кнопки добавления создается новая строка, которая добавляется в таблицу объекта DataSet. И так как мы ранее установили
привязку к источнику данных, то автоматически новая строка также будет добавляться и в dataGridView1:

private void addButton_Click(object sender, EventArgs e)
{
    DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable
    ds.Tables[0].Rows.Add(row);
}

В обработчике кнопки удаления удаляются выделенные строки в dataGridView1. Опять же в силу привязки к источнику данных будет также происходить удаление
и из таблицы в DataSet:

private void deleteButton_Click(object sender, EventArgs e)
{
    foreach(DataGridViewRow row in dataGridView1.SelectedRows)
    {
        dataGridView1.Rows.Remove(row);
    }   
}

Для обновления на не нужна никакая кнопка, так как мы можем нажать на любую ячейку таблицы (кроме заблокированного для изменения столбца Id) и изменить в ней данные.
Однако сами по себе добавление новой строки, удаление строк, изменение ячеек ни как автоматически не отразятся на базе данных. И
чтобы бд синхронизировалась, пользователю надо будет нажать на кнопку сохранения, обработчик которой выглядит следующим образом:

private void saveButton_Click(object sender, EventArgs e)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        adapter = new SqlDataAdapter(sql, connection);
        commandBuilder = new SqlCommandBuilder(adapter);
        adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection);
        adapter.InsertCommand.CommandType = CommandType.StoredProcedure;
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name"));
        adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age"));

        SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id");
        parameter.Direction = ParameterDirection.Output;

        adapter.Update(ds);
    }
}

Как в прошлой теме здесь устанавливается у адаптера команда на добавление InsertCommand и затем вызывается метод Update().
В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.

I am trying to execute an SQL command on an Access Database over an OleDbConnection using C# and use that information to fill a DataGridView on a windows form. I have opened the connection, stated the query, and executed it, but I cannot find how to output the results to the DataGridView on the windows form (named dataOutput).

    private void Query()
    {
        string cmdText = "SELECT * FROM RetentionTable " +
            "WHERE [DateTime] BETWEEN '" + getDateTimeFrom("") + "' AND '" + getDateTimeTo("") + "'";

        string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";

        try
        {
            OleDbConnection cn = new OleDbConnection(ConnectionPath);
            DataSet objDataSet = new DataSet();
            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();

            if (cn.State.Equals(ConnectionState.Closed))
            {
                cn.Open();
            }

            OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn);
            OleDbSearch.ExecuteNonQuery();

            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
            cn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
            MessageBox.Show(ex.StackTrace.ToString());
        }

    }

From what I can see, the query is being executed correctly, but the issue comes when trying to use the objDataAdapter.Fill. I guess I am not understanding how to fill the DataSet with the output from the query. Any help would be much appreciated. Thanks!

asked Jul 17, 2013 at 18:17

1337Atreyu's user avatar

Replace with ExecuteDataSet method

..
OleDbSearch.ExecuteDataSet();
objDataAdapter.Fill(objDataSet);
dataOutput.DataSource = objDataSet;
...

I suggest you to set your close connection in using blok or try with Finally of your try catch

Best practise

 using( var cn = new OleDbConnection(ConnectionPath))
 {
    ... 
 }

answered Jul 17, 2013 at 18:20

Aghilas Yakoub's user avatar

Aghilas YakoubAghilas Yakoub

28.3k5 gold badges46 silver badges51 bronze badges

A few comments:

  1. Your query is subject to SQL injection. Use a parameterised query instead.
  2. You don’t need to open/close the connection; the DataAdapter will do that for you.
  3. You should wrap the OleDbConnection and OleDbCommand objects in a using block to ensure that their resources are cleaned up.
  4. You don’t need to call ExecuteNonQuery, or any other Execute... method on the command;
  5. You need to assign the command to the SelectCommand property of the OleDbDataAdapter, or pass it to the constructor.

Try something like this:

private void Query()
{
   const string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";

   try
   {
      using (var cn = new OleDbConnection(ConnectionPath))
      using (var cmd = new OleDbCommand("SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? And ?"))
      {
         // Parameter names don't matter; OleDb uses positional parameters.
         cmd.Parameters.AddWithValue("@p0", getDateTimeFrom(""));
         cmd.Parameters.AddWithValue("@p1", getDateTimeTo(""));

         var objDataSet = new DataSet();
         var objDataAdapter = new OleDbDataAdapter(cmd);
         objDataAdapter.Fill(objDataSet);

         dataOutput.DataSource = objDataSet;
      }
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message.ToString());
      MessageBox.Show(ex.StackTrace.ToString());
   }
}

answered Jul 17, 2013 at 18:29

Richard Deeming's user avatar

Richard DeemingRichard Deeming

29.4k9 gold badges76 silver badges139 bronze badges

1

I think you can also load the data into a DataTable and point the DataGridView to the table:

DataTable dt = new DataTable();
dt.Fill(OleDbSearch.ExecuteReader());
dataOutput.DataSource = dt;

answered Jul 17, 2013 at 18:22

Axarydax's user avatar

AxarydaxAxarydax

16.2k19 gold badges91 silver badges151 bronze badges

You should not execute OleDbSearch.ExecuteNonQuery this is used only for queries that modify data (INSERT/UPDATE). Instead assign you command to dataadatper:

objDataAdapter.SelectCommand = OleDbSearch;

And then do your Fill and DataSource assignment.

answered Jul 17, 2013 at 18:22

Yuriy Galanter's user avatar

Yuriy GalanterYuriy Galanter

38.1k13 gold badges68 silver badges126 bronze badges

The correct way to retrieve a DataSet using an OleDbDataAdapter is to associate the OleDbCommand to the SelectCommand property of the OleDbDataAdapter. You simply pass the OleDbCommand to the constructor of the OleDbDataAdapter.

Also your code should use a parameterized query for the text of the command, not a string concatenation. Using parameterized query allows you to avoid Sql Injections and the correct parsing of your text, date, decimals variable is done by the framework code.

   string cmdText = "SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? AND ?";
   string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";
   try
   {
        using(OleDbConnection cn = new OleDbConnection(ConnectionPath))
        using(OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn))
        using(OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(OleDbSearch))
        {
            OleDbSearch.Parameters.AddWithValue("@p1", getDateTimeFrom(""));
            OleDbSearch.Parameters.AddWithValue("@p2", getDateTimeTo(""));
            DataSet objDataSet = new DataSet();
            cn.Open();
            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
        }
    }
    catch (Exception ex)
    {
         MessageBox.Show(ex.Message.ToString());
         MessageBox.Show(ex.StackTrace.ToString());
    }

The using statement is another point to take note. This will ensure a correct closing and disposing of the connection, command and adapter also in case of exceptions.

answered Jul 17, 2013 at 18:27

Steve's user avatar

SteveSteve

212k22 gold badges229 silver badges286 bronze badges

2

I am trying to execute an SQL command on an Access Database over an OleDbConnection using C# and use that information to fill a DataGridView on a windows form. I have opened the connection, stated the query, and executed it, but I cannot find how to output the results to the DataGridView on the windows form (named dataOutput).

    private void Query()
    {
        string cmdText = "SELECT * FROM RetentionTable " +
            "WHERE [DateTime] BETWEEN '" + getDateTimeFrom("") + "' AND '" + getDateTimeTo("") + "'";

        string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";

        try
        {
            OleDbConnection cn = new OleDbConnection(ConnectionPath);
            DataSet objDataSet = new DataSet();
            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter();

            if (cn.State.Equals(ConnectionState.Closed))
            {
                cn.Open();
            }

            OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn);
            OleDbSearch.ExecuteNonQuery();

            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
            cn.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString());
            MessageBox.Show(ex.StackTrace.ToString());
        }

    }

From what I can see, the query is being executed correctly, but the issue comes when trying to use the objDataAdapter.Fill. I guess I am not understanding how to fill the DataSet with the output from the query. Any help would be much appreciated. Thanks!

asked Jul 17, 2013 at 18:17

1337Atreyu's user avatar

Replace with ExecuteDataSet method

..
OleDbSearch.ExecuteDataSet();
objDataAdapter.Fill(objDataSet);
dataOutput.DataSource = objDataSet;
...

I suggest you to set your close connection in using blok or try with Finally of your try catch

Best practise

 using( var cn = new OleDbConnection(ConnectionPath))
 {
    ... 
 }

answered Jul 17, 2013 at 18:20

Aghilas Yakoub's user avatar

Aghilas YakoubAghilas Yakoub

28.3k5 gold badges46 silver badges51 bronze badges

A few comments:

  1. Your query is subject to SQL injection. Use a parameterised query instead.
  2. You don’t need to open/close the connection; the DataAdapter will do that for you.
  3. You should wrap the OleDbConnection and OleDbCommand objects in a using block to ensure that their resources are cleaned up.
  4. You don’t need to call ExecuteNonQuery, or any other Execute... method on the command;
  5. You need to assign the command to the SelectCommand property of the OleDbDataAdapter, or pass it to the constructor.

Try something like this:

private void Query()
{
   const string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";

   try
   {
      using (var cn = new OleDbConnection(ConnectionPath))
      using (var cmd = new OleDbCommand("SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? And ?"))
      {
         // Parameter names don't matter; OleDb uses positional parameters.
         cmd.Parameters.AddWithValue("@p0", getDateTimeFrom(""));
         cmd.Parameters.AddWithValue("@p1", getDateTimeTo(""));

         var objDataSet = new DataSet();
         var objDataAdapter = new OleDbDataAdapter(cmd);
         objDataAdapter.Fill(objDataSet);

         dataOutput.DataSource = objDataSet;
      }
   }
   catch (Exception ex)
   {
      MessageBox.Show(ex.Message.ToString());
      MessageBox.Show(ex.StackTrace.ToString());
   }
}

answered Jul 17, 2013 at 18:29

Richard Deeming's user avatar

Richard DeemingRichard Deeming

29.4k9 gold badges76 silver badges139 bronze badges

1

I think you can also load the data into a DataTable and point the DataGridView to the table:

DataTable dt = new DataTable();
dt.Fill(OleDbSearch.ExecuteReader());
dataOutput.DataSource = dt;

answered Jul 17, 2013 at 18:22

Axarydax's user avatar

AxarydaxAxarydax

16.2k19 gold badges91 silver badges151 bronze badges

You should not execute OleDbSearch.ExecuteNonQuery this is used only for queries that modify data (INSERT/UPDATE). Instead assign you command to dataadatper:

objDataAdapter.SelectCommand = OleDbSearch;

And then do your Fill and DataSource assignment.

answered Jul 17, 2013 at 18:22

Yuriy Galanter's user avatar

Yuriy GalanterYuriy Galanter

38.1k13 gold badges68 silver badges126 bronze badges

The correct way to retrieve a DataSet using an OleDbDataAdapter is to associate the OleDbCommand to the SelectCommand property of the OleDbDataAdapter. You simply pass the OleDbCommand to the constructor of the OleDbDataAdapter.

Also your code should use a parameterized query for the text of the command, not a string concatenation. Using parameterized query allows you to avoid Sql Injections and the correct parsing of your text, date, decimals variable is done by the framework code.

   string cmdText = "SELECT * FROM RetentionTable WHERE [DateTime] BETWEEN ? AND ?";
   string ConnectionPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=RetentionDB.mdb";
   try
   {
        using(OleDbConnection cn = new OleDbConnection(ConnectionPath))
        using(OleDbCommand OleDbSearch = new OleDbCommand(cmdText, cn))
        using(OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(OleDbSearch))
        {
            OleDbSearch.Parameters.AddWithValue("@p1", getDateTimeFrom(""));
            OleDbSearch.Parameters.AddWithValue("@p2", getDateTimeTo(""));
            DataSet objDataSet = new DataSet();
            cn.Open();
            objDataAdapter.Fill(objDataSet);
            dataOutput.DataSource = objDataSet;
        }
    }
    catch (Exception ex)
    {
         MessageBox.Show(ex.Message.ToString());
         MessageBox.Show(ex.StackTrace.ToString());
    }

The using statement is another point to take note. This will ensure a correct closing and disposing of the connection, command and adapter also in case of exceptions.

answered Jul 17, 2013 at 18:27

Steve's user avatar

SteveSteve

212k22 gold badges229 silver badges286 bronze badges

2

  • Remove From My Forums
  • Вопрос

  • Здравствуйте вот сколько не старался не могу найти примера для работы с mysql а именно как вывести данные откуда нашел и болие или мение разобрался как обновлять данные а вот не подскажите ли код именно для вывода данных в listbox имееться 3 столбца описаны
    ниже

    CREATE TABLE `day`.`user` (`id` INT NOT NULL AUTO_INCREMENT COMMENT 'id пользователя',
    `name` TEXT NOT NULL COMMENT 'Имя',
    `lastname` TEXT NOT NULL COMMENT 'Фамилия',
    PRIMARY KEY ( `id` ) 
    ) ENGINE = MYISAM ;

    Как мне вывести из этой тоблици id,name,lastname в listbox(1,2,3)

Ответы

  • Примерно так, правда Вам строку подключения надо подправить, у Вас она будет другой.

    using System;
    using System.Windows.Forms;
    using MySql.Data.MySqlClient;
    
    namespace MySqlDataReader1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          MySqlCommand command = new MySqlCommand();;
          string connectionString, commandString;
          connectionString = "Data source=localhost;UserId=root;Password=1234;database=MyDatabaseName;";
          MySqlConnection connection = new MySqlConnection(connectionString);
          commandString = "SELECT * FROM Day;";
          command.CommandText = commandString;
          command.Connection = connection;
          MySqlDataReader reader;
          try
          {
            command.Connection.Open();
            reader = command.ExecuteReader();
            while (reader.Read())
            {
              listBox1.Items.Add(reader["id"]);
              listBox1.Items.Add(reader["name"]);
              listBox1.Items.Add(reader["lastname"]);
            }
            reader.Close();
          }
          catch (MySqlException ex)
          {
            Console.WriteLine("Error: rn{0}", ex.ToString());
          }
          finally
          {
            command.Connection.Close();
          }
        }
      }
    }
    

    • Изменено

      19 июля 2012 г. 17:45
      Дополнил

    • Помечено в качестве ответа
      Alex_KG
      20 июля 2012 г. 8:45

Есть приложение Windows Forms C# для работы с локальной базой данных. Есть база данных на 4 таблицы. В приложении есть вкладка SELECT которая выводит в окне данные из всех таблиц. В данном случае приложение выводит данные только 1 таблицы (Product). А мне нужно чтоб отображались все таблицы! К сожалению, написать код или изменить существующий не хватает знаний. Буду рад услышать любые мысли по этому поводу. Скрины и фрагмент кода прилагаю.
введите сюда описание изображения

private async void Form1_Load(object sender, EventArgs e)
{
   string connectionString = @"Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=|DataDirectory|DataBaseMusicShop.mdf;Integrated Security=True";
   sqlConnection = new SqlConnection(connectionString);
   await sqlConnection.OpenAsync();

   SqlDataReader sqlReader = null;
   SqlCommand command = new SqlCommand("SELECT * FROM [Product]", sqlConnection);

   try
   {
       sqlReader = await command.ExecuteReaderAsync();
       while (await sqlReader.ReadAsync())
       {
           listBox1.Items.Add(Convert.ToString(sqlReader["id_product"]) + "  " + Convert.ToString(sqlReader["p_firm"]) + "  " + Convert.ToString(sqlReader["p_type"]) + "  " + Convert.ToString(sqlReader["p_price"]));
       }
   }
   catch (Exception ex)
   {
       MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
   finally
   {
        if (sqlReader != null)
                    sqlReader.Close();
   }
}

Александр Муксимов's user avatar

задан 12 июн 2019 в 14:31

Денис Денис's user avatar

Чтобы получить имена всех таблиц, не прописывая их в коде, можно сделать запрос к схеме БД. Для этого существует метод DbConnection.GetSchema. Провайдер ADO.NET для SQL Server предоставляет схему Tables, содержащую имена таблиц.

Простейший код вывода всех таблиц БД в ListBox’ах будет выглядеть как-то так:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();            
        }        

        public static IEnumerable<string> QueryTableNames(DbConnection con)
        {            
            //получение списка всех таблиц в БД
            DataTable dtSchema = con.GetSchema("Tables");

            foreach (DataRow row in dtSchema.Rows)
            {
                if ((string)row["TABLE_TYPE"] == "BASE TABLE")
                {
                    yield return (string)row["TABLE_NAME"];
                }
            }
        }

        public static async Task<DataTable> QueryTable(DbCommand cmd,string name)
        {             
            //получение таблицы
            DbDataReader rd = await cmd.ExecuteReaderAsync();
            using (rd)
            {
                DataTable dt = new DataTable();
                await Task.Run(() => { dt.Load(rd); });                                
                dt.TableName = name;
                return dt;
            }            
        }

        public static void DisplayTables(Control control, IEnumerable<DataTable> tables)
        {
            //вывод набора таблиц в указанном элементе управления сontrol

            //создадим FlowLayoutPanel для группировки элементов в столбик
            FlowLayoutPanel pan = new FlowLayoutPanel();            
            pan.FlowDirection = FlowDirection.TopDown;            
            pan.Dock = DockStyle.Fill;

            foreach (DataTable t in tables)
            {
                //создадим GroupBox с именем таблицы
                GroupBox gb = new GroupBox();
                gb.Text = "Table [" + t.TableName+"]";
                gb.Width = 400;
                gb.Height = 150;

                //создадим ListBox для отображения данных таблицы
                ListBox lb = new ListBox();                
                lb.Dock = DockStyle.Fill;

                foreach (DataRow row in t.Rows)
                {                    
                    lb.Items.Add(String.Join(" ", row.ItemArray));
                }

                gb.Controls.Add(lb);
                pan.Controls.Add(gb);
            }

            control.Controls.Clear();
            control.Controls.Add(pan);
        }

        public async Task DisplayBase()
        {
            string connstr = @"...";
            SqlConnection con = new SqlConnection(connstr);

            using (con)
            {
                await con.OpenAsync();

                //загружаем схему
                IEnumerable<string> table_names = QueryTableNames(con);
                List<DataTable> tables = new List<DataTable>(table_names.Count());
                SqlCommand cmd;

                //загружаем данные
                foreach (string t in table_names)
                {
                    cmd = new SqlCommand("SELECT * FROM [" + t + "]", con);
                    tables.Add(await QueryTable(cmd, t));
                }

                //отображаем данные в элементе panel1
                panel1.SuspendLayout();
                DisplayTables(panel1, tables);
                panel1.ResumeLayout();
            }
        }

        private async void Form1_Load(object sender, EventArgs e)
        {                                    
            await DisplayBase();              
        }              
    }  
}

ответ дан 13 июн 2019 в 5:19

MSDN.WhiteKnight's user avatar

MSDN.WhiteKnightMSDN.WhiteKnight

20k6 золотых знаков35 серебряных знаков80 бронзовых знаков

Понравилась статья? Поделить с друзьями:
  • Выживаем на слабом пк меняем windows xp на windows embedded 7
  • Вывести экран смартфона на ноутбук windows 10
  • Выборочная установка windows 10 что это
  • Вы используете другие антивирусные службы windows 10 как отключить
  • Выделить экран для скриншота windows 10