Windows forms подключение к sql server

Technical articles, content and resources for IT Professionals working in Microsoft technologies

Best way to validate users is using SSMS (SQL-Server Management Studio) by traversing to the security tab under the database using the Object Explorer.

Checking permissions can be done in SSMS by creating a new query window and point to the catalog using the following query where @LoginName is the user to check table permissions on. For more on this query see the following

TechNet article.

Since user name and user password will be travelling between forms and classes this information must be protected. The following class may not meet each developers security requirements, if not replace with what meets these requirements.

using
System;

using
System.IO;

using
System.Security.Cryptography;

using
System.Text;

namespace
LoginLibrary.SecurityClasses

{

    namespace
SecurityClasses

    {

        /// <summary>

        /// Simple encryption decryption of strings

        /// </summary>

        public
class
Encryption

        {

            public
byte[] Encrypt(string
plainText, string
secretKey)

            {

                byte[] encryptedPassword =
null;

                using
(var outputStream = new
MemoryStream())

                {

                    RijndaelManaged algorithm = getAlgorithm(secretKey);

                    using
(var cryptoStream = new
CryptoStream(outputStream,

                        algorithm.CreateEncryptor(), CryptoStreamMode.Write))

                    {

                        byte[] inputBuffer = Encoding.Unicode.GetBytes(plainText);

                        cryptoStream.Write(inputBuffer, 0, inputBuffer.Length);

                        cryptoStream.FlushFinalBlock();

                        encryptedPassword = outputStream.ToArray();

                    }

                }

                return
encryptedPassword;

            }

            public
string
Decrypt(
byte[] encryptedBytes,
string
secretKey)

            {

                string
plainText = null;

                using
(var inputStream = new
MemoryStream(encryptedBytes))

                {

                    RijndaelManaged algorithm = getAlgorithm(secretKey);

                    using
(var cryptoStream = new
CryptoStream(inputStream,

                        algorithm.CreateDecryptor(), CryptoStreamMode.Read))

                    {

                        byte[] outputBuffer =
new
byte
[((int)(inputStream.Length - 1)) + 1];

                        int
readBytes = cryptoStream.Read(outputBuffer, 0, (int)inputStream.Length);

                        plainText = Encoding.Unicode.GetString(outputBuffer, 0, readBytes);

                    }

                }

                return
plainText;

            }

            private
RijndaelManaged getAlgorithm(string
secretKey)

            {

                const
string
salt =
"akl~jdf";

                const
int
keySize = 256;

                var keyBuilder =
new
Rfc2898DeriveBytes(secretKey, Encoding.Unicode.GetBytes(salt));

                var algorithm =
new
RijndaelManaged {KeySize = keySize};

                algorithm.IV = keyBuilder.GetBytes(Convert.ToInt32(algorithm.BlockSize / 8.0));

                algorithm.Key = keyBuilder.GetBytes(Convert.ToInt32(algorithm.KeySize / 8.0));

                algorithm.Padding = PaddingMode.PKCS7;

                return
algorithm;

            }

        }

    }

}

This window/form consist of a TextBox for user name, a TextBox for user password were the password is masked with the option to unmask using a CheckBox to toggle visibility. A Button to perform the login, another button to cancel logging in.

 There
are no limitations for failed login attempts. 

Once clicking the OK (login button) button an assertion is performed to ensure both user name and user passwords have been entered. If either is missing no login attempt is executed. If both user name and user password have been entered an instance of the
Encryption class is instantiated followed by encrypting both user name and user password.

var encryption =
new
Encryption();

// encrypt user name and password

var userNameBytes = encryption.Encrypt(UserNameTextBox.Text,
"111");

var passwordBytes = encryption.Encrypt(PasswordTextBox.Text,
"111");

This is followed by creating an instance of the DatabaseUser class which attempts to connection to a specific database on a specific instance of SQL-Server where the encrypted user name and user password are used in a connection string. Both server name and
default catalog are passed through the constructor for DatabaseUser class.

An attempt is made to connect within a try/catch where there are multiple catch sections, one for failed login in regards to user name and user password, another for any other sql server exception and one for general exceptions.

Returning results is the responsibility of the following class.

namespace
LoginLibrary.SupportClasses

{

    namespace
SupportClasses

    {

        public
class
SqlServerLoginResult

        {

            public
bool
Success {
get;
set;}

            public
bool
Failed => Success ==
false;

            public
bool
GenericException {
get;
set;}

            public
string
Message {
get;
set;}

            public
override
string
ToString()

            {

                return
Message;

            }

        }

    }

}

