示例#1
0
        /// <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);
            }
        }
示例#2
0
文件: Form1.cs 项目: krt/OpenTouryo
        /// <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;
            }
        }