列が自動的にいっぱいになるかどうかを判断する必要があります。
ほとんどの場合、これは PrimaryKey 列で行われます。これは、Oracle データベースと SQLServer で行う必要があります。
私の質問の背景は(理解を深めるためだけに)、仕様にあるXMLファイルを読んでいます。要素タグはテーブルの列名と一致します。テーブルはユーザーによって提供され、解析する必要があるxmlファイルを選択します。その後、テーブル内の列の名前と一致する場合、xml ファイル内のすべての要素を探しています。
xml ファイルが主キー情報を提供するかどうかは明確ではありません。そうかもしれませんが、そうではないかもしれません。列の名前がxml内にある場合、すべて問題ありません。しかし、そうでない場合は、調べる必要があります
- 私は xml ファイルで指定された PK 列を持っています。
- その PK 列に値が自動的に入力される場合
これが指定されていない場合は、例外を発生させる必要があります。そのため、そのスキーマ情報を特定する必要があります。
SQLServer では問題ありません。ID 列の場合、IsAutoIncrement は true になります。
このようなテーブルスキーマデータを読み取ります(短い例のみ)
System.Data.Common.DbDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo);
dtTable = reader.GetSchemaTable();
今、私は欲しい情報をすべて手に入れています。残念ながら、Oracle では IsAutoIncrement プロパティが false に設定されています。
SQLServerのように、DBMSによって列に指定されていない場合、GetSchemaTable()は列がシーケンスによって設定されているかどうかをどのように判断する必要があるかを知っています。それは私には明らかです。
これを解決する方法はありますか?テーブル内の列がトリガー内のシーケンスによって埋められるかどうかを判断していますか? 多分トリガー本体を解析していますか?
助けてくれてありがとう
私のソリューションは次のようになります。
if (IsOracleClient)
{
// reading Trigger Information
string sql = "select\n" +
" a.trigger_body\n" +
" from\n" +
" all_triggers a,\n" +
" all_trigger_cols b\n" +
" where\n" +
" a.table_name = '{0}'\n" +
" and b.table_name = a.table_name\n" +
" and b.column_name = '{1}'\n" +
" and a.trigger_name = b.trigger_name";
command.CommandText = String.Format(sql, this.Tabelle.ToUpper(), this.PrimaryKeyColumn.ColumnName.ToUpper());
using (System.Data.Common.DbDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
reader.Read();
string body = reader.GetString(0);
if (body.Contains("NEXTVAL"))
this.PrimaryKeyColumn.IsAutoIncrement = true;
}
reader.Close();
}
}