我的 c# 应用程序有问题。我尝试通过 oledb-connection 更新访问数据库。
这是表的架构:
这是我正在使用的功能:
public override int Update(string tableName, Action<ISqlParameterizer> actionSqlParameterizerUpdate, Action<ISqlParameterizer> actionSqlParameterizerWhere)
{
var commandText = $"update {tableName} set @update where @where";
var whereBuilder = new StringBuilder();
var updateBuilder = new StringBuilder();
var whereParameterizer = SqlParameterizer.CreateFrom(this);
var updateParameterizer = SqlParameterizer.CreateFrom(this);
actionSqlParameterizerWhere?.Invoke(whereParameterizer);
actionSqlParameterizerUpdate?.Invoke(updateParameterizer);
List<IDbDataParameter> parameterList = new List<IDbDataParameter>();
foreach (var whereParameter in whereParameterizer.GetParameters())
{
whereBuilder.Append($" and {whereParameter.ParameterName} = @{whereParameter.ParameterName}");
parameterList.Add(whereParameter);
}
foreach (var updateParameter in updateParameterizer.GetParameters())
{
updateBuilder.Append($", {updateParameter.ParameterName} = @{updateParameter.ParameterName}");
parameterList.Add(updateParameter);
}
commandText = commandText.Replace("@where", whereBuilder.ToString().Substring(4));
commandText = commandText.Replace("@update", updateBuilder.ToString().Substring(1));
return base.ExecuteNonQuery(commandText, parameterList.ToArray());
}
命令文本属性如下所示:
更新 MY_TABLE 设置 MY_COLUMN = @MY_VALUE 其中 SOME_COLUMN = @SOME_VALUE
SOME_COLUMN 的数据类型是numeric, MY_COLUMN 的数据类型是Memo。
两个参数都是 oledbtype 整数。我尝试将 MY_COLUMN 的参数添加为字符串,因此参数是 VarWChar,但这没有区别。
运行命令后没有任何反应,没有更新任何行。当我在 Access 本身中输入命令文本并执行语句时。Access 会询问我的参数值。我输入我的值并更新行。
为什么这不适用于我的 oledb 连接?
问题似乎出在我正在使用的 SqlContext 类中。
使用普通的 OleDbConnection:
using (var connection = new OleDbConnection(CONNECTION_STRING_ACCESS))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = $"UPDATE MY_TABLE SET MY_COLUMN = @MY_VALUE WHERE SOME_COLUMN = @SOME_VALUE";
command.Parameters.Add(new OleDbParameter("MY_COLUMN", "MY_VALUE"));
command.Parameters.Add(new OleDbParameter("SOME_COLUMN", 1));
command.ExecuteNonQuery();
}
}
工作得很好...
使用我的课程:
using (var accessContext = SqlContext.Create(CONNECTION_STRING_ACCESS, SqlProvider.AccessSql))
{
accessContext.Update("MY_TABLE", update => {
update.Add("MY_COLUMN", "MY_VALUE");
}, where => {
where.Add("SOME_COLUMN", 1);
});
}
不工作...
我比较了两个版本的 commandtext-objekt 和参数对象,它们是相同的(“MY_COLUMN”的值除外,否则我无法识别该行是否已更新)。(我无法添加屏幕截图,因为堆栈溢出说“不支持格式”,有趣的是,当我尝试添加第二个屏幕截图时,我能够毫无问题地添加我的第一个屏幕截图(.bmp)( .bmp)显示错误)。
有什么建议是什么导致了问题?