アクセスファイル(.accdb)のレコードを更新しようとしています。.netOleDbCommandとOleDbParametersを使用しようとしています。また、汎用モデルを使用して、すべてのコマンドとパラメーターをSystem.Data.Commonの同等の抽象概念に格納し、SQL Serverに簡単に切り替えることができるようにしようとしています(これを行う予定です)。
これが実際に使用されているコマンドです
EDIT 2/2/2013-9:10 pmコマンド.ExecuteNonQuery はExecuteNonQuery()という名前のメソッド内にあり、connectionStringとコマンドはDataAccessクラスコンストラクターで定義されています
public class DataAccess
{
private string connectionString;
private DbConnection connection;
private DbCommand command;
private DbDataReader reader;
private DataTable data;
public DataAccess()
{
connectionString = ConfigurationSettings.AppSettings["ConnectionString"];
switch (ConfigurationSettings.AppSettings["DataBaseType"])
{
case "oledb":
connection = new OleDbConnection(connectionString);
command = new OleDbCommand(string.Empty, (OleDbConnection)connection);
break;
case "SQL":
connection = new SqlConnection(connectionString);
command = new SqlCommand(string.Empty, (SqlConnection)connection);
break;
default:
break;
}
}
public void ExecuteNonQuery(string SQL, params DbParameter[] parameters)
{
command.CommandType = CommandType.Text;
command.CommandText = SQL;
command.Parameters.AddRange(parameters);
try
{
command.Connection.Open();
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
command.Connection.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
public DbParameter NewParameter(string name, object value)
{
DbParameter param;
switch (ConfigurationSettings.AppSettings["DataBaseType"])
{
case "oledb":
param = new OleDbParameter(name, value);
break;
case "SQL":
param = new SqlParameter(name, value);
break;
default:
param = null;
break;
}
return param;
}
これらはApp.Configファイルのプロパティです
<add key="DataBaseType" value="oledb"/>
<add key="ConnectionString" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=data.accdb"/>
ここで問題となるのは、updateステートメントでパラメーターを使用する場合、更新が行われることはなく、エラーがスローされることもありません。これがそのコードです。
2013年2月2日編集-9:10pm 関数DataAccess.NewParameterは最初のコードブロックにあります
DALayer.ExecuteNonQuery("UPDATE TileTypes SET Title = @Title, Picture = @Picture, Color = @Color WHERE ID = @ID",
DALayer.NewParameter("@Title", titleTextBox.Text.Trim()),
DALayer.NewParameter("@Picture", typePictureBox.ImageLocation),
DALayer.NewParameter("@Color", colorButton.BackColor.ToArgb()),
DALayer.NewParameter("@ID", id));
クエリをaccessにコピーし、すべてのパラメータ名を渡される実際のデータに置き換えました。これは正常に機能します。SQLテキストのすべてのパラメータを?に置き換えてみました。効果のない文字。すべてのテーブル名と列名を角かっこ[]で囲んでみましたが、効果はありませんでした。
- IDはオートナンバーフィールドです
- タイトルはテキストフィールドです
- 画像はテキストフィールドです
- 色は長整数フィールドです
これは、VisualStudioの監視ウィンドウのパラメーターから直接コピーされたデータの例です。
- 「編集」(タイトル)
- -1(カラー)
- "data \ images \ Edit_000000.jpg"(画像)
- 740(id)
そのIDはデータベースに存在し、クエリの実行後も変更されていません。
編集2/2/2013-9:10pm 実際に更新されているデータベースを確認する方法がわかりません。考えられる唯一のことは、同じ接続文字列と接続オブジェクトを使用して、同じExecuteNonqueryで挿入ステートメントを実行したことです。メソッドとそれは私が見ていたデータベースで動作しました。そして、updateステートメントは次のようにうまく機能します(パラメーターなし):
DALayer.ExecuteNonQuery("UPDATE TileTypes SET Title = '" + titleTextBox.Text +
"', Color = " + colorButton.BackColor.ToArgb() + ", Picture = '" +
imageLocation + "' WHERE ID = " + id);
編集2/2/2013-9:41pm 私はeverything.exeを使用して、コンピューター上のすべてのdata.accdbファイルを検索しました。元のファイル以外に、実際の.accdbファイルは見つかりませんでしたが、これらの.lnkは見つかりました。ファイル、私は彼らがこのプロセスを変更した可能性があるとは思わないが、とにかくそれについて言及する
data.accdb.LNK