【发布时间】:2013-02-03 01:13:31
【问题描述】:
我正在尝试更新访问文件 (.accdb) 中的记录。我正在尝试使用 .net OleDbCommand 和 OleDbParameters。我还尝试使用通用模型并将所有命令和参数存储在 System.Data.Common 抽象等效项中,以便我可以轻松切换到 SQL Server(我确实计划这样做)
所以这是实际使用的命令
编辑 2/2/2013 - 晚上 9:10 command.ExecuteNonQuery 在名为 ExecuteNonQuery() 的方法内 connectionString 和 command 在 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"/>
现在的问题是在更新语句中使用参数时,更新永远不会发生,也永远不会引发错误。这是它的代码。
编辑 2/2/2013 - 晚上 9:10 函数 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 是一个自动编号字段
- 标题是文本字段
- 图片是文本字段
- 颜色是一个长整数字段
这是一些直接从 Visual Studio 监视窗口中的参数复制的示例数据:
- “编辑”(标题)
- -1(颜色)
- “data\images\Edit_000000.jpg”(图片)
- 740(身份证)
该 ID 确实存在于数据库中,并且在执行查询后未更改。
编辑 2/2/2013 - 晚上 9:10 我不确定如何检查实际上正在更新哪个数据库,我唯一能想到的是使用相同的连接字符串和连接对象,我使用相同的 ExecuteNonquery 方法执行了插入语句,它在我正在查看的数据库中工作.并且更新语句可以像这样正常工作(不带参数):
DALayer.ExecuteNonQuery("UPDATE TileTypes SET Title = '" + titleTextBox.Text +
"', Color = " + colorButton.BackColor.ToArgb() + ", Picture = '" +
imageLocation + "' WHERE ID = " + id);
编辑 2/2/2013 - 晚上 9:41 我已经使用everything.exe 在我的计算机上搜索我的计算机上的所有data.accdb 文件,除了原始文件之外,我没有发现任何实际的.accdb 文件,但我确实找到了这些.lnk 文件,我不相信它们会改变这个过程,但我还是会提到它
data.accdb.LNK
【问题讨论】:
-
很难说你在每个 UpDate Param 查询中做了什么你在哪里执行非查询命令.. 你能更好地清理示例并显示代码的完整代码吗?不工作......不适用于正在工作的代码......
-
您确定您正在检查正确数据库中的数据吗?我之所以这么说,是因为您可能正在查看该文件的副本。
-
我会在
command.ExecuteNonQuery();设置一个断点并检查命令参数是否设置正确。 -
您是否还记得创建项目时的一条消息“您选择的连接使用了一个不在当前项目中的本地数据文件。您想将该文件复制到您的项目并修改连接吗? ? 如果您将数据文件复制到您的项目中,则每次运行应用程序时都会将其复制到项目的输出目录中。” -- msdn.microsoft.com/en-us/library/ms246989(v=vs.100).aspx ?
-
不,我从未将数据库添加到项目中,我正在通过外部数据库的连接字符串访问它。此外,如果是这种情况,插入语句会起作用吗?因为它确实(使用相同的命令和连接对象)
标签: c# .net sql ms-access parameters