Как написать: вставить в таблицу ВСЕ, кроме оператора X, if

#c# #asp.net #sql #if-statement

#c# #asp.net #sql #if-оператор

Вопрос:

Второй вопрос за все время в этом сообществе! Я новичок, и моя слабость — это операторы if внутри циклов or и другие операторы if.

Итак, вот мой сценарий. Этот метод вставляет что-либо в базу данных, но я хочу что-то проверить. Вместо того, чтобы добавлять что-либо в базу данных, я не хочу, чтобы что-либо вводилось, начинающееся с «LIFT», я хочу, чтобы метод пропускал эту строку и переходил к следующей. Есть ли способ, которым я могу запрограммировать это в этот метод? Или мне нужно написать новый метод? Большое спасибо!

       public bool BatchInsert(string table, string[] values)
{
    string statement = "INSERT INTO "   table   " VALUES(";
    for (var i = 0; i < values.Length - 1; i  )
    {
        if(values[i].Contains("'")){
            values[i] = values[i].Replace("'", "''");
        }
        statement  = "'" values[i] "', ";
    }
    statement  = "'"   values[values.Length - 1]   "');";

    SqlCommand comm = new SqlCommand(statement, connectionPCICUSTOM);
    try
    {
        comm.Connection.Open();
        comm.ExecuteNonQuery();
    }
    catch (Exception e)
    {
        KaplanFTP.errorMsg = "Database error: "   e.Message;
    }
    finally
    {
        comm.Connection.Close();
    }

    return true;

}
  

Комментарии:

1. Остерегайтесь уязвимостей SQL-инъекций. Этот код выглядит восприимчивым к ним.

2. Пожалуйста, не называйте себя новичком . Я съеживаюсь каждый раз, когда кто-то говорит это о себе. Причина, по которой вы здесь, — учиться, а не сбивать себя с ног! 😉

3. Я знаю Джорджа! : D Я не считаю noob оскорбительным, скорее сленг для новичка xD С этого момента я буду использовать beginner

Ответ №1:

Пара подсказок. Не вводите типы = string, так как это снижает производительность. Я также предпочитаю циклы foreach, поскольку код чище и легче читается / с меньшей вероятностью испортит индекс. Также используйте оператор using для обеспечения надлежащего удаления.

Предполагая, что у вас есть ссылка на System .Linq вы можете использовать следующее. Я не тестировал его, но он должен работать:

 public bool BatchInsert(string table, IEnumerable<string> values)
    {
        var sql = new StringBuilder();
        sql.Append("INSERT INTO "   table   " VALUES(");

        var newValues = values.Where(x => !x.StartsWith("LIFT")).Select(x => string.Format("'{0}'", x.Replace("'", "''")));
        sql.Append(string.Join("","", newValues.ToArray()));
        sql.Append(")");

        using (var comm = new SqlCommand(statement, connectionPCICUSTOM))
        {
            try
            {
                comm.Connection.Open();
                comm.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                KaplanFTP.errorMsg = "Database error: "   e.Message;
            }
            finally
            {
                comm.Connection.Close();
            }
        }
        return true;
    }
  

Комментарии:

1. Привет, Люк, спасибо. Я использую System.Linq. Если вы не возражаете зарегистрироваться завтра, я буду тестировать ваш скорректированный метод. Я дам вам знать, если что-нибудь появится, если вам интересно. Большое спасибо!

Ответ №2:

Если ваша цель состоит в том, чтобы перебирать вашу коллекцию «значений», оставляя значения, начинающиеся с «lift», и соответствующие им столбцы нетронутыми, вам, возможно, придется пересмотреть способ построения вашего запроса INSERT. Вы будете добавлять столбцы по мере необходимости, вместо того, чтобы предполагать, что каждое значение будет учитываться. В принципе, вам нужно будет использовать форму:

 INSERT INTO tablename (col1, col2...) VALUES (val1, val2...)
  

Например:

 string statement = "INSERT INTO tablename ";
string columns = "(";
string values = "(";
for (var i = 0; i < values.Length - 1; i  )
{
     //if values doesn't contain lift, add it to the statement
     if(!values[i].contains("LIFT")){
          //columnName is a collection of your db column names
          columns  = "'" columnName[i] "'";
          values  = "'" values[i] "'";
     }
 }
 columns  = ")";
 values  = ")";
 statement  = columns  " VALUES "   values;
  

Как указано в некоторых комментариях, этот подход открывает вам доступ к SQL-инъекциям. Используйте с осторожностью.

РЕДАКТИРОВАТЬ: Извините, я пропустил, где вы сказали «начинается с «LIFT». Измените строку .contains() на следующую:

 if(!values[i].StartsWith("LIFT")){