В настоящее время мне нужно вставить одну строку в базу данных, но у меня есть много столбцов, всего 11 (без идентификатора). Я использую следующую команду:

INSERT INTO table1 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11) VALUES (@par1,  @par2,  @par3,  @par4,  @par5,  @par6,  @par7,  @par8,  @par9,  @par10,  @par11)

Но, как вы видите, он слишком длинный, я не могу избежать использования имен столбцов, потому что у меня все еще есть идентификатор. Есть ли более эффективный способ вставить? Или, может быть, способ сделать его короче? Потому что, как я делаю, я также должен добавить параметры один за другим, как это:

myCommand.Parameters.Add(value1, "@par1");
-2
Thadeu Fernandes 21 Окт 2017 в 00:05

3 ответа

Лучший ответ

Редактировать: еще раз спасибо @Sentinel за напоминание мне следить за потенциальными угрозами безопасности. Такой подход не зависит от языка, но я согласен с его предположением, что вы также можете использовать myCommand.Parameters.Add(values[N], "@parN"); вместо построения строки для значений.

Расширение на ответ @Javies Insuasti.

Этот ответ предполагает, что вы используете строку для построения SQL-запроса.

Это распространенный и простой в использовании сценарий. Самый простой способ справиться с этим (imho) - это использовать маркеры в вашей строке, создавать массивы / списки ваших столбцов и значений и заменять маркеры содержимым этих массивов / списков.

using System;

class Program
{

    //defining a blacklist of unwanted terms that should not appear in your column names or value strings
    //This is just for the sake of the example, and there are definitely some statements missing in this array
    static string[] QUERY_BLACKLIST = { "SELECT", "DROP", "INSERT", "DELETE", "UPDATE" };

    static void Main(string[] args)
    {
    //Use markers in your query string
    string query = "INSERT INTO table (:columns:) VALUES (:values:);";
    //define an array of column names to insert for the :columns: marker
    string[] columns = { "ID", "Name", "Age", "Something"};
    //some dummy values. Real code would use a model or something to that effect
    int id = 9;
    string name = "John";
    int age = 12;
    bool something = true;
    //all values should be passed as strings, they will replace the :values: marker
    string[] values = { id.ToString(), name, age.ToString(), something.ToString()};
    query = Program.FillColumnsIntoQuery(query, columns, values);
    Console.WriteLine(query);
    //Output:
    //"INSERT INTO table (ID,Name,Age,Something) VALUES ('9','John','12','true');"

    //example for the blacklist check
    query = "INSERT INTO table (:columns:) VALUES (:values:);";
    //strings with malicious intent behind them
    string[] columns2 =  { "DROP table" };
    string[] values2 = { "DELETE * FROM table" };
    try
    {
        query = Program.FillColumnsIntoQuery(query, columns2, values2);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        //Output:
        //"Someone is trying to do evil stuff!"
    }

    Console.ReadLine();
    }

    public static string FillColumnsAndValuesIntoInsertQuery(string query, string[] colums, string[] values)
    {
    //joining the string arrays with a comma character
    string columnnames = string.Join(",", colums);
    //adding values with single quotation marks around them to handle errors related to string values
    string valuenames = "'" + string.Join("','", values) + "'"; ; 

    //we need to check every entry of the blacklist against the provided strings
    foreach(string blacklist in QUERY_BLACKLIST)
    {
        if(columnnames.ToLower().IndexOf(blacklist.ToLower()) >= 0
        || valuenames.ToLower().IndexOf(blacklist.ToLower()) >=0)
        {
            throw new Exception("Someone is trying to do evil stuff!");
        }
    }

    //replacing the markers with the desired column names and values
    return query.Replace(":columns:",columnnames).Replace(":values:", valuenames);
    }
}

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

Возможности безграничны :-).

0
20 Окт 2017 в 23:27

Поместите все значения в список, используйте цикл For и вставьте одно за другим значение списка в

0
Javier Insuasti 20 Окт 2017 в 21:37

Это действительно не так сильно отличается от заполнения элементов любой структуры данных на любом другом языке. Если вы не заполняете каждый элемент структуры данных, вы должны указать каждый элемент, который вы заполняете, если вы указываете его на основе набора, как в SQL, или как отдельные пары значений атрибутов, как в set object.attribute = value.

Однако, как и с любым другим языком, вы можете написать функцию или процедуру, чтобы скрыть некоторые из этих деталей, так что вам нужно только передать соответствующие переменные. Тогда вам нужно всего лишь один раз написать подробный код для любого сценария.

0
Sentinel 20 Окт 2017 в 21:20