DatabaseUser class which determine if a connection can be established, if so or not the connection objects are disposed of before returning to the login form.

using
System;

using
System.Data.SqlClient;

using
LoginLibrary.SecurityClasses.SecurityClasses;

using
LoginLibrary.SupportClasses.SupportClasses;

namespace
LoginLibrary.DataClasses

{

    namespace
DataClasses

    {

        /// <summary>

        /// Responsible to validating a user has permissions

        /// to access the database, not tables.

        /// </summary>

        public
class
DatabaseUser

        {

            private
string
serverName;

            private
string
catalogName;

            public
DatabaseUser(string
pServerName, string
pCatalogName)

            {

                serverName = pServerName;

                catalogName = pCatalogName;

            }

            public
SqlServerLoginResult Login(byte[] pNameBytes,
byte[] pPasswordBytes)

            {

                var loginResult =
new
SqlServerLoginResult();

                var secureOperations =
new
Encryption();

                var userName = secureOperations.Decrypt(pNameBytes,
"111");

                var userPassword = secureOperations.Decrypt(pPasswordBytes,
"111");

                string
ConnectionString =

                    $"Data Source={serverName};"
+

                    $"Initial Catalog={catalogName};"
+

                    $"User Id={userName};Password={userPassword};"
+

                    "Integrated Security=False";

                using
(var cn = new
SqlConnection {ConnectionString = ConnectionString})

                {

                    try

                    {

                        cn.Open();

                        loginResult.Success =
true;

                    }

                    catch
(SqlException failedLoginException) when (failedLoginException.Number == 18456)

                    {

                        loginResult.Success =
false;

                        loginResult.GenericException =
false;

                        loginResult.Message =
"Can not access data.";

                    }

                    catch
(SqlException genericSqlException)

                    {

                        loginResult.Success =
false;

                        loginResult.GenericException =
false;

                        loginResult.Message =
"Can not access data.";

                    }

                    catch
(Exception ex)

                    {

                        loginResult.Success =
false;

                        loginResult.GenericException =
true;

                        loginResult.Message = ex.Message;

                    }

                }

                return
loginResult;

            }

        }

    }

}

Back in the login form results are inspected, if the connection was successful the login form is hidden, an instance of the application main form is created passing in the encrypted user name and user password (will be decrypted later).

var results = ops.Login(userNameBytes, passwordBytes);

//

// Login recognized (does not know if the user has proper permissions to the tables at this point)

//

if
(results.Success)

{

    Hide();

    var mainForm =
new
MainForm(userNameBytes, passwordBytes);

    mainForm.ShowDialog();

}

else

{

    MessageBox.Show(results.Message);

}

In the main form constructor encrypted user name and user password are assigned to private form level variables which will be used in the main form load event (this may be done in form shown event rather than the main form load event if so desired).

using
System;

using
System.Windows.Forms;

using
LoginLibrary.DataClasses.DataClasses;

namespace
LoginUserInterface

{

    public
partial
class
MainForm

    {

        private
readonly
byte
[] _userNameBytes;

        private
readonly
byte
[] _userPasswordBytes;

        private
readonly
BindingSource _productBindingSource =
new
BindingSource();

        public
MainForm(byte[] pNameBytes,
byte[] pPasswordBytes)

        {

            InitializeComponent();

            _userNameBytes = pNameBytes;

            _userPasswordBytes = pPasswordBytes;

        }

        private
void
MainForm_Load(
object
sender, EventArgs e)

        {

            var ops =
new
DataOperations(

                _userNameBytes,

                _userPasswordBytes,

                "KARENS-PC",

                "UserLoginExample");

            var productTable = ops.ReadProductsByCategory(1);

            if
(ops.IsSuccessFul)

            {

                _productBindingSource.DataSource = productTable;

                ProductsDataGridView.DataSource = _productBindingSource;

            }

            else

            {

                MessageBox.Show($"Encountered issues: {ops.LastExceptionMessage}");

            }

        }

        private
void
MainFormClosed(
object
sender, FormClosedEventArgs e)

        {

            Application.ExitThread();

        }

    }

}

Above, in form load an instance for the data class responsible for reading data is created passing in user name, user password, server name and database name.

using
System;

using
System.Data;

using
System.Data.SqlClient;

using
System.Linq;

using
LoginLibrary.SecurityClasses.SecurityClasses;

using
SupportLibrary;

namespace
LoginLibrary.DataClasses

