oledb 忽略 sql Anywhere-db 上的参数

Posted

技术标签:

【中文标题】oledb 忽略 sql Anywhere-db 上的参数【英文标题】:oledb diregarding parameters on sqlanywhere-db 【发布时间】:2018-04-23 14:30:19 【问题描述】:

我有一个为 SQL Server、mysql、Odbc 和 Oledb 实现的 SqlContext 类。它提供插入、更新和删除等基本功能。在我不得不连接到 SqlAnywhere 数据库之前,一切正常。当我调用更新时,我收到一个错误,提示找不到该列。

这是我的更新函数的 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());

我这样称呼它:

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)
);

异常信息:

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

它显示“未找到列 '@user_name'”。

commandText 看起来像这样:

update SOME_TABLE set ANWENDER_ID = @ANWENDER_ID where user_name = @user_name

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

【问题讨论】:

【参考方案1】:

CommandText 中的@parameter 不是SQLAnywhere 的有效语法。

SQL 语句中参数的占位符由 ? 指示。特点。对于任何 INSERT、UPDATE 或 DELETE,每个 ?根据其在命令参数集合中的序号位置进行引用。例如,第一个 ?被称为0,第二个被称为1。

所以您的 CommandText 需要如下所示:

update SOME_TABLE set ANWENDER_ID = ? where user_name = ?

【讨论】:

就是这样。我的 OleDbSqlContext 实现具有构建查询的逻辑。但是由于语句的合成器是由我的 OleDbSqlContext 正在连接的数据库的目标终止的,因此我将 OleDbSqlContext 类抽象为每个目标数据库系统的实现。

以上是关于oledb 忽略 sql Anywhere-db 上的参数的主要内容,如果未能解决你的问题,请参考以下文章

即使在连接字符串中使用 HDR=No ,使用 OLEDB 读取 CSV 文件也会忽略第一行

SQL Server 如何安装 OLEDB 驱动

SQL SERVER中的OLEDB等待事件

使用 DEFAULT 值和 OleDB 时如何终止 SQL 语句?

如何在c#中使用oledb执行pl sql块

制表符分隔文件的 OleDb 连接字符串