C# でパラメータ付きのストアドプロシージャを呼び出す具体的なコード例
使用するクラス (Using Classes)
C# でデータベースにアクセスするには、 System.Data.SqlClient
名前空間にあるクラスを使用します。
SqlConnection
: データベースへの接続を確立・管理します。SqlCommand
: SQL コマンドやパラメータの設定、実行を行います。
接続の作成 (Creating a Connection)
まず、 SqlConnection
オブジェクトを作成し、接続文字列 (connection string) を設定してデータベースに接続します。接続文字列には、サーバー名、データベース名、ユーザー名、パスワードなどの情報が含まれます。
string connectionString = "Server=your_server_name;Database=your_database_name;User Id=your_username;Password=your_password ;";
SqlConnection connection = new SqlConnection(connectionStr ing);
ストアードプロシージャの作成 (Creating Stored Procedure)
SQL Server Management Studio などを使用して、呼び出したいストアードプロシージャを作成します。この手順は本説明の範囲外ですが、パラメータを受け取るように定義する必要があります。
SqlCommand の設定 (Configuring SqlCommand)
次に、 SqlCommand
オブジェクトを作成し、以下の設定を行います。
Connection
プロパティ : 上記で作成したSqlConnection
オブジェクトを設定します。CommandType
プロパティ :CommandType.StoredProcedure
に設定し、ストアードプロシージャを呼び出すことを指定します。CommandText
プロパティ : 呼び出すストアードプロシージャの名前を設定します。
パラメータの設定 (Setting Parameters)
ストアードプロシージャが持つパラメータに対して、値を設定します。 SqlCommand
オブジェクトの Parameters
コレクションを使用します。
SqlCommand command = new SqlCommand("YourStoredProcedureName", connection);
command.CommandType = CommandType.StoredProcedure;
// パラメータ名と値を設定 (Set parameter name and value)
SqlParameter parameter = new SqlParameter("@parameterName", value);
command.Parameters.Add(parameter);
実行と結果の取得 (Execution and Result Retrieval)
最後に、 SqlCommand
オブジェクトの ExecuteNonQuery()
メソッドを使用してストアードプロシージャを実行します。戻り値が必要な場合は、 ExecuteScalar()
や ExecuteReader()
メソッドを使用します。
最後に、 SqlConnection
オブジェクトの Close()
メソッドを呼び出して、データベースとの接続を閉じます。
注意点 (Notes)
- パラメータ名は、ストアードプロシージャで定義されているものと同じ名前を使用してください (e.g.,
@parameterName
) - パラメータの型は、ストアードプロシージャで定義されている型と一致させる必要があります。
- エラー処理を実装することをおすすめします。
C# でパラメータ付きのストアドプロシージャを呼び出す具体的なコード例
シナリオ
- データベース: SQL Server
- ストアドプロシージャ:
GetCustomerByName
(顧客名を受け取り、該当する顧客情報を返す) - C# アプリケーション: Windows Forms アプリケーション (例)
コード例
using System;
using System.Data;
using System.Data.SqlClient;
namespace StoredProcedureExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string connectionString = "Serve r=your_server;Database=your_database;User Id=your_user;Password=your_password;";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand("GetCustomerByName", connection))
{
command.CommandType = CommandType.StoredProcedure;
// パラメータを追加
SqlParameter parameter = new SqlParameter("@CustomerName", SqlDbType.NVarChar);
parameter.Value = textBox1.Text;
command.Parameters.Add(parameter);
connection.Open();
// 結果を取得 (例: データリーダーを使用)
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
// データを処理
string customerID = reader["CustomerID"].ToString();
string customerAddress = reader["CustomerAddress"].ToString();
// ... 他のカラムも同様に処理
// データを画面に表示するなど
MessageBox.Show($"顧客ID: {customerID}, 住所: {customerAddress}");
}
}
}
}
}
}
}
コード解説
- 接続文字列: データベースへの接続情報を格納します。
- SqlCommand: SQL コマンドを表すオブジェクトです。
- CommandType.StoredProcedure: コマンドの種類をストアドプロシージャに設定します。
- SqlParameter: ストアドプロシージャのパラメータを表すオブジェクトです。
- @CustomerName: ストアドプロシージャで定義されているパラメータ名です。
- SqlDbType.NVarChar: パラメータのデータ型を指定します。
- textBox1.Text: テキストボックスに入力された顧客名をパラメータの値として設定します。
- connection.Open(): データベースへの接続を開きます。
- SqlDataReader: 結果セットを読み込むためのオブジェクトです。
- while (reader.Read()): 結果セットの各行に対して処理を行います。
- reader["CustomerID"].ToString(): 各カラムの値を取得します。
重要なポイント
- using: リソースの解放を確実に行うために using ステートメントを使用します。
- パラメータ: ストアドプロシージャのパラメータ名、データ型、値を正確に設定する必要があります。
- 結果の処理: データリーダーを使用して結果セットを処理します。
- エラー処理: 例外処理を追加して、エラーが発生した場合に適切な処理を行うようにします。
- ASP.NET: ASP.NET での処理は、Web フォームや MVC など、使用するフレームワークによって若干異なりますが、基本的な考え方は同じです。
- トランザクション: 複数の SQL ステートメントをひとつの作業単位として扱う場合は、トランザクションを使用します。
- 非同期処理: 多くのレコードを処理する場合など、パフォーマンスを向上させるために非同期処理を検討します。
- ORM: Entity Framework などの ORM (Object-Relational Mapping) ツールを使用すると、データベース操作をより簡単に記述できます。
このコード例は、C# でパラメータ付きのストアドプロシージャを呼び出す基本的な手順を示しています。実際のアプリケーションでは、エラー処理、パフォーマンスチューニング、セキュリティ対策など、より詳細な考慮が必要になります。
C# でストアドプロシージャを呼び出す代替方法
C# でストアドプロシージャを呼び出す方法は、標準的な SqlConnection
, SqlCommand
を利用する方法以外にも、様々なアプローチがあります。それぞれに特徴やメリット・デメリットがあるため、開発の状況や好みに合わせて適切な方法を選択することが重要です。
ORM (Object-Relational Mapper) の利用
Entity Framework:
- LINQ to Entities を使用して、データベース操作をオブジェクト指向な方法で記述できます。
- ストアドプロシージャを直接呼び出すことも、LINQ クエリに変換して実行することも可能です。
- データモデルとデータベースとのマッピングを自動化できるため、開発効率が向上します。
Dapper:
- シンプルで高速なマイクロ ORM です。
- 動的な SQL を実行したり、ストアドプロシージャを呼び出したりすることができます。
- Entity Framework よりも軽量で、柔軟性が高いです。
using (var context = new YourDbContext())
{
var result = context.Database.SqlQuery<YourResultType>("EXEC YourStoredProcedure @Param1", new SqlParameter("@Param1", value)).ToList();
}
ADO.NET Data Services
- OData:
- OData プロトコルを使用して、RESTful な方法でデータにアクセスできます。
- ストアドプロシージャの結果を OData フィードとして公開し、クライアントから呼び出すことができます。
- Web API の構築に適しています。
サードパーティ製のデータアクセスライブラリ
- DevExpress:
- XPO (eXpress Persistent Objects) など、ORM やデータアクセスコンポーネントを提供しています。
- Visual Studio のデザイナーと連携し、視覚的にデータベース操作を設計できます。
- ServiceStack:
- 高性能な Web サービスフレームワークです。
- ORMs やデータアクセス層を統合し、RESTful な API を簡単に構築できます。
データベースベンダー固有の ADO.NET データプロバイダー
- SQL Server:
System.Data.SqlClient
名前空間- SQL Server 固有の機能を利用できます。
- Oracle:
Oracle.ManagedDataAccess.Client
名前空間- Oracle Database 固有の機能を利用できます。
各方法の比較
方法 | 特徴 | メリット | デメリット |
---|---|---|---|
標準的な方法 | シンプル | 柔軟性が高い | 手間がかかる |
ORM | オブジェクト指向 | 生産性向上 | 学習コスト |
ADO.NET Data Services | RESTful | 分散システムに適する | セットアップが複雑 |
サードパーティ製ライブラリ | 高機能 | 特化された機能 | ライセンスコスト |
データベースベンダー固有 | 高性能 | ベンダー固有の機能 | 可搬性が低い |
選択のポイント
- プロジェクトの規模: 小規模なプロジェクトでは標準的な方法、大規模なプロジェクトでは ORM やサードパーティ製ライブラリが適しています。
- 開発者のスキル: ORM に慣れていない場合は、標準的な方法から始めるのが良いでしょう。
- パフォーマンス: 高いパフォーマンスが要求される場合は、データベースベンダー固有のデータプロバイダーや Dapper を検討します。
- 機能: 特定の機能が必要な場合は、その機能を提供するライブラリを選択します。
C# でストアドプロシージャを呼び出す方法は、プロジェクトの要件や開発者の好みによって様々な選択肢があります。それぞれの方法に特徴やメリット・デメリットがあるため、開発の状況に合わせて最適な方法を選択することが重要です。
- どの方法について詳しく知りたいですか?
- どのようなプロジェクトで利用したいですか?
- パフォーマンス、可読性、保守性、どの点に重きを置いていますか?
c# asp.net sql-server