C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: C# ACCESS OdbcでUPDATEできない


(過去ログ 172 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■99322 / inTopicNo.1)  C# ACCESS OdbcでUPDATEできない
  
□投稿者/ Zincite (1回)-(2022/03/13(Sun) 17:28:58)

分類:[C#] 

UPDATEのSQLが通らず、アドバイスを頂けると幸いです。

SaveでINSERTとUPDATEを設定します。
ExecuteProcessでUPDATE文から実行し、更新結果が0行ならINSERTを実行します。
このプログラムのUPDATEが通らずに更新結果0行となり、INSERTまで進んでしまいます。

SELECT文で読み出せるか試したところ、WHERE条件にProcessId AND CreateDate AND SerialNumber だと読み出します。
しかし、CreateDate もしくは SerialNumber のみを条件にすると読み出せません。

パラメータの設定にクセがあるような感じはしてきているのですが、
ACCESSを操作する際の何か注意事項等あれば教えていただきたいです。

Processテーブル
ProcessId:数値型
CreateDate:日付/時刻型
SerialNumber:短いテキスト
StaffName:短いテキスト
Terminal:短いテキスト
CompleteDate:日付/時刻型


public void Save(ProcessEntity process)
{
string insert = @"
INSERT INTO Process
(ProcessId,CreateDate,SerialNumber,StaffName,Terminal,CompleteDate)
VALUES
(?,?,?,?,?,?)
";
string update = @"
UPDATE Process
SET CreateDate = ?,
SerialNumber = ?,
StaffName = ?,
Terminal = ?,
CompleteDate = ?
WHERE ProcessId = ?
AND CreateDate = ?
AND SerialNumber = ?
";

var createDate = new OdbcParameter("@CreateDate", OdbcType.DateTime);  //←型を明示してみてもダメ
createDate.Value = process.CreateDate.Value;

var serialNumber= new OdbcParameter("@SerialNumber", OdbcType.VarChar);
serialNumber.Value = process.SerialNumber.Str;

var args = new List<OdbcParameter>
{
new OdbcParameter("@ProcessId",process.ProcessId.Value),
createDate,
new OdbcParameter("@SerialNumber",process.SerialNumber.Str),
new OdbcParameter("@StaffName",process.StaffName.Str),
new OdbcParameter("@Terminal",process.Terminal),
new OdbcParameter("@CompleteDate",process.CompleteDate.Value),
};
OdbcHelper.ExecuteProcess(insert, update, args.ToArray());
}


internal static void ExecuteProcess(string insert, string update, OdbcParameter[] paramaters)
{
using (var connection = new OdbcConnection(ProcessConnection))
using (var command = new OdbcCommand(update, connection))
{
connection.Open();
if (paramaters != null)
{
command.Parameters.AddRange(paramaters);
}
if (command.ExecuteNonQuery() < 1)
{
command.CommandText = insert;
command.ExecuteNonQuery();
}
}
}
引用返信 編集キー/
■99323 / inTopicNo.2)  Re[1]: C# ACCESS OdbcでUPDATEできない
□投稿者/ Zincite (2回)-(2022/03/13(Sun) 17:42:38)
No99322 (Zincite さん) に返信

すみません自己解決してしまいました。
単純にUPDATE文とパラメータの並びが違うからでした。


> string update = @"
> UPDATE Process
> SET CreateDate = ?,
> SerialNumber = ?,
> StaffName = ?,
> Terminal = ?,
> CompleteDate = ?
> WHERE ProcessId = ?
> AND CreateDate = ?
> AND SerialNumber = ?
> ";
>
> var createDate = new OdbcParameter("@CreateDate", OdbcType.DateTime);  //←型を明示してみてもダメ
> createDate.Value = process.CreateDate.Value;
>
> var serialNumber= new OdbcParameter("@SerialNumber", OdbcType.VarChar);
> serialNumber.Value = process.SerialNumber.Str;
>
> var args = new List<OdbcParameter>
> {
> new OdbcParameter("@ProcessId",process.ProcessId.Value),
> createDate,
> new OdbcParameter("@SerialNumber",process.SerialNumber.Str),
> new OdbcParameter("@StaffName",process.StaffName.Str),
> new OdbcParameter("@Terminal",process.Terminal),
> new OdbcParameter("@CompleteDate",process.CompleteDate.Value),
> };


下記に変更したらOKで、余分な型変換とか必要なかったです。
SQLだと「ProcessId = @ProcessId」みたいな感じで、
ACCESSだと「?」を使うのでどうやってつながっているのかよくわかってなくて
左辺の文字列で判断してるのかなと勝手に思い込んでました。

string update = @"
UPDATE Process
SET StaffName = ?,
Terminal = ?,
CompleteDate = ?
WHERE ProcessId = ?
AND CreateDate = ?
AND SerialNumber = ?
";

var args = new List<OdbcParameter>
{
new OdbcParameter("@StaffName",process.StaffName.Str),
new OdbcParameter("@Terminal",process.Terminal),
new OdbcParameter("@CompleteDate",process.CompleteDate.Value),
new OdbcParameter("@ProcessId",process.ProcessId.Value),
new OdbcParameter("@CreateDate",process.CreateDate.Value),
new OdbcParameter("@SerialNumber",process.SerialNumber.Str),
};
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -