Вставка нескольких записей в MySQL с помощью MySqlCommand в одном запросе C # (MySQLConnector) и команда Параметры для экранирования кавычек - PullRequest
3 голосов
/ 18 мая 2011

Я пытаюсь вставить несколько записей в таблицу в одном запросе, используя объект MySqlCommand в C # (используя библиотеку MySQL Connector).

Единственный способ, которым я знаю, как это сделать, - это динамическое построение запроса и установка command.CommandType = CommandType.Text;

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

Моя проблема в том, что я не знаю, как установить параметры для нескольких строк. Как я могу это сделать?

Редактировать : Это коммерческая служба, работающая круглосуточно, поэтому мне нужно найти наиболее эффективный способ сделать это. Я не использую хранимые процедуры - это единственный способ или есть другой?

    public static string MySqlEscape(object value)
    {
        string val = value.ToString();
        if (val.Contains("'"))
            return val.Replace("'", "' + NCHAR(96) + '");
        else
            return val;
    }

    public void InsertProcessedData(long unprocessedID, long pagerID, long firmwareRelativeProtocolID, DataTable processedData)
    {
        using(processedData)
        {
            string paramColNames = string.Empty;
            for(int i =1;i<=processedData.Columns.Count;i+=1)
            {
                paramColNames+=string.Format("Param{0}",i);
                if(i!=processedData.Columns.Count)
                    paramColNames+=",";
            }

            string SQL = "INSERT INTO gprs_data_processed (@UnprocessedID,@PagerID,@FirmwareRelativeProtocolID,"+paramColNames+") VALUES ";

            for (int i = 0; i < processedData.Rows.Count;i+=1)
            {
                SQL += string.Format("({0},{1},{2},", unprocessedID, pagerID, firmwareRelativeProtocolID);
                for (int c = 0; c < processedData.Columns.Count; c += 1)
                {
                    SQL += string.Format("'{0}'", MySqlEscape(processedData.Rows[i][c]));
                    if (i != processedData.Columns.Count)
                        SQL += ",";
                }
                SQL+=")";
                if (i + 1 != processedData.Rows.Count)
                    SQL += ",";
                else
                    SQL += ";";
            }

            using (MySqlConnection connection = new MySqlConnection(_connection))
            {
                connection.Open();
                using (MySqlCommand command = connection.CreateCommand())
                {
                    command.CommandType = CommandType.Text;
                    command.CommandText = SQL;
                    command.ExecuteNonQuery();
                }
                connection.Close();
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Я закончил тем, что использовал только что написанную мной функцию, которая делает все это в одной команде, и использую:

public static string MySqlEscape(object value)
{
    string val = value.ToString();
    if (val.Contains("'"))
        return val.Replace("'", "''");
    else
        return val;
}

Она отлично работает, поэтому я посмотрю, как все пойдет.

1 голос
/ 25 мая 2011

Я не уверен, как создать одну команду. Я создаю метод, который использует параметры, а затем передает значения, которые я хочу запустить по одному.

Мой метод:

public void Insert(string strSQL, string[,] parameterValue)
        {

            //open connection
            if (this.OpenConnection() == true)
            {
                //create command and assign the query and connection from the constructor
                MySqlCommand cmd = new MySqlCommand(strSQL, connection);

                //add parameters
                for (int i = 0; i < (parameterValue.Length / 2); i++)
                {
                    cmd.Parameters.AddWithValue(parameterValue[i, 0], parameterValue[i, 1]);
                }

                //Execute command
                cmd.ExecuteNonQuery();

                //close connection
                this.CloseConnection();
            }
        }
...