Работа с подключенным уровнем ADO .NET в C#
16.09.2010, 14:19. Показов 227209. Ответов 2
FAQ для раздела “ADO.NET и базы данных”
Тема: ”Работа с подключенным уровнем ADO .NET в C#”
Обсуждение ведется тут.
Содержание
1) Теоретическая часть
1.1 Поставщики данных .NET Framework (ADO.NET)
1.2 Основные объекты поставщиков данных .NET Framework:
1.3 Пару слов об интерфейсах IDataReader и IDbCommand
1.4 Подробнее о поставщике данных для SQL Server
2) Практическая часть
2.1 Как создать БД?
2.2 Как создать таблицу?
2.3 Как вывести все записи из таблицы?
2.4 Как добавить запись в таблицу?
2.5 Как удалить запись из таблицы?
2.6 Как изменить запись в таблице?
2.7 Как удалить таблицу?
2.8 Собирая все вместе
3) Заключение
1. Теоретическая часть
Здравствуйте! В этом FAQ я расскажу, некоторые основные аспекты работы с подключенным уровнем ADO .NET в C#( на примере подключения к БД MS SQL Server) и начнем мы с рассмотрения поставщиков данных:
1.1 Поставщики данных .NET Framework (ADO.NET)
Поставщик данных .NET Framework используется для установления соединения с базой данных, выполнения команд и получения результатов.Эти результаты обрабатываются непосредственно, помещаются в DataSet, чтобы по мере необходимости они были доступны для пользователей вместе с данными из нескольких источников, либо распределяются между уровнями. Источники данных .NET Framework являются упрощенными и создают минимальный уровень между источником данных и кодом, увеличивая тем самым производительность без ущерба для функциональных возможностей.
Cписок поставщиков данных .NET Framework:
• .NET Framework Поставщик данных для SQL Server
Предоставляет доступ к данным для Microsoft SQL Server 7.0 или более поздних версий.Использует пространство имен System.Data.SqlClient.
• .NET Framework Поставщик данных для OLE DB
Для источников данных OLE DB.Использует пространство имен System.Data.OleDb.
• .NET Framework Поставщик данных для ODBC
Для источников данных ODBC.Использует пространство имен System.Data.Odbc.
• .NET Framework Поставщик данных для Oracle
Для источников данных Oracle.Источник данных .NET Framework для Oracle поддерживает клиентское программное обеспечение версии 8.1.7 и старше и использует пространство имен System.Data.OracleClient.
• Поставщик EntityClient
Предоставляет доступ к данным для приложений модели EDM (Entity Data Model).Использует пространство имен System.Data.EntityClient.
1.2 Основные объекты поставщиков данных .NET Framework:
• Connection
Устанавливает соединение с конкретным источником данных.Базовым классом для всех объектов Connection является DbConnection.
• Command
Выполняет команду в источнике данных.Обеспечивает доступность Parameters и может выполнять команды в области Transaction из Connection.Базовым классом для всех объектов Command является DbCommand.
• DataReader
Считывает из источника данных однопроходный поток данных только для чтения.Базовым классом для всех объектов DataReader является DbDataReader.
• DataAdapter
Заполняет DataSet и выполняет обновления в источнике данных.Базовым классом для всех объектов DataAdapter является DbDataAdapter.
1.3 Пару слов об интерфейсах IDataReader и IDbCommand
IDataReader - интерфейс
Позволяет читать один или несколько потоков результирующих наборов только в направлении вперед, выполняя команду над источником данных. Он реализуется поставщиками данных .NET Framework, обращающимися к реляционным базам данных.
Пространство имен: System.Data
Интерфейсы IDataReader и IDataRecord позволяют классу-наследнику реализовать класс DataReader, позволяющий читать один или несколько потоков наборов результатов только в направлении вперед. Приложение создает не непосредственно экземпляр интерфейса IDataReader, а экземпляр класса, являющегося наследником IDataReader.
Классы, являющиеся наследниками IDataReader, должны реализовывать наследуемые члены. Обычно они также определяют дополнительные члены для добавления функциональных возможностей, зависящих от поставщика данных.
Изменения, внесенные в результирующий набор другим процессом или потоком во время чтения данных, могут быть видимы пользователю или классу, реализующему интерфейс IDataReader. Однако точное поведение зависит от поставщика и от временных зависимостей.
Примечания для реализующих объектов:
Для достижения единообразия среди поставщиков данных .NET Framework наследующие классы следует именовать в форме Prv "команда", где Prv — постоянный префикс, назначаемый всем классам в пространстве имен определенного поставщика данных .NET Framework. Например, Sql является префиксом класса SqlDataAdapter в пространстве имен System.Data.SqlClient.
IDbCommand - интерфейс
Представляет собой оператор SQL, исполняемый при подключении к источнику данных и реализуемый поставщиками данных .NET Framework, которые имеют доступ к реляционным базам данных.
Пространство имен: System.Data
Интерфейс IDbCommand позволяет наследующему классу реализовывать класс Command, являющийся инструкцией SQL, исполняемой в источнике данных.
Приложение создает не непосредственно экземпляр интерфейса IDbCommand, а экземпляр класса, являющегося наследником IDbCommand.
Классы, наследующие IDbCommand, должны реализовывать все наследуемые элементы. Обычно они также определяют дополнительные элементы для добавления функциональных возможностей, зависящих от поставщика. Например, интерфейс IDbCommand определяет метод ExecuteNonQuery. В свою очередь, класс SqlCommand наследует этот метод, а также определяет метод ExecuteXmlReader.
Примечания для реализующих объектов:
Для достижения единообразия среди поставщиков данных .NET Framework наследующие классы следует называть в форме PrvClassname, где Prv — постоянный префикс, назначаемый всем классам в пространстве имен определенного поставщика данных .NET Framework. Например, Sql является префиксом класса SqlCommand в пространстве имен System.Data.SqlClient.
1.4 Подробнее о поставщике данных для SQL Server
В данном FAQ мы рассмотрим 4 класса - SqlConnection, SqlCommand, SqlDataReader, SqlParameter .
SqlConnection – класс
Предоставляет открытое подключение к базе данных SQL Server.Этот класс не может быть унаследован.
Пространство имен: System.Data.SqlClient
public sealed class SqlConnection : DbConnection,
ICloneable
( http://msdn.microsoft.com/ru-r... ction.aspx )
SqlCommand – класс
Представляет инструкцию Transact-SQL или хранимую процедуру, выполняемую над базой данных SQL Server.Этот класс не может быть унаследован.
Пространство имен: System.Data.SqlClient
public sealed class SqlCommand : DbCommand,
ICloneable
( http://msdn.microsoft.com/ru-r... mmand.aspx )
SqlDataReader – класс
Предоставляет возможность чтения потока строк только в прямом направлении из базы данных SQL Server.Данный класс не может наследоваться.
Пространство имен: System.Data.SqlClient
public class SqlDataReader : DbDataReader,
IDataReader, IDisposable, IDataRecord
SqlParameter - класс
Предоставляет параметр для объекта SqlCommand и, при необходимости, его отображение на DataSet.Этот класс не может быть унаследован.
Пространство имен: System.Data.SqlClient
public sealed class SqlParameter : DbParameter,
IDbDataParameter, IDataParameter, ICloneable
( http://msdn.microsoft.com/ru-r... meter.aspx )
Подробнее о пространстве имен System.Data.SqlClient
( http://msdn.microsoft.com/ru-r... lient.aspx )
Но все это были общие понятия, а теперь перейдём к практике.
2. Практическая часть
Для всех примеров используется БД с именем Univer и одной таблицей Students, следующей структуры -
1) int ID – идентификатор
2) string FIO – ФИО студента
3) string Grupa – Группа.
и СУБД MS SQL EXPRESS
Свой материал я построил в виде ответов на вопросы
2.1 Как создать БД?
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
76
| using System;
using System.Data.SqlClient;
using System.Data;
using System.Threading;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
// Если база не обнаружена, то создаем новую
if (se.Number == 4060)
{
Console.WriteLine("Подождите, идет создание БД");
//закрываем соединение
conn.Close();
//переопределяем обьект conn, и передаем новую строку подключения
conn = new SqlConnection(@"Data Source=(local)\SQLEXPRESS;Integrated Security=True");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateDataBase
и передаем конструктору этого класса, запрос на создание БД
и объект типа SqlConnection
*/
SqlCommand cmdCreateDataBase = new SqlCommand(string.Format("CREATE DATABASE [{0}]", "Test"), conn);
//открываем подключение
conn.Open();
/*Посылаем запрос к СУБД
В данном случае, в результате запроса ничего не возврашается
ExecuteNonQuery, в последующих примерах мы будем использовать
и другие методы
*/
Console.WriteLine("Посылаем запрос");
cmdCreateDataBase.ExecuteNonQuery();
//закрываем подключение
conn.Close();
//задержка, нужна для того, чтоб БД успела создаться
Thread.Sleep(5000);
//переопределяем обьект conn, и передаем новую строку подключения
conn = new SqlConnection(connStr);
//открываем подключение
conn.Open();
}
}
finally
{
Console.WriteLine("Соедение успешно произведено");
conn.Close();
conn.Dispose();
}
}
}
} |
|
2.2 Как создать таблицу?
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
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}",se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на создание таблицы
и объект типа SqlConnection
*/
SqlCommand cmdCreateTable = new SqlCommand("CREATE TABLE " +
"Students (ID int not null" +
", FIO char(60) not null," +
" Grupa char(20) not null)", conn);
//посылаем запрос
try
{
cmdCreateTable.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка при создании таблицы");
return;
}
Console.WriteLine("Таблица создана успешно");
//закрвываем соединение
conn.Close();
conn.Dispose();
}
}
} |
|
2.3 Как вывести все записи из таблицы?
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
76
77
78
79
80
81
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}",se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на
получение всех строк таблицы Students
и объект типа SqlConnection
*/
SqlCommand cmd = new SqlCommand("Select * From Students", conn);
/*Метод ExecuteReader() класса SqlCommand возврашает
объект типа SqlDataReader, с помошью которого мы можем
прочитать все строки, возврашенные в результате выполнения запроса
CommandBehavior.CloseConnection - закрываем соединение после запроса
*/
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//цикл по всем столбцам полученной в результате запроса таблицы
for (int i = 0; i < dr.FieldCount; i++)
/*метод GetName() класса SqlDataReader позволяет получить имя столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.Write("{0}\t",dr.GetName(i).ToString().Trim());
/*читаем данные из таблицы
чтение происходит только в прямом направлении
все прочитаные строки отбрасываюся */
while (dr.Read())
{
/*метод GetValue() класса SqlDataReader позволяет получить значение столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.WriteLine("{0}\t{1}\t{2}",dr.GetValue(0).ToString().Trim(),
dr.GetValue(1).ToString().Trim(),
dr.GetValue(2).ToString().Trim());
}
}
//закрвываем соединение
conn.Close();
conn.Dispose();
Console.WriteLine();
}
}
} |
|
2.4 Как добавить запись в таблицу?
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}",se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на
добавление строки в таблицу Students
и объект типа SqlConnection
*/
SqlCommand cmd = new SqlCommand("Insert into Students" +
"(ID,FIO,Grupa) Values (@ID,@FIO,@Grupa)", conn);
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 10;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван Иванович";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@Grupa";
//задаем значение параметра
param.Value = "4-2";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Вставляем запись");
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на добавление записи");
return;
}
//Выводим значение на экран
cmd = new SqlCommand("Select * From Students", conn);
/*Метод ExecuteReader() класса SqlCommand возврашает
объект типа SqlDataReader, с помошью которого мы можем
прочитать все строки, возврашенные в результате выполнения запроса
CommandBehavior.CloseConnection - закрываем соединение после запроса
*/
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//цикл по всем столбцам полученной в результате запроса таблицы
for (int i = 0; i < dr.FieldCount; i++)
/*метод GetName() класса SqlDataReader позволяет получить имя столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.Write("{0}\t",dr.GetName(i).ToString().Trim());
/*читаем данные из таблицы
чтение происходит только в прямом направлении
все прочитаные строки отбрасываюся */
Console.WriteLine();
while (dr.Read())
{
/*метод GetValue() класса SqlDataReader позволяет получить значение столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.WriteLine("{0}\t{1}\t{2}",dr.GetValue(0).ToString().Trim(),
dr.GetValue(1).ToString().Trim(),
dr.GetValue(2).ToString().Trim());
}
}
//закрвываем соединение
conn.Close();
conn.Dispose();
Console.WriteLine();
}
}
} |
|
2.5 Как удалить запись из таблицы?
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}",se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на
удаление строк таблицы Students, которые отвечают условиям
и объект типа SqlConnection
*/
SqlCommand cmd = new SqlCommand("Delete From Students" +
" where ID = @ID and FIO = @FIO", conn);
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 10;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван Иванович";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Удаляем запись");
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на удаление записи");
Console.WriteLine("Возможно запись уже удалена");
return;
}
//Выводим значение на экран
cmd = new SqlCommand("Select * From Students", conn);
/*Метод ExecuteReader() класса SqlCommand возврашает
объект типа SqlDataReader, с помошью которого мы можем
прочитать все строки, возврашенные в результате выполнения запроса
CommandBehavior.CloseConnection - закрываем соединение после запроса
*/
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//цикл по всем столбцам полученной в результате запроса таблицы
for (int i = 0; i < dr.FieldCount; i++)
/*метод GetName() класса SqlDataReader позволяет получить имя столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.Write("{0}\t",dr.GetName(i).ToString().Trim());
/*читаем данные из таблицы
чтение происходит только в прямом направлении
все прочитаные строки отбрасываюся */
Console.WriteLine();
while (dr.Read())
{
/*метод GetValue() класса SqlDataReader позволяет получить значение столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.WriteLine("{0}\t{1}\t{2}",dr.GetValue(0).ToString().Trim(),
dr.GetValue(1).ToString().Trim(),
dr.GetValue(2).ToString().Trim());
}
}
//закрвываем соединение
conn.Close();
conn.Dispose();
Console.WriteLine();
}
}
} |
|
2.6 Как изменить запись в таблице?
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}",se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на
изменение строк таблицы Students, которые отвечают условиям
и объект типа SqlConnection
*/
SqlCommand cmd = new SqlCommand("Update Students" +
" Set ID = @ID where FIO = @FIO", conn);
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 10;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван Иванович";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Изменяем запись(и)");
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на изменение записи(ей)");
return;
}
//Выводим значение на экран
cmd = new SqlCommand("Select * From Students", conn);
/*Метод ExecuteReader() класса SqlCommand возврашает
объект типа SqlDataReader, с помошью которого мы можем
прочитать все строки, возврашенные в результате выполнения запроса
CommandBehavior.CloseConnection - закрываем соединение после запроса
*/
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
//цикл по всем столбцам полученной в результате запроса таблицы
for (int i = 0; i < dr.FieldCount; i++)
/*метод GetName() класса SqlDataReader позволяет получить имя столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.Write("{0}\t",dr.GetName(i).ToString().Trim());
/*читаем данные из таблицы
чтение происходит только в прямом направлении
все прочитаные строки отбрасываюся */
Console.WriteLine();
while (dr.Read())
{
/*метод GetValue() класса SqlDataReader позволяет получить значение столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.WriteLine("{0}\t{1}\t{2}",dr.GetValue(0).ToString().Trim(),
dr.GetValue(1).ToString().Trim(),
dr.GetValue(2).ToString().Trim());
}
}
//закрвываем соединение
conn.Close();
conn.Dispose();
Console.WriteLine();
}
}
} |
|
2.7 Как удалить таблицу?
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
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}", se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на удаление таблицы
и объект типа SqlConnection
*/
SqlCommand cmdCreateTable = new SqlCommand("DROP TABLE Student", conn);
//посылаем запрос
try
{
cmdCreateTable.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка при удалении таблицы");
return;
}
Console.WriteLine("Таблица удалена успешно");
//закрвываем соединение
conn.Close();
conn.Dispose();
}
}
} |
|
2.8 Собирая все вместе
В конце, хочу предложить простенькое консольное приложение, которое:
1) Создает новую таблицу
2) Добавляет в нее записи
3) Выводит результат в консоль
4) Изменяет некоторые из них
5) Выводит результат в консоль
6) Удаляет некоторые из них
7) Выводит результат в консоль
8) Удаляет таблицу
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
| using System;
using System.Data.SqlClient;
using System.Data;
namespace Students
{
class Program
{
static void Main(string[] args)
{
/*Объявляем строковую переменную и записываем в нее
строку подключения
Data Source - имя сервера, по стандарту (local)\SQLEXPRESS
Initial Catalog - имя БД
Integrated Security=-параметры безопасности
Мое подключение имеет вид
*/
string connStr = @"Data Source=(local)\SQLEXPRESS;
Initial Catalog=Test;
Integrated Security=True";
/*Здесь указал имя БД(хотя для создания БД его указывать не нужно)
для того, чтобы проверить, может данная БД уже создана
Создаем экземпляр класса SqlConnection по имени conn
и передаем конструктору этого класса, строку подключения
*/
SqlConnection conn = new SqlConnection(connStr);
try
{
//пробуем подключится
conn.Open();
}
catch (SqlException se)
{
Console.WriteLine("Ошибка подключения:{0}", se.Message);
return;
}
Console.WriteLine("Соедение успешно произведено");
/*Создаем экземпляр класса SqlCommand по имени cmdCreateTable
и передаем конструктору этого класса, запрос на создание таблицы
и объект типа SqlConnection
*/
CreateNewTable(conn);
InsertToTable(conn);
ShowFields(conn);
UpdateFromTable(conn);
ShowFields(conn);
DeleteFromTable(conn);
ShowFields(conn);
DeleteTable(conn);
//закрвываем соединение
conn.Close();
conn.Dispose();
}
private static void DeleteTable(SqlConnection conn)
{
using (SqlCommand cmdDeleteTable = new SqlCommand("DROP TABLE Students", conn))
{
//посылаем запрос
try
{
cmdDeleteTable.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка при удалении таблицы");
return;
}
}
Console.WriteLine("Таблица удалена успешно");
}
private static void DeleteFromTable(SqlConnection conn)
{
using (SqlCommand cmd = new SqlCommand("Delete From Students" +
" where ID = @ID or FIO = @FIO", conn))
{
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 100;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Удаляем запись");
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на удаление записи");
Console.WriteLine("Возможно запись уже удалена");
return;
}
}
}
private static void UpdateFromTable(SqlConnection conn)
{
using (SqlCommand cmd = new SqlCommand("Update Students" +
" Set ID = @ID where FIO = @FIO", conn))
{
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 100;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Изменяем запись(и)");
{
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на изменение записи(ей)");
return;
}
}
}
}
private static void ShowFields(SqlConnection conn)
{
//Выводим значение на экран
using (SqlCommand cmd = new SqlCommand("Select * From Students", conn))
{
/*Метод ExecuteReader() класса SqlCommand возврашает
объект типа SqlDataReader, с помошью которого мы можем
прочитать все строки, возврашенные в результате выполнения запроса
CommandBehavior.CloseConnection - закрываем соединение после запроса
*/
using (SqlDataReader dr = cmd.ExecuteReader())
{
//цикл по всем столбцам полученной в результате запроса таблицы
for (int i = 0; i < dr.FieldCount; i++)
/*метод GetName() класса SqlDataReader позволяет получить имя столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.Write("{0}\t", dr.GetName(i).ToString().Trim());
/*читаем данные из таблицы
чтение происходит только в прямом направлении
все прочитаные строки отбрасываюся */
Console.WriteLine();
while (dr.Read())
{
/*метод GetValue() класса SqlDataReader позволяет получить значение столбца
по номеру, который передается в качестве параметра, данному методу
и озночает номер столбца в таблице(начинается с 0)
*/
Console.WriteLine("{0}\t{1}\t{2}", dr.GetValue(0).ToString().Trim(),
dr.GetValue(1).ToString().Trim(),
dr.GetValue(2).ToString().Trim());
}
}
}
}
private static void CreateNewTable(SqlConnection conn)
{
using (SqlCommand cmdCreateTable = new SqlCommand("CREATE TABLE " +
" Students (ID int not null" +
", FIO char(60) not null," +
" Grupa char(20) not null)", conn))
{
//посылаем запрос
try
{
cmdCreateTable.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка при создании таблицы");
return;
}
}
Console.WriteLine("Таблица создана успешно");
}
private static void InsertToTable(SqlConnection conn)
{
using (SqlCommand cmd = new SqlCommand("Insert into Students" +
"(ID,FIO,Grupa) Values (@ID,@FIO,@Grupa)", conn))
{
/*Работаем с параметрами(SqlParameter), эта техника позволяет уменьшить
кол-во ошибок и достичь большего быстродействия
но требует и больших усилий в написании кода*/
//объявляем объект класса SqlParameter
SqlParameter param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@ID";
//задаем значение параметра
param.Value = 10;
//задаем тип параметра
param.SqlDbType = SqlDbType.Int;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@FIO";
//задаем значение параметра
param.Value = "Иванов Иван Иванович";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
//переопределяем объект класса SqlParameter
param = new SqlParameter();
//задаем имя параметра
param.ParameterName = "@Grupa";
//задаем значение параметра
param.Value = "4-2";
//задаем тип параметра
param.SqlDbType = SqlDbType.Text;
//передаем параметр объекту класса SqlCommand
cmd.Parameters.Add(param);
Console.WriteLine("Вставляем запись");
try
{
cmd.ExecuteNonQuery();
}
catch
{
Console.WriteLine("Ошибка, при выполнении запроса на добавление записи");
return;
}
}
}
}
} |
|
3. Заключение
В заключении хочу сказать, что в данном FAQ была рассмотрена лиш малая часть общирного мира ADO .NET. Посмотрите на изображение и увидите, что еще осталось не освященным.
Вложение 42297
Дополнительные материалы:
http://msdn.microsoft.com/ru-r... 4ybxw.aspx
http://msdn.microsoft.com/ru-r... 97942.aspx
http://msdn.microsoft.com/ru-r... ction.aspx
http://msdn.microsoft.com/ru-r... mmand.aspx
http://msdn.microsoft.com/ru-r... eader.aspx
Данный FAQ в doc(MS Word)
Вложение 42225
77
|