繁体   English   中英

如何将ADO.NET SQL Server参数化查询转换为ORACLE查询(在Regex中)?

[英]How to convert ADO.NET SQL Server parametrized query to ORACLE query (in Regex)?

查询可以像:

SELECT * FROM ATable WHERE AColumn = @AColumn;
SELECT * FROM ATable WHERE AColumn >= @AColumn;
SELECT * FROM ATable WHERE AColumn BETWEEN @AColumn1 AND @AColumn2; //not necessary to support

如果有比正则表达式更好的选择,我欢迎您提出建议。 必须有一个方法/委托,当找到匹配项时,实际上会为DbCommand添加DbParameter 这只是我的正则表达式技能之外的方法。

编辑:实际上,我很乐意将其限制为=,<,>,> =,<=,以使列只能是1次。 因此,将IN,NOT IN和BETWEEN排除在外。 可以通过其他方式进行更复杂的查询(在注释中说明)。

-米

好。 我做了非常基本的实现,但是如果有人必须这样做,那么他可能会在最基本的情况下理解。 这里的查询以oracle格式编写,如果是sql-server,我们将:“ placeholder”更改为@。

    public void AddParameters(string query, List<object> valueList)
    {
        int orderNr = 0;

        string newQuery = Regex.Replace(query, @"(?<Operator>=|<=|>=|<|>)\s?(?<PlaceHolder>:)(?<ColumnName>([A-Za-z0-9\-]+))",
            new MatchEvaluator(
                delegate(Match match)
                {
                    var param = this.ProviderFactory.CreateParameter();
                    param.ParameterName = match.Groups["ColumnName"].Value;
                    param.DbType = GetDbType(valueList[orderNr]);
                    param.Value = valueList[orderNr++];
                    Parameters.Add(param);

                    if (ProviderType == DbProviderType.SqlServer)
                        return string.Format("{0}@{1}", match.Groups["Operator"].Value, match.Groups["ColumnName"]); 

                    return match.Value;
                }
        ));
    }

    private DbType GetDbType(object value)
    {
        if (value is int)
            return DbType.Int32;
        else if (value is double)
            return DbType.Double;
        else if (value is string)
            return DbType.String;
        else 
            return DbType.DateTime;
    }

像这样使用:

query = "SELECT * FROM ATable WHERE ColumnA=:ColumnA AND ColumnB=ColumnB AND (LanguageId=:LANGUAGEID OR LanguageId = '*')";
cmd.AddParameters(query, new List<object> { tableId, fieldName, languageId });

这里的cmd是我自己对DbCommand类的抽象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM