SqlConnection cn; // Объекты ADO.NET, которые понадобятся не только в конструкторе
DataTable dt;
public MainForm()
{
InitializeComponent();
cn = new SqlConnection(
"Trusted_Connection = Yes; Server = ALEX\\NETSDK; Database = Students;");
try
{
cn.Open();
IDbCommand cmd = cn.CreateCommand();
cmd.CommandText = "Select * From StudentsList";
IDataReader reader = cmd.ExecuteReader();
DataTable dt = new DataTable("Students");
dt.Columns.Add("ID");
dt.Columns.Add("Name");
dt.Columns.Add("Телефон");
dt.Columns.Add("Addr");
while (reader.Read())
{
DataRow row = dt.NewRow();
for (int j=0; j<row.ItemArray.Length; j++)// Читаем и заполняем все столбцы таблицы
row[j] = reader[j];
dt.Rows.Add(row);
}
}
catch (SqlException e)
{
MessageBox.Show(e.Message);
return;
}
finally
{
if (cn.State == ConnectionState.Open)
cn.Close();
}
reader.Close();
cn.Close();
grid.DataSource = dt;
grid.CaptionText = dt.TableName;
}
//==== Здесь следуют другие методы класса Form1. Они были созданы мастером
}
При чтении данных используется тот же подход, что и в предыдущем примере, но есть небольшое отличие. Обратите внимание на цикл for — прохода по всем столбцам текущей строки и заполнения ее данными из таблицы провайдера. В цикле использовано выражение: row.ItemArray.Length;. Его можно заменить на: reader.FieldCount;, так как оба имеют результатом количество столбцов читаемой таблицы. Другим отличием является то, что перед закрытием соединения мы узнаем его состояние. Это вызвано тем, что открытие соединения теперь осуществляется в блоке try и в случае сбоя его не удастся закрыть, так как оно не было открыто.
Студия имеет несколько инструментов, которые упрощают создание объектов ADO.NET, позволяющих управлять существующими источниками данных. В их число входят:
· Data Form Wizard
· DataAdapter Configuration Wizard
is the visual representation of your dataset. In this view you can add new or existing tables to your dataset and create relationships between them.
Процедуры упрощают управление данными базы. Хранимая процедура—это компилированный набор операторов на языке SQL, который хранится в базе под определенным именем. Вызов процедуры производится с помощью объекта класса SqlCommand, но предварительно для него следует установить свойство CommandType в значение StoredProcedure. Синтаксис самой процедуры выглядит так:
CREATE FUNCTION dbo.InsertOrder (
/* @param1 datatype = default value, @param2 datatype */) RETURNS /* datatype */
AS
BEGIN
/* sql statement ... */
RETURN /* value */
END
Некоторые детали синтаксиса можно опускать. Рассмотрим простейшую процедуру, которая не требует параметров и возвращает таблицу из 10 наименований самых дорогих продуктов таблицы Products базы NorthWind.
ALTER procedure "Ten Most Expensive Products" AS
SET ROWCOUNT 10
SELECT Products.ProductName AS TenMostExpensiveProducts, Products.UnitPrice
FROM Products
ORDER BY Products.UnitPrice DESC
Вот ее алгоритм. Данные таблицы Products упорядочиваются по убыванию цен (значений колонки UnitPrice), затем происходит выбор значений из 10 первых строк колонки ProductName результирующей таблицы. Результат имеет вид таблицы размером 10 х 1 (10 строк и 1 колонка). Он возвращается в точку вызова процедуры.
Следующая процедура CustOrderHist являет пример более сложного запроса. Она возвращает таблицу из двух колонок (наименование продукта и сумма закупок этого продукта определенным клиентом: ProductName, Total). Таким образом, результат зависит от клиента, индекс которого следует задать в качестве параметра @CustomerID.
ALTER PROCEDURE CustOrderHist @CustomerID nchar(5)
AS
SELECT ProductName, Total=SUM(Quantity)
FROM Products P, [Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = @CustomerID
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.