{

    namespace
DataClasses

    {

        public
class
DataOperations : BaseExceptionProperties

        {

            private
string
ConnectionString;

            public
DataOperations(byte[] pNameBytes,
byte[] pPasswordBytes,
string
pServerName,
string
pCatalogName)

            {

                var secureOperations =
new
Encryption();

                ConnectionString =

                    $"Data Source={pServerName};Initial Catalog={pCatalogName};"
+

                    $"User Id={secureOperations.Decrypt(pNameBytes, "111")};"
+

                    $"Password={secureOperations.Decrypt(pPasswordBytes, "111")};"
+

                    "Integrated Security=False";

                Console.WriteLine();

            }

            /// <summary>

            /// Connect to database via validated user name and password passed in the

            /// new constructor.

            ///

            /// There are still failure points which include permissions to the tables

            /// for the user.

            /// </summary>

            /// <param name="pCategoryIdentifier"></param>

            /// <returns></returns>

            public
DataTable ReadProductsByCategory(int
pCategoryIdentifier)

            {

                mHasException =
false;

                var productDataTable =
new
DataTable();

                var selectStatement =

                    "SELECT "
+

                    "P.ProductID , P.ProductName , P.SupplierID , P.CategoryID , "
+

                    "P.QuantityPerUnit , P.UnitPrice , P.UnitsInStock , "
+

                    "S.CompanyName AS Supplier FROM dbo.Products AS P "
+

                    "INNER JOIN dbo.Categories AS C ON P.CategoryID = C.CategoryID "
+

                    "INNER JOIN dbo.Suppliers AS S ON P.SupplierID = S.SupplierID "
+

                    "WHERE(P.CategoryID = @CategoryID); ";

                using
(var cn = new
SqlConnection {ConnectionString = ConnectionString})

                {

                    using
(var cmd = new
SqlCommand {Connection = cn})

                    {

                        cmd.Parameters.AddWithValue("@CategoryID",
pCategoryIdentifier);

                        cmd.CommandText = selectStatement;

                        try

                        {

                            cn.Open();

                            productDataTable.Load(cmd.ExecuteReader());

                            var identifiers = productDataTable

                                .Columns.Cast<DataColumn>()

                                .Where((column) => column.ColumnName.EndsWith("ID"))

                                .Select((item) => item.ColumnName).ToList();

                            foreach
(string
columnName in
identifiers)

                            {

                                productDataTable.Columns[columnName].ColumnMapping = MappingType.Hidden;

                            }

                        }

                        catch
(Exception ex)

                        {

                            mHasException =
true;

                            mLastException = ex;

                        }

                    }

                }

                return
productDataTable;

            }

        }

    }

}

 All
code presented there is both assertion and proper exception handling which is important when writing code, especially when working with external databases.

SqlCredential
class Jump provides
a more secure way to specify the password for a login attempt using SQL Server Authentication.  Here the credentials are set outside of the connection string to mitigate the memory dump vulnerability for keeping username and password in the connection string. This
helps mitigate the threat of credentials being leaked out to the page file in a page swap or being evident in a crash dump.

To use credentials working with the code sample above the method signature remain the same as well as the try-catch. The difference between this method and the latter is SqlCredential requires a SecureString along with setting Credential property of the Connection
to the new instance of SqlCredential.

public
SqlServerLoginResult SqlCredentialLogin(byte[] pNameBytes,
byte[] pPasswordBytes)

{

    var loginResult =
new
SqlServerLoginResult();

    var secureOperations =
new
Encryption();

    var userName = secureOperations.Decrypt(pNameBytes,
"111");

    var userPassword = secureOperations.Decrypt(pPasswordBytes,
"111");

    string
connectionString = $"Data Source={serverName};"
+

                              $"Initial Catalog={catalogName};";

    var securePassword =
new
SecureString();

    foreach
(var character in
userPassword)

    {

        securePassword.AppendChar(character);

    }

    securePassword.MakeReadOnly();

    var credentials =
new
SqlCredential(userName, securePassword);

    using
(var cn = new
SqlConnection {ConnectionString = connectionString})

    {

        try

        {

            cn.Credential = credentials;

            cn.Open();

            loginResult.Success =
true;

        }

        catch
(SqlException failedLoginException) when (failedLoginException.Number == 18456)

        {

            loginResult.Success =
false;

            loginResult.GenericException =
false;

            loginResult.Message =
"Can not access data.";

        }

        catch
(SqlException genericSqlException)

        {

            loginResult.Success =
false;

            loginResult.GenericException =
false;

            loginResult.Message =
"Can not access data.";

        }

        catch
(Exception ex)

        {

            loginResult.Success =
false;

            loginResult.GenericException =
true;

            loginResult.Message = ex.Message;

        }

    }

    return
loginResult;

}

