C# sqlanywhere db上的oledb定向参数

C# sqlanywhere db上的oledb定向参数,c#,oledb,sqlanywhere,C#,Oledb,Sqlanywhere,我有一个SqlContext类,它是为SQLServer、MySql、Odbc和Oledb实现的。它提供了插入、更新和删除等基本功能。在我不得不连接到SqlAnywhere数据库之前,一切都很好。当我调用update时,我得到一个错误,该错误表示找不到该列 以下是更新函数的Odbc实现: public override int Update(string tableName, Action<ISqlParameterizer> actionSqlParameterizerUpdate

我有一个
SqlContext
类,它是为SQLServer、MySql、Odbc和Oledb实现的。它提供了插入、更新和删除等基本功能。在我不得不连接到SqlAnywhere数据库之前,一切都很好。当我调用update时,我得到一个错误,该错误表示找不到该列

以下是更新函数的Odbc实现:

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());
}
异常消息:

错误[42S22][SAP][ODBC驱动程序][SQL Anywhere]Spalte'@user_name'nicht gefunden

它表示“未找到列'@user_name'

commandText
如下所示:

base.Source.Update("SOME_TABLE", set => 
{
    set.Add("ANWENDER_ID", anwender_id); //Store some FK in here
},where =>
{
    where.Add("user_name", user_name); //For a specific user (user_name is pk)
});
update SOME_TABLE set ANWENDER_ID = @ANWENDER_ID where user_name = @user_name
update SOME_TABLE set ANWENDER_ID = ? where user_name = ?

my
SqlCommand
的参数填写正确。为什么说找不到该列?该列存在并且具有正确的名称。当我复制
commandText
并填写参数时,我可以执行查询。有人能解释一下吗?

CommandText中的@参数对于SQLAnywhere是无效的语法

SQL语句中参数的占位符由?性格对于任何插入、更新或删除,每个?根据其在命令参数集合中的顺序位置引用。例如,第一个?被称为0,第二个被称为1

因此,您的CommandText需要如下所示:

base.Source.Update("SOME_TABLE", set => 
{
    set.Add("ANWENDER_ID", anwender_id); //Store some FK in here
},where =>
{
    where.Add("user_name", user_name); //For a specific user (user_name is pk)
});
update SOME_TABLE set ANWENDER_ID = @ANWENDER_ID where user_name = @user_name
update SOME_TABLE set ANWENDER_ID = ? where user_name = ?

就这样。我的OleDbSqlContext实现具有构建查询的逻辑。但是由于synthax for语句是由我的OleDbSqlContext所连接的数据库的目标限定的,因此我将OleDbSqlContext类抽象化,并为每个目标数据库系统进行了实现。