C# Language
データベースへのアクセス
サーチ…
ADO.NET接続
ADO.NET接続は、C#アプリケーションからデータベースに接続する最も簡単な方法の1つです。彼らは、クエリを実行するためにデータベースを指すプロバイダと接続文字列の使用に依存しています。
共通データプロバイダクラス
次のうち多くは、データベースとその関連する名前空間のクエリによく使用されるクラスです。
-
System.Data.SqlClient
SqlConnection
、SqlCommand
、SqlDataReader
-
OleDbConnection
、OleDbCommand
、System.Data.OleDb
OleDbDataReader
-
MySqlConnection
、MySqlCommand
、MySqlDbDataReader
fromMySql.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は、 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 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;
接続文字列の格納
通常、接続文字列は設定ファイル(ASP.NETアプリケーション内のapp.config
やweb.config
など)に格納されます。以下は、これらのファイルのいずれかでローカル接続がどのように見えるかの例です。
<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はあなたのものがどのように見えるべきか不明な場合は非常に有用なリソースです。