2016-01-27 2 views
-1

У меня есть запрос оракула, который будет извлекать данные из базы данных и отображать их в gridview динамически. Используемый запрос: select *from Employee where Location=?Location and Age=?Age and Marks=?Marks. Переменная начинается с? являются заполнителями, которые будут заполнены во время выполнения. Предположим, что я извлек место держателей, выбрав drop down и получив его как Location='Chemmad' and Marks='100'. Мне нужна логика для вставки значений, которые я создал для держателей места, и если какая-то вещь упущена, например, здесь Age отсутствует, я должен захватить недостающий one.In скорлупы у меня есть запрос для выпадающего списка, какКак заменить переменную в where в C#

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

я получил значение во время выполнения для заполнителей как

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

, поэтому я хочу, чтобы заменить значения с заполнители и в то же время необходимо найти пропавших без вести здесь Age

**EDIT** 

Я сохранил все комбинации запросов в самом :) и кокетливом во время выполнения и заменяющего values.I думает, что я должен найти местоположение = знак и нужно найти слова из любой стороны оракула базы данных? ?

+0

Непонятно, что вы просите. Вы хотите сделать простые манипуляции с строкой, т.е. динамически создавая свое предложение where? Вам нужна помощь в понимании того, как создать параметризованный оператор sql для Oracle? Вы не знаете, как связать свой пользовательский интерфейс и ваш уровень db/service? Почему вы не добавляете ожидаемый ввод и ожидаемый результат или что-то еще, чтобы уточнить, что вы ищете в ответ. – Igor

+0

Вам нужно указать значение каждого [параметра] (https://msdn.microsoft.com/en-us/library/system.data.oracleclient.oraclecommand.parameters%28v=vs.110%29.aspx) один за раз. Похоже, вы хотите заменить раздел вашего запроса на другую строку, но это не так, как это обычно делается ... –

+0

@Igor я отредактировал мой вопрос, мне нужна простая строка manupulation – peter

ответ

1
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. создать свой DbParameters
  3. Выполнить запрос к объекту команды оракул

См. this article, как правильно создать соединение Oracle с .NET и использовать параметризованный запрос.

1

Вы должны использовать SqlCommand.Parameters для передачи параметров по вашему запросу, как показано ниже. Вместо этого использование string.Format оставляет ваш код уязвимым для SQL-инъекции.

string commandText = "select *from Employee where [email protected] and [email protected] and [email protected];" 

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); 
    } 
    }  
+0

Я отредактировал свой вопрос. Я сохранил все комбинации запросов в базе данных oracle :) и извлечение времени выполнения и замена значений – peter

+0

Мне нужна простая маннуляция строк, чтобы построить где clasue.Rest все, что я сделал – peter

+0

Почему вы не используя параметризованную хранимую процедуру? – Jaco

1

Вот параметризованный запрос Oracle с использованием ODP.net. Как ответ Жако, это гораздо лучше, чем замена строки по многим причинам:

  1. предотвращает SQL Injection
  2. Управляет типами данных (не нужно делать какие-либо преобразования в C# DateTime => 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.

Смежные вопросы