The login form code is the exact same as the first code sample except for calling SqlCredentialLogin rather than Login.

using
System;

using
System.Windows.Forms;

using
LoginLibrary.DataClasses.DataClasses;

using
LoginLibrary.SecurityClasses.SecurityClasses;

namespace
SqlCredentialLoginInterface

{

    public
partial
class
LoginForm

    {

        public
LoginForm()

        {

            InitializeComponent();

        }

        private
void
ShowHidePasswordCheckBox_CheckedChanged(
object
sender, EventArgs e)

        {

            PasswordTextBox.PasswordChar = ShowHidePasswordCheckBox.Checked ?
'*' : '';

        }

        /// <summary>

        /// Perform login

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private
void
LoginButton_Click(
object
sender, EventArgs e)

        {

            if
(!string.IsNullOrWhiteSpace(UserNameTextBox.Text) && !string.IsNullOrWhiteSpace(PasswordTextBox.Text))

            {

                /*

                 * Change server if not using SQLEXPRESS

                 */

                var ops =
new
DatabaseUser(
".\SQLEXPRESS",
"UserLoginExample");

                var encryption =
new
Encryption();

                // encrypt user name and password

                var userNameBytes = encryption.Encrypt(UserNameTextBox.Text,
"111");

                var passwordBytes = encryption.Encrypt(PasswordTextBox.Text,
"111");

                var results = ops.SqlCredentialLogin(userNameBytes, passwordBytes);

                //

                // Login recognized (does not know if the user has proper permissions to the tables at this point)

                //

                if
(results.Success)

                {

                    Hide();

                    var mainForm =
new
MainForm(userNameBytes, passwordBytes);

                    mainForm.ShowDialog();

                }

                else

                {

                    MessageBox.Show(results.Message);

                }

            }

            else

            {

                MessageBox.Show("Incomplete information to continue.");

            }

        }

        private
void
CancelButton_Click(
object
sender, EventArgs e)

        {

            Close();

        }

    }

}

This article has provided code to provide a login to your SQL-Server database when Windows authentication is not an option for Window form projects.

Приветствую всех, в этом примере я покажу как просто создать приложения позволяющее, изменять, обновлять и удалять запись в базе данных 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();

        }

    }

}

Содержание

  1. Windows forms база данных sql
  2. Создание базы данных и добавление таблиц в Visual Studio
  3. Предварительные требования
  4. Создание проекта и файла локальной базы данных
  5. Добавление источника данных
  6. Просмотр свойств подключения к данным
  7. Создание таблиц и ключей с помощью конструктор таблиц
  8. Создание таблицы Customers
  9. Создание таблицы Orders
  10. Создание внешнего ключа
  11. Заполнение таблиц данными
  12. Создание формы Windows Forms для поиска данных
  13. Предварительные требования
  14. создание приложения Windows Forms
  15. Создание источника данных
  16. Создание источника данных
  17. Создание формы
  18. Добавление параметризации (функции поиска) в запрос
  19. Тестирование приложения
  20. Дальнейшие действия
  21. Работа с базами данных в Windows Forms с использованием языка программирования C++
  22. Создание простого приложения для работы с данными с помощью ADO.NET
  23. Предварительные требования
  24. Настройка образца базы данных
  25. Создание форм и добавление элементов управления
  26. Сохранение строки подключения
  27. Написание кода для форм
  28. Форма навигации
  29. Преобразование формы навигации в начальную форму
  30. Создание автоматически создаваемых обработчиков событий
  31. Добавление кода для логики формы навигации
  32. Форма NewCustomer
  33. Создание автоматически создаваемых обработчиков событий
  34. Добавление кода для логики формы NewCustomer
  35. Форма FillOrCancel
  36. Создание автоматически создаваемых обработчиков событий
  37. Добавление кода для логики формы Филлорканцел
  38. Тестирование приложения

Windows forms база данных sql

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

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

datagridview

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

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

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

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

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

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

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

Источник

Создание базы данных и добавление таблиц в Visual Studio

Visual Studio можно использовать для создания и обновления файла локальной базы данных в SQL Server Express LocalDB. можно также создать базу данных, выполнив инструкции Transact-SQL в окне инструментов обозревателя объектов SQL Server в Visual Studio. В этом разделе мы создадим MDF файл и добавим таблицы и ключи с помощью Конструктор таблиц.

Предварительные требования

Создание проекта и файла локальной базы данных

в строке меню выберите Project > добавить новый элемент.

В списке шаблонов элементов прокрутите вниз и выберите база данных на основе службы.

visual studio add service databaseбазы данных на основе службы» data-linktype=»relative-path»>

