MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpとデータベース - 結果の取得のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpとデータベース - 結果の取得
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == C#でSELECT文の実行結果を取得する方法を説明する。<br> <br> 結果の取得には、主に以下の2つのアプローチが存在する。<br> <br> * DataTableを使用して結果を一括で読み込む方法 (DataAdapter.Fill) *: SELECT文の全結果をメモリ上のDataTableに展開する。 *: データのランダムアクセスが可能であり、シンプルな実装で小~中規模のデータ処理に適する。 *: <br> * DataReaderを使用して結果を1行ずつ読み込む方法 (ExecuteReader) *: 前方向のみの読み取り専用カーソルで1行ずつ処理する。 *: メモリ効率が良く、大量データの処理に適する。 *: O/Rマッピングも容易に実装できる。 <br> また、COUNT等の集計値を取得する場合は、<code>ExecuteScalar</code> メソッドを使用する方法もある。<br> <br> 各DBMS (SQL Server, Oracle Database, MySQL) では、対応するクラスが異なる。<br> <br> * SQL Server *: SqlDataAdapter / SqlDataReader * Oracle Database *: OracleDataAdapter / OracleDataReader * MySQL *: MySqlDataAdapter / MySqlDataReader <br><br> == SQL Server == ==== 一括読み込み (DataTable) ==== DataTableへSELECT文の結果を一括で読み込むことができる。<br> <br> DataSetを使用する方法もあるが、DataTableを取り出すためにワンクッション必要となるため、DataTableへ直接代入する方がよい。<br> <br> 一括でDataTableへ読み込むには、SqlDataAdapterを使用する。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using System.Data; using System.Data.SqlClient; public DataTable GetData() { var table = new DataTable(); // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // クエリの作成 command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; // クエリの実行 var adapter = new SqlDataAdapter(command); adapter.Fill(table); } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } finally { // データベースの接続終了 connection.Close(); } } return table; } </syntaxhighlight> <br> ==== 1行ずつ読み込む (SqlDataReader) ==== SELECT文の結果を1行ずつ読み込む場合、SqlDataReaderを使用する。<br> Commandの <code>ExecuteReader()</code> メソッドを実行することで、SqlDataReaderを取得し、1行ずつ読み込んで処理を行う。<br> <br> 実装はDataTable方式より手間がかかるが、O/Rマッピングのような処理が容易に実装できる。<br> <br> 以下の例では、UserクラスはT_USERテーブルに対応する独自のモデルクラスである。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; // T_USERテーブルに対応するモデルクラス public class User { public string Id { get; set; } public string Password { get; set; } public string RoleName { get; set; } } public List<User> GetData() { var list = new List<User>(); // 接続文字列の取得 var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { // データベースの接続開始 connection.Open(); // クエリの作成 command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; // クエリの実行 using (var reader = command.ExecuteReader()) { while (reader.Read()) { list.Add(new User() { Id = reader["ID"] as string, Password = reader["PASSWORD"] as string, RoleName = reader["ROLE_NAME"] as string }); } } } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } finally { // データベースの接続終了 connection.Close(); } } return list; } </syntaxhighlight> <br> ==== 単一値の取得 (ExecuteScalar) ==== COUNT等の集計値のように単一の値を取得する場合は、<code>ExecuteScalar</code> メソッドを使用する。<br> <br> ExecuteScalarは、結果セットの最初の行の最初の列を返す。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using System.Data.SqlClient; public int GetUserCount() { var connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (var connection = new SqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT COUNT(*) FROM T_USER"; var count = (int)command.ExecuteScalar(); return count; } catch (Exception exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } } </syntaxhighlight> <br><br> == Oracle Database == Oracle Databaseに対してSELECT文を実行し、結果を取得する。<br> <br> Oracle Databaseへのアクセスには、Oracle.ManagedDataAccess.Client 名前空間のクラスを使用する。<br> <br> ==== 一括読み込み (DataTable) ==== OracleDataAdapterを使用して、SELECT文の結果をDataTableに一括で読み込む。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using System.Data; using Oracle.ManagedDataAccess.Client; public DataTable GetData() { var table = new DataTable(); var connectionString = ConfigurationManager.ConnectionStrings["oracle"].ConnectionString; using (var connection = new OracleConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; var adapter = new OracleDataAdapter(command); adapter.Fill(table); } catch (OracleException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } return table; } </syntaxhighlight> <br> ==== 1行ずつ読み込む (OracleDataReader) ==== OracleDataReaderを使用して、SELECT文の結果を1行ずつ読み込む。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Collections.Generic; using System.Configuration; using Oracle.ManagedDataAccess.Client; public List<User> GetData() { var list = new List<User>(); var connectionString = ConfigurationManager.ConnectionStrings["oracle"].ConnectionString; using (var connection = new OracleConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; using (var reader = command.ExecuteReader()) { while (reader.Read()) { list.Add(new User() { Id = reader["ID"].ToString(), Password = reader["PASSWORD"].ToString(), RoleName = reader["ROLE_NAME"].ToString() }); } } } catch (OracleException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } return list; } </syntaxhighlight> <br> ==== 単一値の取得 (ExecuteScalar) ==== OracleCommandのExecuteScalarメソッドを使用して、COUNT等の集計値を取得する。<br> <br> <u>OracleのNUMBER型は、decimalにキャストする点に注意が必要である。</u><br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using Oracle.ManagedDataAccess.Client; public int GetUserCount() { var connectionString = ConfigurationManager.ConnectionStrings["oracle"].ConnectionString; using (var connection = new OracleConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT COUNT(*) FROM T_USER"; var count = (int)(decimal)command.ExecuteScalar(); return count; } catch (OracleException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } } </syntaxhighlight> <br><br> == MySQL == MySQLに対してSELECT文を実行し、結果を取得する。<br> <br> MySQLへのアクセスには、MySqlConnectorパッケージの <code>MySqlConnector</code> 名前空間のクラスを使用する。<br> <br> ==== 一括読み込み (DataTable) ==== MySqlDataAdapterを使用して、SELECT文の結果をDataTableに一括で読み込む。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using System.Data; using MySqlConnector; public DataTable GetData() { var table = new DataTable(); var connectionString = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; using (var connection = new MySqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; var adapter = new MySqlDataAdapter(command); adapter.Fill(table); } catch (MySqlException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } return table; } </syntaxhighlight> <br> ==== 1行ずつ読み込む (MySqlDataReader) ==== MySqlDataReaderを使用して、SELECT文の結果を1行ずつ読み込む。<br> <br> <syntaxhighlight lang="c#"> using System; using System.Collections.Generic; using System.Configuration; using MySqlConnector; public List<User> GetData() { var list = new List<User>(); var connectionString = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; using (var connection = new MySqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT ID, PASSWORD, ROLE_NAME FROM T_USER"; using (var reader = command.ExecuteReader()) { while (reader.Read()) { list.Add(new User() { Id = reader["ID"].ToString(), Password = reader["PASSWORD"].ToString(), RoleName = reader["ROLE_NAME"].ToString() }); } } } catch (MySqlException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } return list; } </syntaxhighlight> <br> ==== 単一値の取得 (ExecuteScalar) ==== MySqlCommandの <code>ExecuteScalar</code> メソッドを使用して、COUNT等の集計値を取得する。<br> <br> <u>MySQLのCOUNT(*)はlong型で返るため、longにキャストする点に注意が必要である。</u><br> <br> <syntaxhighlight lang="c#"> using System; using System.Configuration; using MySqlConnector; public long GetUserCount() { var connectionString = ConfigurationManager.ConnectionStrings["mysql"].ConnectionString; using (var connection = new MySqlConnection(connectionString)) using (var command = connection.CreateCommand()) { try { connection.Open(); command.CommandText = @"SELECT COUNT(*) FROM T_USER"; var count = (long)command.ExecuteScalar(); return count; } catch (MySqlException exception) { Console.WriteLine(exception.Message); throw; } finally { connection.Close(); } } } </syntaxhighlight> <br><br> == DataTableとDataReaderの比較 == DataTable (DataAdapter) 方式 と DataReader方式の特徴を下表に示す。<br> <br> <center> {| class="wikitable" |+ DataTableとDataReaderの比較 ! 項目 !! DataTable (DataAdapter) !! DataReader |- | 読み込み方式 || 一括読み込み || 1行ずつ読み込み |- | メモリ使用量 || 全データをメモリに展開 || 現在行のみメモリに保持 |- | アクセス方向 || ランダムアクセス可能 || 前方向のみ |- | 接続 || Fill後に接続クローズ可能 || 読み込み中は接続維持が必要 |- | 適したデータ量 || 小〜中規模 || 大規模 |- | O/Rマッピング || 不向き || 容易 |} </center> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpとデータベース - 結果の取得
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse