[英]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.