トップ回答者
テーブル構成条件を判断の質問です。

質問
-
今、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>
回答
-
剣道 さんからの引用
若し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 + "','";
すべての返信
-
質問が分かり難くて、申し訳御座いませんでした。
実は、私がやりたいことは、
「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.Columns.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ファイル読込みのメソッドを呼び出すだけです。考えなくても構いません。
度々質問申し訳御座いません、
宜しくお願い致します。 -
insert文のカラムの部分とvaluesの部分は別々に生成すれば良いでしょう。例えば、
string columns;
string values;
のようにして、1カラムずつ読みながらcolumns、valuesを作成し、最終的に以下のような感じで組み立てられます。
"insert into " + table名 + "(" + columns + ") values (" + values + ")"
上記のSQL文を作成する際に、1カラムずつ読みながらcolumnsとvaluesを作成するわけですから、1カラム毎にエラーチェックをすることが可能です。
#上記において文字列連結に+を使いましたが、実際にはStringBuilderを使った方が好ましいです。無駄なStringオブジェクトが生成されないからです。
-
trapemiyaさんへ
丁寧にご指導していただき、有難う御座います。
教えて頂いた方法は、了解いたしました。
私もこの仕方で、PGを書きたいですが、
今、問題は、values の取得するとき、チェックすることです。
string values;
values = values + tableInfo.Columns
.Sample + "','";
例えば、上記のコードで、各カラム毎のSample値を取得できます。
若しSample値があって、対応カラムのTypeを参照し、一致する値のみ取得する。一致ではない場合、エラー。
若しSample値が無かった場合、対応カラムのTypeと一致値を作って、入れます。
どうやってTypeをチェックできるのか?また分からないです。
申し訳御座いませんが、もうちょっと Typeのチェック部分を詳しく教えて頂きたいです。
宜しくお願い致します。
-
剣道 さんからの引用
若し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 + "','";