トップ回答者
SQL DBのUPDATEについて

質問
-
こんにちは、初心者の剣道です。
よろしくお願いいたします。
質問をさせていただきます。
今、"時間遅れ設定画面"というフォームの試作PGを組み込んでいます。
画面コントロールの配置は
fromTimeTextBox0 ~ toTimeTextBox0 (開始時間~終了時間)
↓ ↓
fromTimeTextBox8 ~ toTimeTextBox8 (開始時間~終了時間)上から、下まで、テキストボックスは9列、2個ずつ配置になっています。
SQL DBテーブル名:BehindMap
項目:
1. BehindMapCd (PrimaryKey)
2. FromTime (遅れ開始時間)
3. ToTime (遅れ終了時間)仮定 BehindMapCd 値は0~8です。(全部9レコードです。)
やりたいことは、"時間遅れ設定画面"のそれぞれのテキストボックスで
入力された開始時間と終了時間を
BehindMapの BehindMapCd 0~8のレコードを更新したいです。
更新項目は、FromTimeとToTimeです。下記のコードは、BehindMapCd の"0"レコードが更新できます。
全部のレコードを更新する方法が分からないです。
よろしければ、ヒントや助言を教えて頂きたいです。よろしくお願いいたします。
// メインフォームメソッド
private bool UpdateBehindMaster()
{
try
{
// 自作クラス DBAccess
DBAccess.DBAccess dba = new BehindMapEdit.DBAccess.DBAccess(Properties.Settings1.Default.ConnectionString);
// 自作クラス DBCommand
DBAccess.DBCommand commands = new DBCommand();StringBuilder sql = new StringBuilder();
sql.Append("UPDATE");
sql.Append(" MS_BEHINDMAP");
sql.Append(" SET");
sql.Append(" FromMin = @FromMin");
sql.Append(" ,ToMin = @ToMin");
sql.Append(" WHERE BehindMapCd = 0");
commands.SqlStatement = sql.ToString();commands.AddSqlParameter("@FromMin",mapCd0FromTextBox.Text);
commands.AddSqlParameter("@ToMin", mapCd0ToTextBox.Text);int count = dba.Update(commands);
if (count > 0)
{
return true;
}return true;
}
catch (Exception ex)
{
return false;
}
}*************************
DBAccessクラス メソッド
public int Update(DBCommand command)
{
try
{
DBCommand[] commands = new DBCommand[1];
commands[0] = command;
// Update(DBAccessCommand[] commands)メソッドを呼び出す
return Update(commands);
}
catch (Exception ex)
{
// 例外処理// エラー情報をスロー
throw ex;
}
finally
{
}
}
public int Update(DBCommand[] commands)
{
int updateRows = 0; // 更新件数を返す。
try
{
// 接続情報からSqlConnectionを生成する。SqlConnection sqlConnection = new SqlConnection(this._connString);
// SqlConnectionをオープンする。
sqlConnection.Open();
// トランザクションを開始する。SqlTransaction transaction = sqlConnection.BeginTransaction();
try
{
for (int i = 0; i < commands.Length; i++)
{
// SqlCommandオブジェクトを生成する。
SqlCommand sqlCommand = commands.CreateSqlCommand(sqlConnection);
sqlCommand.Transaction = transaction;// 件数を取得する。
updateRows = updateRows + sqlCommand.ExecuteNonQuery();
}
// 処理が成功
transaction.Commit();// 更新件数を返す
return updateRows;
}
catch (Exception ex)
{
// 例外処理transaction.Rollback();
// エラー情報をスローする
throw ex;
}
finally
{
// 終了処理sqlConnection.Close();
}
}
catch (Exception ex)
{
// エラー情報をスローする
throw ex;
}
finally
{
// 終了処理
}
}*************************
DBCommandクラス メソッド
public void AddSqlParameter(string name, object value)
{
try
{
SqlParameter sqlParameter = new SqlParameter();
sqlParameter.ParameterName = name;
sqlParameter.Value = value;
// ArrayListに、生成したSqlParameterを追加する。ArrayListがnullの場合は、生成する。
// _arrayList ローカル変数
_arrayList.Add(sqlParameter);
}
catch (Exception ex)
{
// 例外エラーは、スローする
throw ex;
}
finally
{
}
}
回答
-
まず、BehindMapCdへもパラメータで値を渡すようにします。
sql.Append(" FromMin = @FromMin");
sql.Append(" ,ToMin = @ToMin");
sql.Append(" WHERE BehindMapCd = @BehindMapCd");複数レコードを同時に更新するのであれば、単純に考えて、
commands.AddSqlParameter("@FromMin",mapCd0FromTextBox.Text);
commands.AddSqlParameter("@ToMin", mapCd0ToTextBox.Text);
commands.AddSqlParameter("@BehindMapCd", 0);から
commands.AddSqlParameter("@FromMin",mapCd8FromTextBox.Text);
commands.AddSqlParameter("@ToMin", mapCd8ToTextBox.Text);
commands.AddSqlParameter("@BehindMapCd", 8);まで9回繰り返して実行することになります。
あとはこれをどう発展させるかです。例えばテキストボックスをコントロール配列に入れてForで回して更新したり、値が変わっているテキストボックスのみ更新する仕組みを付けたりなどです。
また、複数レコードを同時に更新するのであれば、トランザクションを切った方が良いでしょう。
すべての返信
-
まず、BehindMapCdへもパラメータで値を渡すようにします。
sql.Append(" FromMin = @FromMin");
sql.Append(" ,ToMin = @ToMin");
sql.Append(" WHERE BehindMapCd = @BehindMapCd");複数レコードを同時に更新するのであれば、単純に考えて、
commands.AddSqlParameter("@FromMin",mapCd0FromTextBox.Text);
commands.AddSqlParameter("@ToMin", mapCd0ToTextBox.Text);
commands.AddSqlParameter("@BehindMapCd", 0);から
commands.AddSqlParameter("@FromMin",mapCd8FromTextBox.Text);
commands.AddSqlParameter("@ToMin", mapCd8ToTextBox.Text);
commands.AddSqlParameter("@BehindMapCd", 8);まで9回繰り返して実行することになります。
あとはこれをどう発展させるかです。例えばテキストボックスをコントロール配列に入れてForで回して更新したり、値が変わっているテキストボックスのみ更新する仕組みを付けたりなどです。
また、複数レコードを同時に更新するのであれば、トランザクションを切った方が良いでしょう。
-
trapemiya様へ
ご早速返答をいただき、有難う御座います。
先程、trapemiya様から教えて頂いた方法で、
試しまして、予想通り動きました。
引用:
あとはこれをどう発展させるかです。例えばテキストボックスをコントロール配列に入れてForで回して更新したり、値が変わっているテキストボックスのみ更新する仕組みを付けたりなどです。
仰った通り、このフォームが立ち上がる時に、DBを読込んで、値をそれぞれのテキストボックスで表示させます。
引用:
また、複数レコードを同時に更新するのであれば、トランザクションを切った方が良いでしょう。
トランザクションの方は、後で試します。
お忙しいところ、本当に有難うございました。
また、よろしくお願いいたします。