raddata vsitemtemplatesбазы данных на основе службы» data-linktype=»relative-path»>

Присвойте базе данных имя сампледатабасе и нажмите кнопку Добавить.

Добавление источника данных

если окно источники данных не открыто, откройте его, нажав клавиши Shift + Alt + D или выбрав просмотреть > другие Windows > источники данных в строке меню.

В окне Источники данных выберите Добавить новый источник данных.

add new data source

add new data source

На странице Выбор подключения к данным выберите файл сампледатабасе. mdf в раскрывающемся списке и нажмите кнопку Далее.

На странице сохранить строку подключения в файле конфигурации приложения нажмите кнопку Далее.

На странице Выбор объектов базы данных появится сообщение о том, что база данных не содержит объектов. Нажмите кнопку Готово.

Просмотр свойств подключения к данным

Создание таблиц и ключей с помощью конструктор таблиц

В этом разделе вы создадите две таблицы, первичный ключ в каждой таблице и несколько строк образца данных. Вы также создадите внешний ключ, чтобы указать, как записи в одной таблице соответствуют записям в другой таблице.

Создание таблицы Customers

Щелкните правой кнопкой мыши таблицы и выберите команду Добавить новую таблицу.

Будет открыт Конструктор таблиц, отобразится сетка с одной строкой по умолчанию, которая представляет один столбец в создаваемой таблице. Путем добавления строк в сетку будут добавлены столбцы в таблицу.

В сетке добавьте строку для каждой из следующих записей.

Имя столбца Тип данных Разрешить значения null
CustomerID nchar(5) False (не установлен)
CompanyName nvarchar(50) False (не установлен)
ContactName nvarchar (50) True (установлен)
Phone nvarchar (24) True (установлен)

Щелкните строку правой кнопкой мыши CustomerID и выберите пункт Задать первичный ключ.

Щелкните строку по умолчанию () правой кнопкой мыши Id и выберите пункт Удалить.

Назовите таблицу «Клиенты» путем обновления первой строки в области скриптов, как показано в следующем примере:

Отобразятся примерно следующие сведения:

table designer

table designer

В левом верхнем углу Конструктор таблиц выберите Обновить или нажмите клавиши SHIFT + ALT + U.

В диалоговом окне Предварительный просмотр обновлений базы данных выберите обновить базу данных.

Таблица Customers создается в файле локальной базы данных.

Создание таблицы Orders

Создайте еще одну таблицу, а затем добавьте строку для каждой записи следующей таблицы.

Имя столбца Тип данных Разрешить значения null
OrderID int False (не установлен)
CustomerID nchar(5) False (не установлен)
OrderDate datetime True (установлен)
OrderQuantity int True (установлен)

Задайте OrderID в качестве первичного ключа, а затем удалите строку по умолчанию.

Назовите таблицу «Заказы» путем обновления первой строки в области скриптов, как показано в следующем примере:

В левом верхнем углу Конструктор таблиц выберите Обновить или нажмите клавиши SHIFT + ALT + U.

В диалоговом окне Предварительный просмотр обновлений базы данных выберите обновить базу данных.

Таблица Orders создается в файле локальной базы данных. Если развернуть узел таблицы в обозреватель сервера, отобразятся две таблицы:

server explorer tables node

server explorer tables node

Если вы не видите его, нажмите кнопку Обновить на панели инструментов.

Создание внешнего ключа

В контекстной области в правой части сетки конструктор таблиц для таблицы Orders щелкните правой кнопкой мыши внешние ключи и выберите Добавить новый внешний ключ.

add foreign key

В появившемся текстовом поле замените текст ToTable на Customers.

в области T-SQL обновите последнюю строку, чтобы она соответствовала следующему примеру:

В левом верхнем углу Конструктор таблиц выберите Обновить (SHIFT + ALT + U).

В диалоговом окне Предварительный просмотр обновлений базы данных выберите обновить базу данных.

Создается внешний ключ.

Заполнение таблиц данными

в обозреватель сервера или SQL Server обозревателе объектов разверните узел образца базы данных.

Откройте контекстное меню таблицы Customers и выберите Просмотреть данные.

Добавьте необходимые данные для некоторых клиентов.

Можно указать любые пять символов как ИД клиентов, но хотя бы один нужно выбрать и запомнить для дальнейшего использования в этой процедуре.

Откройте контекстное меню таблицы Orders и выберите пункт отобразить данные таблицы.

Добавление данных для некоторых заказов. При вводе каждой строки она сохраняется в базе данных.

