Подключение к sql-серверу и асинхронность


Если вы создаете программы для windows в Visual Studio (windows forms, .NET, CLI) то практически совершенно неважно, на каком это происходит языке программирования: C++ или C# - отличия будут только в синтаксисе. Вот, например, одна из моих предыдущих статей по работе с базами данных на C++ - практически один в один её можно скопировать для C#, только чуток кода подредактировать. Именно поэтому я не буду заниматься такими вещами, а освещу пару новых моментов, нюансов, так сказать.



Проблемы подключения к серверу SQL

Начнём со строки подключения:

string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename='D:\Новая папка\Ежедневник\WindowsFormsApp1\WindowsFormsApp1\Database1.mdf';Integrated Security=True";
Обратите внимание на знак собаки перед переменной – это необходимо, чтобы не ставить двойные слеши. Кроме этого, в разных версиях визуал студио могут быть разные встроенные версии серверов. Например, в моей 2015 Enterprise - (localdb)\MSSQLLocalDB. Могут быть и другие:

  • (localdb)\V11.0
  • (local)\SQLEXPRESS
Можно их установить дополнительно. Например, скачать отсюда. При переносе проекта на другой компьютер, убедитесь, чта на нем версия сервера не ниже той, с которой вы рабоатет. Также могут потребоваться изменить и другие параметры строки подключения.

Асинхронные запросы к базе C#

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

Чтобы работать асинхронно, для начала перед названием метода добавьте ключевое слово async:

private async void Контакты_Load(object sender, EventArgs e)
        {
string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename='D:\Новая папка\Ежедневник\WindowsFormsApp1\WindowsFormsApp1\Database1.mdf';Integrated Security=True";
sqlConnection = new SqlConnection(connectionString);
Далее мы не просто открываем соединение, а с помощью метода OpenAsync:

await sqlConnection.OpenAsync();
SqlDataReader sqlReader = null;
SqlCommand command = new SqlCommand("SELECT * FROM [contacts]", sqlConnection);
Читаем также асинхронно:

	
try
{
sqlReader = await command.ExecuteReaderAsync();
while (await sqlReader.ReadAsync())
                {
listBox1.Items.Add(Convert.ToString(sqlReader ["Id"]);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString(), ex.Source.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
Не забываем закрыть соединение:

finally
{
if (sqlReader != null)
sqlReader.Close();
}
}
Если вам нужна помощь по базам данных, то вы всегда можете написать мне. За небольшую плату вам будет оказана быстрая и квалифицированная помощь.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, базы данных, си шарп, sql




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




Java: наибольшее число, оканчивающееся на 0
Рекурсия папок с помощью C#
Программа для тестов: подключаем Firebird