Как написать: вставить в таблицу ВСЕ, кроме X, если заявление - PullRequest
0 голосов
/ 13 октября 2011

Второй вопрос всех времен этого сообщества!Я новичок, и моя слабость в том, что операторы if внутри или среди циклов и другие операторы 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;

}

Ответы [ 2 ]

1 голос
/ 14 октября 2011

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

Если у вас есть ссылка на 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;
    }
0 голосов
/ 13 октября 2011

Если ваша цель состоит в том, чтобы перебрать вашу коллекцию «значений», оставив значения, начинающиеся с «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-инъекций. Используйте с осторожностью.

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

if(!values[i].StartsWith("LIFT")){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...