Убедитесь, что все идентификаторы заказов и количества заказов — целые числа, и каждый идентификатор клиента соответствует значению, указанному в столбце CustomerID таблицы клиентов.

Поздравляем! Теперь вы умеете создавать таблицы, связывать их с внешним ключом и добавлять данные.

Источник

Создание формы Windows Forms для поиска данных

Довольно распространенным сценарием приложения является отображение выбранных данных на форме. Например, вам может потребоваться отобразить заказы для определенного клиента или сведения о конкретном заказе. В таком сценарии пользователь вводит в форму информацию, после чего выполняется запрос, включающий в себя эти введенные пользователем данные в качестве параметра; таким образом, данные выбираются на основе параметризированного запроса. Запрос возвращает только те данные, которые удовлетворяют введенным пользователем условиям. Это пошаговое руководство показывает, как создать запрос, возвращающий клиентов из определенного города, и изменить пользовательский интерфейс, чтобы пользователи могли ввести название города и нажать кнопку для выполнения запроса.

Использование параметризованных запросов помогает сделать приложение эффективным, так как позволяет базе данных заниматься своей непосредственной задачей — быстрой фильтрацией записей. И наоборот, если запросить всю таблицу базы данных, передать ее по сети и использовать логику приложения для поиска записей, ваше приложение станет медленным и неэффективным.

В данном пошаговом руководстве представлены следующие задачи.

Создание отображающих данные элементов управления с помощью перетаскивания элементов из окна Источники данных на форму.

Добавление элементов управления для отображения данных на форме.

Ввод параметров в форму и выполнение параметризованного запроса.

Предварительные требования

Необходимо установить рабочую нагрузку » Хранение и обработка данных «. См. раздел Изменение Visual Studio.

в этом пошаговом руководстве используется SQL Server Express LocalDB и образец базы данных Northwind.

если у вас нет SQL Server Express LocalDB, установите его на странице загрузки SQL Server Expressили с помощью Visual Studio Installer. в Visual Studio Installer можно установить SQL Server Express LocalDB как часть рабочей нагрузки хранения и обработки данных или как отдельный компонент.

Установите учебную базу данных Northwind, выполнив следующие действия.

Откроется окно редактора запросов.

скопируйте скрипт Transact-SQL Northwind в буфер обмена. этот сценарий T-SQL создает базу данных Northwind с нуля и заполняет ее данными.

По истечении короткого времени выполнение запроса завершается и создается база данных Northwind.

создание приложения Windows Forms

Создание источника данных

На этом шаге Мастер настройки источника данных используется для создания источника данных из базы данных.

В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.

На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.

На странице Выбор подключения к базе данных выполните одно из следующих действий:

Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.

Выберите Новое подключение для открытия диалогового окна Добавить/изменить подключение.

Если базе данных требуется пароль, выберите параметр для включения конфиденциальных данных и нажмите кнопку Далее.

На странице Сохранение подключения в файле конфигурации приложения нажмите кнопку Далее.

Разверните узел Таблицы на странице Выбор объектов базы данных.

Выберите таблицу Клиенты и нажмите Готово.

Объект NorthwindDataSet добавляется в проект, и таблица Клиенты отображается в окне Источники данных.

Создание источника данных

На этом шаге Мастер настройки источника данных используется для создания источника данных из базы данных.

В окне Источники данных выберите Добавить новый источник данных, чтобы запустить Мастер настройки источника данных.

На странице Выбор типа источника данных выберите элемент База данных и нажмите Далее.

На экране Выбор модели базы данных выберите набор данных, а затем нажмите кнопку Далее.

На странице Выбор подключения к базе данных выполните одно из следующих действий:

Если подключение к учебной базе данных Northwind доступно в раскрывающемся списке, то выберите его.

Выберите Новое подключение для открытия диалогового окна Добавить/изменить подключение.

На странице Сохранение подключения в файле конфигурации приложения нажмите кнопку Далее.

Разверните узел Таблицы на странице Выбор объектов базы данных.

Выберите таблицу Клиенты и нажмите Готово.

Объект NorthwindDataSet добавляется в проект, и таблица Клиенты отображается в окне Источники данных.

Создание формы

Можно создать элементы управления с привязкой к данным, перетащив элементы из окна Источники данных на форму:

убедитесь, что конструктор Windows Forms имеет активное фокус, а окно источники данных открыто и закреплено.

Разверните узел Customers в окне Источники данных.

Перетащите узел Клиенты из окна Источники данных на свою форму.

На форме появляются DataGridView и полоса инструментов (BindingNavigator) для перемещения по записям. В области компонентов появляется NorthwindDataSet, CustomersTableAdapter, BindingSource и BindingNavigator.

