我正在尝试更新访问文件(.accdb)中的记录。我正在尝试使用.net OleDbCommand和OleDbParameters。我也尝试使用通用模型并将所有命令和参数存储在System.Data.Common抽象等效项中,以便我可以轻松切换到SQL Server(我打算这么做)参数化更新
So这里是正在使用的实际命令
EDIT 2013年2月2日 - 下午9点十分 的command.ExecuteNonQuery是 所述的connectionString以及指令在数据访问类构造
定义)命名的ExecuteNonQuery(方法内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"/>
现在的问题是在更新语句中使用参数时,更新从未发生过,也永远不会抛出错误。这是它的代码。
编辑2013年2月2日 - 9:10 PM 功能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));
我抄查询到的访问和替换所有的参数名称与实际的数据通过,这工作正常。我试图将SQL文本中的所有参数替换为?字符不起作用。我已经尝试将括号[]中的所有表格和列名放在一起也没有效果。
- ID是一个自动编号字段
- 标题是文本字段
- 图片是一个文本字段
- 颜色是一个长整型字段
这是已复制了一些示例数据直接从Visual Studio的观察窗口中的参数:
- “编辑”(标题)
- -1(颜色)
- “数据\ IMAGES \ Edit_000000.jpg”(图片)
- 740(ID)
即ID在数据库中确实存在并且在查询执行后没有改变。
编辑2013年2月2日 - 9:10 PM 我不知道如何检查该数据库实际上是被更新,我能想到的唯一的事情是,使用相同的连接字符串和连接对象我做一个具有相同ExecuteNonquery方法的insert语句,它在我正在查看的数据库中工作。和update语句工作得很好,像这样(不带参数):
DALayer.ExecuteNonQuery("UPDATE TileTypes SET Title = '" + titleTextBox.Text +
"', Color = " + colorButton.BackColor.ToArgb() + ", Picture = '" +
imageLocation + "' WHERE ID = " + id);
编辑2013年2月2日 - 下午九时41 我已经使用everything.exe搜索我的电脑上的所有数据。 accdb文件在我的电脑上,除了原始文件,我没有发现任何实际的.accdb文件,但是我确实发现了这些.lnk文件,我不相信它们可以改变这个过程,但是我仍然会提及它
data.accdb。 LNK
很难告诉你在每个UpDate Param中做什么查询你在哪里执行非查询命令..你能更好地清理这个例子,并显示代码不工作的完整代码...不是代码工作.. – MethodMan
你确定你要检查数据在正确的数据库中?我只是这样说,因为你可能正在查看文件的副本 – PhoenixReborn
我会在'command.ExecuteNonQuery();'处设置一个断点并检查命令参数设置是否正确 –