/// <summary>チェックド リスト ボックスを更新する</summary> private void clbUpdateItems() { // カラム ポジションを昇順にソートする ArrayList sort = CmnMethods.sortColumn(this._htColumns_Position); // ソート後のカラム ポジション配列を廻す foreach (Int32 position in sort) { // カラムを取得 CColumn column = (CColumn)this._htColumns_Position[position.ToString()]; this.clbColumns.Items.Add(position.ToString().PadLeft(3, '0') + " : " + column.Name, column.IsKey); } }
/// <summary>スキーマ情報を読み込み、列情報をロードする。</summary> private void btnLoadColumn_Click(object sender, EventArgs e) { try { // コネクション オープン this.ConnectionOpen(); // カーソルを待機状態にする System.Windows.Forms.Cursor.Current = Cursors.WaitCursor; #region 型情報を取得 if (this.rbnSQL.Checked) { // DataTypes CmnMethods.DataTypes = this.SqlCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnOLE.Checked) { // DataTypes CmnMethods.DataTypes = this.OleCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnODB.Checked) { // DataTypes CmnMethods.DataTypes = this.OdbCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnODP.Checked) { // DataTypes CmnMethods.DataTypes = this.OdpCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnDB2.Checked) { // DataTypes CmnMethods.DataTypes = this.DB2Cn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnHiRDB.Checked) { // DataTypes CmnMethods.DataTypes = this.HiRDBCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnMySQL.Checked) { // DataTypes CmnMethods.DataTypes = this.MySqlCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else if (this.rbnPstgrs.Checked) { //// DataTypes(NpgsqlではDataTypesがサポートされていない) //CmnMethods.DataTypes = this.NpgsqlCn.GetSchema(System.Data.Common.DbMetaDataCollectionNames.DataTypes); } else { // データプロバイダ指定無し(ありえない) } #endregion // スキーマの情報(カラム) DataTable dtSchmaColumns = null; // スキーマの情報(主キー) DataTable dtSchmaPrimaryKeys = null; // スキーマの情報(インデックス カラム) DataTable dtSchmaIndexColumns = null; #region 列情報をロード if (this.rbnSQL.Checked) { #region SQL Server #region カラムの情報を取得 dtSchmaColumns = this.SqlCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATA_TYPE"], CmnMethods.ConvertToDotNetTypeInfo((string)row["DATA_TYPE"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } #endregion #region 主キーの情報を取得 // テーブルを取得 foreach (CTable table in this.HtSchemaCustom.Values) { // 存在チェック if (!((CTable)this.HtSchemaCustom[table.Name]).Effective) { continue; // 存在しない場合スキップする処理を追加 } // ワーク SqlDataReader drd = null; DataTable dtSchmaConstraint = new DataTable(); DataTable dtSchmaIndex = new DataTable(); // 主キー名 string pkName = ""; // 主キーレコード System.Data.DataRow pkRow = null; // sp_helpconstraintストアドプロシージャで、主キー インデックス名を取得 SqlCommand cmd_sp_help = new SqlCommand("sp_helpconstraint", this.SqlCn); cmd_sp_help.CommandType = CommandType.StoredProcedure; cmd_sp_help.Parameters.Add(new SqlParameter("@objname", table.Name)); // sp_helpconstraintストアドプロシージャの結果セット(制約に関する結果セット) drd = cmd_sp_help.ExecuteReader(); drd.NextResult(); // 1つスキップする。 dtSchmaConstraint.Load(drd); drd.Close(); // 制約レコードを取得する。 foreach (System.Data.DataRow row in dtSchmaConstraint.Rows) { // 制約レコードが主キーか? if(row["constraint_type"].ToString().IndexOf( "PRIMARY KEY", StringComparison.CurrentCultureIgnoreCase) == -1) { // 主キーでない。 } else { // 主キーである。 pkName = row["constraint_name"].ToString(); break; } } // 主キー インデックス名なしの場合 if (pkName == "") { } else { // sp_MShelpindexストアドプロシージャで、主キー列名を取得 SqlCommand sp_MShelpindex = new SqlCommand("sp_MShelpindex", this.SqlCn); sp_MShelpindex.CommandType = CommandType.StoredProcedure; sp_MShelpindex.Parameters.Add(new SqlParameter("@tablename", table.Name)); // sp_helpconstraintストアドプロシージャの結果セット(制約に関する結果セット) drd = sp_MShelpindex.ExecuteReader(); dtSchmaIndex.Load(drd); drd.Close(); // 主キー レコードを取得する。 foreach (System.Data.DataRow row in dtSchmaIndex.Rows) { // 主キー インデックスか? if (row["name"].ToString() == pkName) { // 主キー インデックスである。 pkRow = row; break; } else { // 主キー インデックスでない。 } } // 主キー レコードなしの場合 if (pkRow == null) { } else { // 列のIsKeyフラグを立てる。 for (int i = 1; i <= 16; i++) { // 主キー列 CColumn column = (CColumn)table.HtColumns_Name[pkRow["indCol" + i.ToString()].ToString()]; // nullの時があるようなので、この場合は処理しない。 if (column == null) { // 無い場合は抜ける。 break; } else { column.IsKey = true; } } } } } #endregion #endregion } else if (this.rbnOLE.Checked) { #region OLEDB.NET dtSchmaColumns = this.OleCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], CmnMethods.ConvertToDBTypeInfo_OLEDB(row["DATA_TYPE"].ToString()), CmnMethods.ConvertToDotNetTypeInfo(CmnMethods.ConvertToDBTypeInfo_OLEDB(row["DATA_TYPE"].ToString()))); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else if (this.rbnODB.Checked) { #region ODBC.NET dtSchmaColumns = this.OdbCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["TYPE_NAME"], CmnMethods.ConvertToDotNetTypeInfo((string)row["TYPE_NAME"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else if (this.rbnODP.Checked) { #region Oracle #region カラムの情報を取得 // カラムの情報を取得 dtSchmaColumns = this.OdpCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATATYPE"], CmnMethods.ConvertToDotNetTypeInfo((string)row["DATATYPE"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ID"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } #endregion #region 主キーの情報を取得 // 主キー情報を取得 dtSchmaPrimaryKeys = this.OdpCn.GetSchema("PrimaryKeys"); // インデックス カラム情報を取得 dtSchmaIndexColumns = this.OdpCn.GetSchema("IndexColumns"); // 主キーの設定 // テーブルを取得 foreach (CTable table in this.HtSchemaCustom.Values) { if (table.Effective) { // プライマリキー foreach (System.Data.DataRow row1 in dtSchmaPrimaryKeys.Rows) { // 有効なテーブルのプライマリキー if (table.Name == row1["TABLE_NAME"].ToString()) { foreach (System.Data.DataRow row2 in dtSchmaIndexColumns.Rows) { // 有効なテーブルのプライマリキーのカラム if (row1["INDEX_NAME"].ToString() == row2["INDEX_NAME"].ToString()) { // 列のIsKeyフラグを立てる。 CColumn column = (CColumn)table.HtColumns_Name[row2["COLUMN_NAME"].ToString()]; // nullの時があるようなので、この場合は処理しない。 if (column == null){ } else { column.IsKey = true; } } } } } } } #endregion #endregion } else if (this.rbnDB2.Checked) { #region DB2 // カラムの情報を取得 dtSchmaColumns = this.DB2Cn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATA_TYPE_NAME"], CmnMethods.ConvertToDotNetTypeInfo_DB2((string)row["DATA_TYPE_NAME"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else if (this.rbnHiRDB.Checked) { #region HiRDB // カラムの情報を取得 dtSchmaColumns = this.HiRDBCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATA_TYPE_NAME"], CmnMethods.ConvertToDotNetTypeInfo_DB2((string)row["DATA_TYPE_NAME"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else if (this.rbnMySQL.Checked) { #region MySQL // カラムの情報を取得 dtSchmaColumns = this.MySqlCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATA_TYPE"], CmnMethods.ConvertToDotNetTypeInfo((string)row["DATA_TYPE"])); // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else if (this.rbnPstgrs.Checked) { #region PostgreSQL // カラムの情報を取得 dtSchmaColumns = this.NpgsqlCn.GetSchema("Columns"); // カラムの取り込み foreach (System.Data.DataRow row in dtSchmaColumns.Rows) { // テーブルを取得 CTable table = (CTable)this.HtSchemaCustom[(string)row["TABLE_NAME"]]; // 有効なテーブルにのみロードする。 if (table == null) { // 不明なテーブル } else { // 有効なテーブル if (table.Effective) { CColumn column = new CColumn( (string)row["COLUMN_NAME"], (string)row["DATA_TYPE"], "System.Object"); //CmnMethods.ConvertToDotNetTypeInfo((string)row["DATA_TYPE"])); //(NpgsqlではDataTypesがサポートされていないため) // ポジションをキーにしてカラムを追加 table.HtColumns_Position[row["ORDINAL_POSITION"].ToString()] = column; // カラム名をキーにしてカラムを追加 table.HtColumns_Name[(string)row["COLUMN_NAME"]] = column; } } } // 主キーの情報をロード・・・しない。 #endregion } else { // データプロバイダ指定無し(ありえない) } #endregion #region デバッグ if (this.cbxDebug.Checked) { // カラム情報 if (dtSchmaColumns != null) { this.tabPage1.Text = "カラム情報"; this.dataGridView1.DataSource = dtSchmaColumns; } // 主キー情報 if (dtSchmaPrimaryKeys != null) { this.tabPage2.Text = "主キー情報"; this.dataGridView2.DataSource = dtSchmaPrimaryKeys; } // インデックス カラム情報 if (dtSchmaIndexColumns != null) { this.tabPage3.Text = "インデックス カラム情報"; this.dataGridView3.DataSource = dtSchmaIndexColumns; } } #endregion // ボタン状態の変更 this.btnLoadColumn.Enabled = false; this.btnSetPrimaryKey.Enabled = true; this.cmbEncoding.Enabled = true; this.btnDaoDefinitionGen.Enabled = true; } catch (Exception ex) { MessageBox.Show("ランタイムエラーです:" + ex.Message); } finally { // コネクション クローズ this.ConnectionClose(); // カーソルを元に戻す System.Windows.Forms.Cursor.Current = Cursors.Default; } }