Добавление параметризации (функции поиска) в запрос

Предложение WHERE можно добавить в исходный запрос с помощью диалогового окна Построитель условий поиска :

Добавьте WHERE City = @City в запрос в области Текст запроса.

Запрос должен выглядеть примерно следующим образом:

Нажмите кнопку ОК, чтобы закрыть диалоговое окно Построитель условий поиска.

На форму добавляется FillByCityToolStrip.

Тестирование приложения

При запуске приложения открывается форма, и она готова принять параметр в качестве входных данных:

Нажмите клавишу F5 для запуска приложения.

Введите Лондон в текстовом поле Город и щелкните FillByCity.

Сетка данных заполняется клиентами, которые удовлетворяют критериям. В этом примере сетка данных отображает только клиентов, для которых в столбце Город задано значение Лондон.

Дальнейшие действия

В зависимости от требований приложения существуют несколько шагов, которые, возможно, потребуется выполнить после создания параметризованной формы. Ниже приводится перечень рекомендаций, позволяющих улучшить полученный результат.

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

Изменение набора данных для добавления или удаления объектов базы данных. Дополнительные сведения см. в разделе, посвященном созданию и настройке наборов данных.

Источник

Работа с базами данных в Windows Forms с использованием языка программирования C++

Как известно, начиная с версии 2008, работа с базами данных (БД) в Windows Forms средствами Microsoft Visual C++ (VC++) невозможна. Однако это не совсем так.

Начиная с версии 2008, стала недоступна работа с БД с помощью уже привычного графического интерфейса. То есть, для работы с ними нельзя создать и настроить, а, следовательно, и использовать, не визуальные элементы управления DataSet, BindingSource и TableAdapter. В то же время возможно работы с БД при помощи «обычных» классов ADO.NET полностью сохранилась.

Для реализации взаимодействия с БД служат «обычные» классы OleDbConnection, OleDbCommand и OleDbDataReader. Но, в виду того, что в Windows Forms используется управляемый код с привязкой C++/CLI, их использование имеет некоторые особенности.

Рассмотрим пример. Есть БД Microsoft Office Access, которая содержит список авторов книг в таблице Author.

Tablitsa

Создадим простое приложение, которое будет загружать данные из этой таблицы (надписи элементов управления, включая заголовки столбцов DataGridView, предварительно настроены с помощью визуального конструктора).

DoPolucheniyaDannyih

Данные будем загружать в элемент управления DataGridView при нажатии на кнопку «Получить данные».

Создадим в обработчике события нажатия этой кнопки подключение к БД.

Источник

Создание простого приложения для работы с данными с помощью ADO.NET

В этой статье демонстрируется простой способ быстрого получения данных из базы данных. Если приложению необходимо изменить данные с помощью нетривиальных способов и обновить базу данных, следует рассмотреть возможность использования Entity Framework и привязки данных для автоматической синхронизации элементов управления пользовательского интерфейса с изменениями в базовых данных.

С целью упрощения код не включает обработку исключений для выполнения в рабочей среде.

Предварительные требования

Для создания приложения вам потребуются следующие компоненты.

SQL Server Express LocalDB. если у вас нет SQL Server Express LocalDB, его можно установить на странице загрузки SQL Server Express.

Настройка образца базы данных

Создайте образец базы данных, выполнив следующие действия.

щелкните правой кнопкой мыши подключения к данным и выберите команду создать новую базу данных SQL Server.

В текстовом поле имя сервера введите (LocalDB) mssqllocaldb.

В текстовом поле имя новой базы данных введите Sales, а затем нажмите кнопку ОК.

Пустая база данных Sales создается и добавляется в узел подключения к данным в обозреватель сервера.

Щелкните правой кнопкой мыши подключение к данным о продажах и выберите создать запрос.

Откроется окно редактора запросов.

По истечении короткого времени выполнение запроса завершается и создаются объекты базы данных. База данных содержит две таблицы: Customer и Orders. Эти таблицы изначально не содержат данных, но их можно добавить при запуске создаваемого приложения. База данных также содержит четыре простые хранимые процедуры.

Создание форм и добавление элементов управления

Создайте проект для приложения Windows Forms и назовите его SimpleDataApp.

Visual Studio создает проект и несколько файлов, включая пустую форму Windows Forms с именем Form1.

Добавьте две формы Windows Forms в проект, чтобы он включал три формы, и назначьте им следующие имена:

Навигация

NewCustomer

FillOrCancel

Для каждой формы добавьте текстовые поля, кнопки и другие элементы управления, которые отображаются на рисунках ниже. Для каждого элемента управления задайте свойства, указанные в таблицах.

