如何在 c# 中替换 where 子句中的变量

本文关键字:子句 变量 where 替换 | 更新日期: 2023-09-27 18:32:06

我有一个预言机查询,它将从数据库中获取数据并在网格视图中动态显示它们。使用的查询是 select *from Employee where Location=?Location and Age=?Age and Marks=?Marks 。以 ? 开头的变量 ?是将在运行时填充的占位符。假设在这里我通过选择下拉列表提取占位符并得到它像Location='Chemmad' and Marks='100'.我需要一个逻辑来将我创建的值插入到占位符中,如果缺少某些东西,例如这里缺少Age,我必须捕获缺少的值。简而言之,我有一个下拉列表查询,例如

string query = "select *from Employee where Location=?Location and Age=?Age and Marks=?Marks";

我在运行时获得了占位符的值,例如

string values = "Location='Chemmad' and  Marks='100'";
所以

我想用占位符替换值,同时需要找到缺少的值,所以这里Age

**EDIT**

我将所有查询组合存储在 oracle 数据库本身中:)并在运行时获取并替换值。我想我必须找到=符号的位置,并且需要从任何一侧找到单词??

如何在 c# 中替换 where 子句中的变量

string strValues = "Location='Chemmad' and  Marks='100'"; // this is bad and will cause sql injection attacks.
// what you actually want is an object(s) that you can use in the parameterized query. depending on your input you then dynamically create the where part of your string. something like this:
var parameterValues = new
{
    Location = "Chemmad",
    Marks = 100
};

const string searchTerm = " where ";
var query = @"select * from Employee where Location=?Location and Age=?Age and Marks=?Marks";
var part1 = query.Substring(0, query.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase));
// the following line is not necessary and won't be used. It just illustrates how to get the remainder of the query.
var part2 = query.Substring(query.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) + searchTerm.Length, query.Length - part1.Length - searchTerm.Length);
var myDynamicQuery = part1 + searchTerm;
myDynamicQuery = myDynamicQuery + "Location = :location ";
myDynamicQuery = myDynamicQuery + "AND Marks = :marks ";

myDynamicQuery现在包含字符串:select * from Employee where Location = :location AND Marks = :marks

下一个

  1. 创建您的预言机连接
  2. 创建数据库参数
  3. 针对预言机命令对象执行查询

有关如何从 .NET 正确创建 Oracle 连接并使用参数化查询的信息,请参阅本文。

您应该使用 SqlCommand.Parameters 将参数传递给查询,如下所示。相反,使用 string.Format 会使代码容易受到 SQL 注入的影响。

string commandText = "select *from Employee where Location=@Location and Age=@Age and Marks=@Marks;"
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@Location", SqlDbType.Char);
    command.Parameters["@Location"].Value = Location;
    command.Parameters.Add("@Age", SqlDbType.Int);
    command.Parameters["@Age"].Value = Age;
    command.Parameters.Add("@Marks", SqlDbType.Int);
    command.Parameters["@Marks"].Value = Marks;

    try
    {
        connection.Open();
        Int32 rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine("RowsAffected: {0}", rowsAffected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
  }     
下面是

使用 Oracle 的参数化查询 ODP.net。 就像Jaco的回应一样,这比字符串替换要好得多,原因有很多:

  1. 防止 SQL 注入
  2. 管理数据类型(不需要在 C# 日期时间 => Oracle 的日期上进行任何转换)
  3. 消除了在 SQL 中引用的困难(撇号、引号、回车等)

例:

string query = "select * from Employee where " +
    "Location= :LOC and Age = :AGE and Marks = :MARKS";
OracleCommand cmd = new OracleCommand(query);
cmd.Parameters.Add("LOC", "Chemmad");
cmd.Parameters.Add("AGE", 125);
cmd.Parameters.Add("MARKS", "100");
OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
    object firstField = reader.GetValue(0);
}
reader.Close();
数据类型

更可取Add,尤其是当您有多个值要赋值时(如在插入或更新中),但如果只有一组参数,则Add还允许在单个语句中声明和赋值参数。 在某些实现中,这AddWithValue,但我认为在 Oracle 中它只是Add的过载。

另外,请注意,与 SQL Server 不同,使用 Oracle 时,您在 SQL 中使用:而不是@,并且在声明实际OracleParameters时会关闭该字符。