4

テーブルAからテーブルBにデータをコピーしています。テーブルBには、デフォルトの制約値が0のnull許容列があります。通常、次のアクセサーを使用して列の値を設定します。

public object this[string columnName]
{
    get { return DataTable.Rows[CurrentRow][columnName]; }
    set { DataTable.Rows[CurrentRow][columnName] = value; }
}

ただし、 null許容列Xは設定しません。

行全体を挿入すると、デフォルト値は使用されません。0の代わりに、NULL可能列にNULLが挿入されました。

_sqlCommandBuilder = new SqlCommandBuilder(_sqlDataAdapter);
_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;
_sqlCommandBuilder.SetAllValues = false;
_sqlDataAdapter.Update(DataTable);

スキーマも取得します。

_sqlDataAdapter.Fill(DataTable);
_sqlDataAdapter.FillSchema(_dataTable, SchemaType.Mapped);

設定しなかったのに、ADO.NETが列XにNULLを設定するのはなぜですか?

列Xの値を設定しない場合、ADO.NETは指定された制約からデフォルト値を取得すると思いました。

ADO.NET CommandBuilderはデフォルトの制約を使用できますか?

4

2 に答える 2

3

CommandBuilderの更新メソッドを実装するためにを使用する必要はありませんDataAdapter。はCommandBuilder問題でいっぱいです。DataAdapter.SelectCommandおよびDataAdapter.UpdateCommandプロパティをDbCommand、SQLを直接指定するオブジェクトに設定できます。CommandBuilderこれにより、適切なSQLステートメントを生成する機能に固有の問題が回避されます。

アップデート:

CommandBuilderがデフォルト値を使用することを知る方法はありません。挿入ステートメントを生成するだけです。列がある場合は、挿入ステートメント用にそれを生成します。その列が挿入ステートメントの一部である場合、その列に指定された値は、nullであっても挿入されます。デフォルト値は、挿入ステートメントに含めない状況用です。CommandBuilderであるかどうかに関係なく、アイテムをどのように挿入しようとしても、nullはデフォルト値に変換されません。

CommandBuilderを使おうとするこの道を歩み続けることは、あなたにもっと悲しみを与えるだけです。select句で単純な結合ステートメントを処理することさえできません。また、主キーが必要です。これらのいずれかに違反すると、正しい更新、挿入、および削除ステートメントを生成できません。このクラスを実装したのは、SQL ServerとOracleの2つのプロバイダーだけであり、Oracleのプロバイダーには、上記の基本的な問題以外では修正されなかったバグがあることがわかっています。

2つのDbCommandオブジェクト(1つは選択用、もう1つは挿入用)を使用し、DbDataReaderを介してselect DbCommandの出力をループした場合、その列のnullを簡単にチェックし、挿入DbCommandにデフォルト値のゼロを指定できます。あなたはそれが何であるかを知っているので。データベースのルールを知り、必要に応じてそれらを使用することは、いかなる種類のコード編成ルールにも違反しません。この種のコードを書くには、とにかくデータベースに何があるかを知る必要があります。

SQL Server 2005以降を使用している場合は、INSERT INTO..SELECTステートメントを使用することをお勧めします。SQLが十分に優れている場合は、CASE句を使用して単一のSQLステートメントを作成できます。

于 2011-05-11T17:51:40.027 に答える
0

ちょっとした質問ですが、それは明白に思えるかもしれませんが、実際には注意が必要です。

_sqlCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;

私がMSDNの定義を引用すると、次のように読むことができます。

"If no PrimaryKey is defined, all searchable columns are included in the WHERE clause."

私の友人で、主キーの代わりに一部のカムでIDENTITY(1、1)を定義するために使用されました。

ちょっとした質問ですが、「更新された」テーブルBで主キーを使用していますか?



それから....

情報を追加するために、SqlAdapter.FillSchemaはデフォルト値を使用しません。FillSchemaによって取得される情報は次のとおりです。

AllowDBNull 
AutoIncrement.You must set AutoIncrementStep and AutoIncrementSeed separately.
MaxLength 
ReadOnly 
Unique

( MSDNサイトからの引用)

個性的

于 2011-05-08T11:50:35.057 に答える