2

に問題がありましたDataAdapter.Update

シナリオは次のとおりです。このようなデータベーステーブルがあります

Student
(StudentID INT NOT NULL,
 STUDENTNAME NVARCHAR(100),
 STUDENTIdentity    INT DEFAULT 10)

そして、私のDatatable中には次のような行があります

ds学生

StudentID   STUDENTNAME STUDENTIdentity 
1           AAA         
2           BBB             20
3           CCC             

Datatableこのように生徒を更新しようとすると

ds.Update(dsStudent,"Student");

これはうまくいっています。しかし、studentidentityデータベース内の私の列では、デフォルト値 10 の代わりに NULL 値が挿入されています。

イベントを実装OnRowUpdatingし、パラメーターを変更して、行単位の更新ステートメントの変更を実現することを考えました。

しかし問題は、これが私のプロジェクトにすでに実装されていることです。では、これを行うための一般的な解決策はありますか?

更新しようとしているサンプルコード

        dr = ds.Tables["Student"].NewRow();

        dr["StudentId"] = 534;

        dr["StudentName"] = "robin";

        ds.Tables["Student"].Rows.Add(dr);

        cmdBuilder = new SqlCommandBuilder(da);

        da.Update(ds, "Student");
4

2 に答える 2

0

DataAdapter.UpdateメソッドはDataAdapter.UpdateCommand.CommandText、データベースと話すために使用します。文字列を見ると、デフォルトで次のことが適切であることがわかります。

UPDATE [Student]
SET [StudentID] = @StudentID,
    [STUDENTNAME] = @STUDENTNAME,
    [STUDENTIdentity] = @STUDENTIdentity
WHERE
    ...

問題は、[STUDENTIdentity] = @STUDENTIdentityコマンドが列に明示的に設定されている行にDBNullあります。そのため、データベースのデフォルト値が機能しません。

それDataAdapter.UpdateCommand.CommandTextが書き込み可能なプロパティであることを確認してください。したがって、一般的ではないが最も単純な解決策は、以前の元のコマンド テキストをコピーし、問題のある行を削除して、変更されたバージョンを元に戻すことです。

UPDATE [Student]
SET [StudentID] = @StudentID,
    [STUDENTNAME] = @STUDENTNAME
WHERE
    ...

その後、STUDENTIdentity は明示的に更新されないため、データベースのデフォルト値が使用されます。

おそらくあなたも更新する必要がありInsertCommandます。

于 2013-05-07T07:30:40.000 に答える
0

sqlcommandbuilder を使用して更新コマンドを生成する代わりに、独自の sql コマンドを使用します。

更新用:

 SqlCommand upCmd = new SqlCommand(
"update emp set Name=@Name, Age=@Age where No=@No",con);
 upCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name");
 upCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age");
 upCmd.Parameters.Add("@No", SqlDbType.Int, 4, "No");
 sqlDa.UpdateCommand = upCmd;
 sqlDa.Update(dSet,"emp");

挿入用:

 SqlCommand insCmd = new SqlCommand(
 "insert into emp (Name, Age) values(@Name, @Age)",con);
 insCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name");
 insCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age");
 sqlDa.InsertCommand = insCmd;
 sqlDa.Update(dSet,"emp");

パラメータ値で新しい行の値を指定します。

これを試して、私に知らせてください/

于 2013-01-23T07:48:55.997 に答える