0

現在、C# の winForm を作成しており、グリッドを使用して、ユーザーが編集できるように 2 つのテーブルから取得したデータを表示する必要があります。

表は次のとおりです。

学生テーブル:

id int
name char(10)

件名テーブル:

id int
name char(10)

Studentsubject テーブル:

id int (Pri key, AUTO_INCREMENT)
student_id int 
subject_id int 
mark int

winform のグリッドは、次の SQL を使用して、特定の学生 (例: id = 12345) の科目を表示します。

select studentsubject.id, subject.name, studentsubject.mark
from subject, studentsubject
where studentsubject.student_id = 12345
and studentsubject.subject_id = subject.id

取得されたこのデータはデータセットに配置され、最初の列 (studentsubject.id) が非表示のグリッドに配置されます。

私はそれを行うためにdatagridviewを使用し、ユーザーがマークを変更したり、新しい件名に新しい行を追加したり、datagridviewの行を削除して件名を削除したりできるようにしました。

しかし問題は、データの変更をグリッドからデータベースに戻す方法です。

代わりにデータグリッドを使用する必要がありますか??

どうも

4

1 に答える 1

0

以下は、要件に対応する UPDATE、INSERT、および DELETE コマンドです。

update studentsubject 
set mark = @mark

insert into [subject] (name) 
values (@name); 
insert into studentsubject (student_id, subject_id, mark) 
values (1, @@identity, @mark)

declare @subject_id int; 
select @subject_id = subject_id 
from studentsubject 
where id = @id; 
delete from studentsubject 
where id = @id; 
delete from [subject] 
where id = @subject_id

DataRow の状態に基づいて実行する操作を自動的に決定できるため、 SqlDataAdapterを使用して更新を実行することをお勧めします。必要なのは、SqlDataAdapter.Updateメソッドを実行することだけです。もちろん、SqlDataAdapter.DeleteCommandSqlDataAdapter.InsertCommand、およびSqlDataAdapter.UpdateCommandプロパティを割り当てる必要があります。

コード スニペットを次に示します。

adapter.InsertCommand = connection.CreateCommand();
adapter.InsertCommand.CommandText = "insert into [subject] (name) values (@name); insert into studentsubject (student_id, subject_id, mark) values (1, @@identity, @mark)";
adapter.InsertCommand.Parameters.AddRange(new SqlParameter[] {
    new SqlParameter("@name", SqlDbType.Char, 10, "name"),
    new SqlParameter("@mark", SqlDbType.Int, 1, "mark")
});
adapter.UpdateCommand = connection.CreateCommand();
adapter.UpdateCommand.CommandText = "update studentsubject set mark = @mark";
adapter.UpdateCommand.Parameters.Add("@mark", SqlDbType.Int, 1, "mark");
adapter.DeleteCommand = connection.CreateCommand();
adapter.DeleteCommand.CommandText = "declare @subject_id int; select @subject_id = subject_id from studentsubject where id = @id; delete from studentsubject where id = @id; delete from [subject] where id = @subject_id";
adapter.DeleteCommand.Parameters.Add("@id", SqlDbType.Int, int.MaxValue, "id");
于 2013-06-24T21:21:40.153 に答える