C# Language
Доступ к базам данных
Поиск…
Связи ADO.NET
Соединения ADO.NET - один из простейших способов подключения к базе данных из приложения C #. Они полагаются на использование провайдера и строку подключения, которая указывает на вашу базу данных для выполнения запросов.
Общие классы поставщиков данных
Многие из следующих относятся к классам, которые обычно используются для запросов к базам данных и связанным с ними пространствам имен:
-
SqlConnection
,SqlCommand
,SqlDataReader
изSystem.Data.SqlClient
-
OleDbConnection
,OleDbCommand
,OleDbDataReader
изSystem.Data.OleDb
-
MySqlConnection
,MySqlCommand
,MySqlDbDataReader
изMySql.Data
Все они обычно используются для доступа к данным через C # и обычно встречаются во всех приложениях, ориентированных на данные. Многие другие классы, которые не упомянуты, которые реализуют те же FooConnection
, FooCommand
, FooDataReader
можно ожидать, что они будут вести себя одинаково.
Общий шаблон доступа для подключений ADO.NET
Общая схема, которая может использоваться при доступе к вашим данным через соединение ADO.NET, может выглядеть следующим образом:
// This scopes the connection (your specific class may vary)
using(var connection = new SqlConnection("{your-connection-string}")
{
// Build your query
var query = "SELECT * FROM YourTable WHERE Property = @property");
// Scope your command to execute
using(var command = new SqlCommand(query, connection))
{
// Open your connection
connection.Open();
// Add your parameters here if necessary
// Execute your query as a reader (again scoped with a using statement)
using(var reader = command.ExecuteReader())
{
// Iterate through your results here
}
}
}
Или, если вы просто выполняете простое обновление и не нуждаетесь в читателе, будет применяться одна и та же базовая концепция:
using(var connection = new SqlConnection("{your-connection-string}"))
{
var query = "UPDATE YourTable SET Property = Value WHERE Foo = @foo";
using(var command = new SqlCommand(query,connection))
{
connection.Open();
// Add parameters here
// Perform your update
command.ExecuteNonQuery();
}
}
Вы даже можете программировать против набора общих интерфейсов и не беспокоиться о конкретных классах провайдера. Основными интерфейсами, предоставляемыми ADO.NET, являются:
- IDbConnection - для управления соединениями с базой данных
- IDbCommand - для выполнения команд SQL
- IDbTransaction - для управления транзакциями
- IDataReader - для чтения данных, возвращаемых командой
- IDataAdapter - для направления данных в и из наборов данных
var connectionString = "{your-connection-string}";
var providerName = "{System.Data.SqlClient}"; //for Oracle use "Oracle.ManagedDataAccess.Client"
//most likely you will get the above two from ConnectionStringSettings object
var factory = DbProviderFactories.GetFactory(providerName);
using(var connection = new factory.CreateConnection()) {
connection.ConnectionString = connectionString;
connection.Open();
using(var command = new connection.CreateCommand()) {
command.CommandText = "{sql-query}"; //this needs to be tailored for each database system
using(var reader = command.ExecuteReader()) {
while(reader.Read()) {
...
}
}
}
}
Подключения к платформе Entity Framework
Entity Framework предоставляет классы абстракции, которые используются для взаимодействия с базовыми базами данных в виде классов, таких как DbContext
. Эти контексты обычно состоят из DbSet<T>
которые раскрывают доступные коллекции, которые могут быть запрошены:
public class ExampleContext: DbContext
{
public virtual DbSet<Widgets> Widgets { get; set; }
}
Сам DbContext
будет обрабатывать соединения с базами данных и, как правило, считывает соответствующие данные строки соединения из конфигурации, чтобы определить, как установить соединения:
public class ExampleContext: DbContext
{
// The parameter being passed in to the base constructor indicates the name of the
// connection string
public ExampleContext() : base("ExampleContextEntities")
{
}
public virtual DbSet<Widgets> Widgets { get; set; }
}
Выполнение запросов платформы Entity
Фактически выполнение запроса Entity Framework может быть довольно простым и просто требует, чтобы вы создавали экземпляр контекста, а затем использовали доступные ему свойства для вытягивания или доступа к своим данным
using(var context = new ExampleContext())
{
// Retrieve all of the Widgets in your database
var data = context.Widgets.ToList();
}
Entity Framework также предоставляет обширную систему отслеживания изменений, которая может использоваться для обработки обновлений записей в вашей базе данных путем простого вызова метода SaveChanges()
для изменения изменений в базе данных:
using(var context = new ExampleContext())
{
// Grab the widget you wish to update
var widget = context.Widgets.Find(w => w.Id == id);
// If it exists, update it
if(widget != null)
{
// Update your widget and save your changes
widget.Updated = DateTime.UtcNow;
context.SaveChanges();
}
}
Строки подключения
Строка подключения - это строка, которая указывает информацию о конкретном источнике данных и о том, как подключиться к нему, сохраняя учетные данные, местоположения и другую информацию.
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
Сохранение строки подключения
Как правило, строка соединения будет храниться в файле конфигурации (например, app.config
или web.config
в приложениях ASP.NET). Ниже приведен пример того, как локальное соединение может выглядеть в одном из этих файлов:
<connectionStrings>
<add name="WidgetsContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=Widgets;Integrated Security=True;"/>
</connectionStrings>
<connectionStrings>
<add name="WidgetsContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=Widgets;Integrated Security=SSPI;"/>
</connectionStrings>
Это позволит вашему приложению получать доступ к строке подключения программно через WidgetsContext
. Хотя и Integrated Security=SSPI
и Integrated Security=True
выполняют одну и ту же функцию; Integrated Security=SSPI
предпочтительнее, поскольку работает как с поставщиком SQLClient, так и с OleDB, где в качестве Integrated Security=true
генерирует исключение при использовании с поставщиком OleDb.
Различные подключения для разных поставщиков
Каждый поставщик данных (SQL Server, MySQL, Azure и т. Д.) Имеет свой собственный синтаксис для своих строк подключения и предоставляет различные доступные свойства. ConnectionStrings.com - невероятно полезный ресурс, если вы не уверены в том, что должно выглядеть так.