Элементы управления «группа» и «надпись» обеспечивают большую ясность, но не используются в коде.

Форма навигации

simpleappnav

Элементы управления формы навигации Элемент Property
Кнопка Name = btnGoToAdd
Кнопка Name = btnGoToFillOrCancel
Кнопка Name = btnExit

Форма NewCustomer

simpleappnewcust

Элементы управления формы NewCustomer Элемент Property
TextBox Name = txtCustomerName
TextBox Name = txtCustomerID

Readonly = True

Кнопка Name = btnCreateAccount
NumericUpDown DecimalPlaces = 0

Name = numOrderAmount

DateTimePicker Format = Short

Name = dtpOrderDate

Кнопка Name = btnPlaceOrder
Кнопка Name = btnAddAnotherAccount
Кнопка Name = btnAddFinish

Форма FillOrCancel

simpleappcancelfill

Элементы управления формы FillOrCancel Элемент Property
TextBox Name = txtOrderID
Кнопка Name = btnFindByOrderID
DateTimePicker Format = Short

Name = dtpFillDate

DataGridView Name = dgvCustomerOrders

RowHeadersVisible = False

Кнопка Name = btnCancelOrder
Кнопка Name = btnFillOrder
Кнопка Name = btnFinishUpdates

Сохранение строки подключения

Когда приложение пытается открыть подключение к базе данных, оно должно иметь доступ к строке подключения. Чтобы не вводить строку вручную в каждой форме, сохраните строку в файле App.config в проекте и создайте метод, возвращающий строку при вызове метода из любой формы в приложении.

В списке тип выберите (строка подключения).

В списке область выберите приложение.

В столбце значение введите строку подключения (без кавычек), а затем сохраните изменения.

В реальных приложениях строку подключения следует хранить безопасно, как описано в разделе строки подключения и файлы конфигурации.

Написание кода для форм

Этот раздел содержит краткие обзоры того, что делает каждая форма. Он также предоставляет код, определяющий базовую логику при нажатии кнопки на форме.

Форма навигации

Форма навигации открывается при запуске приложения. Кнопка Добавить учетную запись открывает форму NewCustomer. Кнопка Выполнение или отмена заказов открывает форму FillOrCancel. Кнопка Выход закрывает приложение.

Преобразование формы навигации в начальную форму

При использовании C# в обозревателе решений откройте файл Program.cs и измените строку Application.Run на следующую: Application.Run(new Navigation());

Создание автоматически создаваемых обработчиков событий

Дважды щелкните три кнопки в форме навигации, чтобы создать пустые методы обработчика событий. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажать кнопку для вызова события.

Добавление кода для логики формы навигации

На странице кода для формы навигации заполните основные тексты методов для трех обработчиков событий нажатия кнопки, как показано в следующем коде.

Форма NewCustomer

Создание автоматически создаваемых обработчиков событий

Создайте пустой обработчик событий щелчка для каждой кнопки в форме NewCustomer, дважды щелкнув каждую из четырех кнопок. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажать кнопку для вызова события.

Добавление кода для логики формы NewCustomer

Чтобы завершить логику формы NewCustomer, выполните следующие действия.

Перенесите System.Data.SqlClient пространство имен в область, чтобы не указывать полные имена его членов.

Добавьте в класс некоторые переменные и вспомогательные методы, как показано в следующем коде.

Заполните основные тексты методов для четырех обработчиков событий нажатия кнопки, как показано в следующем коде.

Форма FillOrCancel

Создание автоматически создаваемых обработчиков событий

Создайте пустые обработчики событий щелчка для четырех кнопок в форме Филлорканцел, дважды щелкнув кнопки. При двойном щелчке кнопки также добавляется автоматически созданный код в файл кода конструктора, который позволяет нажать кнопку для вызова события.

Добавление кода для логики формы Филлорканцел

Чтобы завершить логику формы Филлорканцел, выполните следующие действия.

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

Добавьте в класс переменную и вспомогательный метод, как показано в следующем коде.

Заполните основные тексты методов для четырех обработчиков событий нажатия кнопки, как показано в следующем коде.

Тестирование приложения

Нажмите клавишу F5 для сборки и тестирования приложения после написания кода для каждого обработчика события нажатия кнопки и общего кода программы.

Источник

Понравилась статья? Поделить с друзьями:
  • Windows forms передача данных между формами
  • Windows forms конструктор формы как открыть
  • Windows forms как работать с графикой
  • Windows forms как открыть другую форму
  • Windows forms как запретить изменять размер окна