none
テーブル構成条件を判断の質問です。 RRS feed

  • 質問

  • 今、XMLファイルからデータを読み込み、SQL文生成のPGを組み込んでいます。

    項目毎により、構成条件に従って、相対応の値を生成したいです。
    一つの条件を満たさない場合でも、エラーメッセージを表示します。


    現在、項目毎の条件を得ましたが、どうやって判断するのか、分からないです。。。

    ヒント、解決策があるようでしたら教えていただけないでしょうか。
    宜しくお願いいたします。

     

    下記PGです。↓↓↓↓
    他のフォームで、ボタン押下したとき、リストビューに表示したいです。


    略・・・

    コード ブロック

    //TableInfo.cs
    using System.Xml.Serialization;
    using System.Data;

    namespace InfoCreate
    {
        ///
        /// 子クラス
        ///
        public class Column
        {
            public string Name;      // 子タグColumn項目名前
            public string Type;       // 子タグColumn項目タイプ
            public int Size;             // 子タグColumn項目サイズ
            public string Sample;     // 子タグColumn項目サンプル
            public string Min;          // 子タグColumn項目最小値
            public string Max;         // 子タグColumn項目最大値
        }

        public class TableInfo
        {
            public string TableName;       // 親タグ項目tableName  
            [XmlElement]
            public Column[] Columns;      // 親タグ配列項目Column
           
            ///
            /// XMLファイルからテーブル情報を取得
            ///
            /// テーブル内容
            public string XmlRead()
            {
                TableInfo tableInfo = new TableInfo();         // インスタント作成
                System.Xml.Serialization.XmlSerializer ser =
                    new System.Xml.Serialization.XmlSerializer(typeof(TableInfo));
                System.IO.FileStream fs = new System.IO.FileStream(@"C:\test4.xml", System.IO.FileMode.Open);

                tableInfo = (TableInfo)ser.Deserialize(fs);     // テーブル取得
                string name = tableInfo.TableName;               // テーブル名
                string tableContents = "";                           // テーブル内容
               
                string result;
                string[] tableTypes      = new string[10];
                int[] tableSizes           = new int   [10];
                string[] tableSamples  = new string[10];
                string[] tableMaxs      = new string[10];
                string[] tableMins       = new string[10];
                for (int i = 0; i < tableInfo.Columns.Length; i++)
                {
                    tableContents      = tableContents + tableInfo.Columns[i].Name + ",";

                    tableTypes[i]       = tableInfo.Columns[i].Type;
                    tableSizes[i]        = tableInfo.Columns[i].Size;
                    tableSamples[i]    = tableInfo.Columns[i].Sample;
                    tableMaxs[i]        = tableInfo.Columns[i].Max;
                    tableMins[i]         = tableInfo.Columns[i].Min;             
                   
                }          
             
                result = name + " (" + tableContents + ")";
                fs.Close();           
                return result;
            }

    /******************************************************************/

    test4.xml

     

    <?xml version="1.0"?>
    <TableInfo>
     <TableName>IBAPATIENT</TableName>
     <Columns>
      <Name>PATIENTNO</Name>
      <Type>string_number</Type>
      <Size>10</Size>
      <Sample></Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
     <Columns>
      <Name>KANJILASTNAME</Name>
      <Type>string_large</Type>
      <Size>20</Size>
      <Sample>テスト姓</Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
     <Columns>
      <Name>KANJIFIRSTNAME</Name>
      <Type>string_large</Type>
      <Size>20</Size>
      <Sample>テスト名</Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
     <Columns>
      <Name>KANALASTNAME</Name>
      <Type>string_short</Type>
      <Size>20</Size>
      <Sample>テストセイ</Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
     <Columns>
      <Name>KANAFIRSTNAME</Name>
      <Type>string_short</Type>
      <Size>20</Size>
      <Sample>テストメイ</Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
     <Columns>
      <Name>BIRTHDAY</Name>
      <Type>datetime</Type>
      <Size>0</Size>
      <Sample></Sample>
      <Min>1850/01/01</Min>
      <Max>2006/12/31</Max>
     </Columns>
     <Columns>
      <Name>SEX</Name>
      <Type>string_list</Type>
      <Size>0</Size>
      <Sample>0,1</Sample>
      <Min></Min>
      <Max></Max>
     </Columns>
    </TableInfo>

     

     

    2007年11月20日 2:55

回答

  •  剣道 さんからの引用

    若しSample値があって、対応カラムのTypeを参照し、一致する値のみ取得する。一致ではない場合、エラー。

    若しSample値が無かった場合、対応カラムのTypeと一致値を作って、入れます。

     

    具体的にどのようなチェックが必要なのかはわかりませんが、以下のような感じになると思います。(コード未検証ですのでエラーがあるかもしれません)

    TypeもSizeもSampleも取得できているので、後はそれをどのように組み合わせてチェックするかです。書き方もいろいろあると思います。

     

    コード ブロック

    string valuesWk;
    int size;

     

    switch (tableInfo.Columns[i].Type)
    {
       case "string_large":
           if (! int.TryParse(tableInfo.Columns[i].Size, out size))
           {
         //エラー処理をする。
           }

        else

           {

              if (tableInfo.Columns[i].Sample.Length > size)
              {
             //エラー処理をする。
              }
              else
              {
                 valuesWk = tableInfo.Columns[i].Sample
              }

           }
           break;
       case "string_number":
            ・
            ・
            ・
            ・
            ・
    }

     

    values = values + valuesWk + "','";

     

     

    2007年11月21日 3:31
    モデレータ

すべての返信

  •  剣道 さんからの引用

    現在、項目毎の条件を得ましたが、どうやって判断するのか、分からないです。。。

     

    何を判断されたいのでしょうか? ちょっとこれだけでは何とも・・・

     

     剣道 さんからの引用

    他のフォームで、ボタン押下したとき、リストビューに表示したいです。

     

    ボタンを押すフォームとリストビューがあるフォームが異なるということなんでしょうか? 上の質問との関連も不明ですので、もう少し説明がある方が回答が付きやすいと思います。

    2007年11月20日 6:21
    モデレータ
  • 質問が分かり難くて、申し訳御座いませんでした。

     

    実は、私がやりたいことは、
    「test4.xml」ファイルを参照して、一つの <Columns> </Columns>項目を追加する(或は減らす)場合、PGを修正しなくても、対応するの値も一つ増える(或は減らす)ようにしたいです。

     

    完成した文字:insert into IBAPATIENT (PATIENTNO, KANJILASTNAME, KANJIFIRSTNAME, KANALASTNAME, KANAFIRSTNAME, BIRTHDAY, SEX) values ('0000000000', 'テスト姓', 'テスト名', 'テストセイ', 'テストメイ', 'YYYYMMDD', '1');

     

    今、tableInfoというインスタンスを作成し、テーブルの内容を全部取得しまして、
    insert  から SEX) までは、tableContents  = tableContents + tableInfo.ColumnsIdea.Name + ","; で得られます。

     

    values値の部分をどうやって追加できるのか、分からないです。
    valuesを追加する場合、<Columns> </Columns>項目の子項目Type、Sample、Min、Maxの値を判断して、テーブルの構成条件に満たさない場合、エラーになりたいです。

     

    「test4.xml」を簡単に説明させていただきます。
    string_large   全角文字
    string_short  半角カタカナ
    string_list   女性の場合"0"、  男性の場合"1"。 
    Min         最小値
    Max       最大値

    判断したいのは、例えば、
    Columns[]項目の子項目Type、Sample、Min、Maxの値を判断し、
    <Type>はstring_largeではない場合、<Size>20桁以外の場合、エラーになります。
    あとは、<Sample>の値が有る場合、取得して、values()の値にセットします。

     

    <<ボタンとリストビューが一つのフォームに配置しまして、XMLファイル読込みと、テーブルクラスは別フォームです。

    <<ボタン押したとき、XMLファイル読込みのメソッドを呼び出すだけです。考えなくても構いません。

    度々質問申し訳御座いません、
    宜しくお願い致します。

     

    2007年11月20日 7:20
  • insert文のカラムの部分とvaluesの部分は別々に生成すれば良いでしょう。例えば、

    string columns;

    string values;

    のようにして、1カラムずつ読みながらcolumns、valuesを作成し、最終的に以下のような感じで組み立てられます。

    "insert into " + table名 + "(" + columns + ") values (" + values + ")"

     

    上記のSQL文を作成する際に、1カラムずつ読みながらcolumnsとvaluesを作成するわけですから、1カラム毎にエラーチェックをすることが可能です。

     

    #上記において文字列連結に+を使いましたが、実際にはStringBuilderを使った方が好ましいです。無駄なStringオブジェクトが生成されないからです。

    2007年11月20日 13:08
    モデレータ
  • trapemiyaさんへ

    丁寧にご指導していただき、有難う御座います。

    教えて頂いた方法は、了解いたしました。

    私もこの仕方で、PGを書きたいですが、

    今、問題は、values の取得するとき、チェックすることです。

     

    string values;

    values = values + tableInfo.ColumnsIdea.Sample + "','";

    例えば、上記のコードで、各カラム毎のSample値を取得できます。

     

    若しSample値があって、対応カラムのTypeを参照し、一致する値のみ取得する。一致ではない場合、エラー。

    若しSample値が無かった場合、対応カラムのTypeと一致値を作って、入れます。

    どうやってTypeをチェックできるのか?また分からないです。

    申し訳御座いませんが、もうちょっと Typeのチェック部分を詳しく教えて頂きたいです。

    宜しくお願い致します。

     

     

     

     

    2007年11月21日 1:02
  •  剣道 さんからの引用

    若しSample値があって、対応カラムのTypeを参照し、一致する値のみ取得する。一致ではない場合、エラー。

    若しSample値が無かった場合、対応カラムのTypeと一致値を作って、入れます。

     

    具体的にどのようなチェックが必要なのかはわかりませんが、以下のような感じになると思います。(コード未検証ですのでエラーがあるかもしれません)

    TypeもSizeもSampleも取得できているので、後はそれをどのように組み合わせてチェックするかです。書き方もいろいろあると思います。

     

    コード ブロック

    string valuesWk;
    int size;

     

    switch (tableInfo.Columns[i].Type)
    {
       case "string_large":
           if (! int.TryParse(tableInfo.Columns[i].Size, out size))
           {
         //エラー処理をする。
           }

        else

           {

              if (tableInfo.Columns[i].Sample.Length > size)
              {
             //エラー処理をする。
              }
              else
              {
                 valuesWk = tableInfo.Columns[i].Sample
              }

           }
           break;
       case "string_number":
            ・
            ・
            ・
            ・
            ・
    }

     

    values = values + valuesWk + "','";

     

     

    2007年11月21日 3:31
    モデレータ
  • 丁寧にご指導していただき、有難う御座いました。

    問題が解決しました、大変お世話になりました。

    私が知識不足でしたので、お手数をお掛けしまして、すみませんでした。

    今度、大変勉強になりまして、本当に有難うございました。

    また宜しくお願いいたします。

    2007年11月21日 4:59