Isert новая строка в sql не принимает текст - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу вставить новую строку в моей базе данных из пользовательского ввода, я использую C # и синтаксис SQL вставки. Моя проблема в том, что когда я запускаю программу, все поля заполнены полностью, кроме текстового значения (название продукта), которое заполняется другим числом (ценой), я проверяю синтаксис и код, но это никогда не работает.

         public DataBaseManager (string DataBaseFilename)
{
    strFileName = DataBaseFilename;
    strFileNamenopath = System.IO.Path.GetFileName(strFileName);
    strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.IO.Path.GetFullPath(strFileName).Replace(System.IO.Path.GetFileName(strFileName), "") + "; Extended Properties=dBase III;Mode=ReadWrite";

    conn = new OleDbConnection(strAccessConn);

    conn.Open();
}

public void AddData(string Column, string value)
{
    try
    {
        int i = 0; 
        char[] delimiterChars = { ','};


        queryCutting = @"INSERT INTO [" + strFileNamenopath  + "] ( " + Column +  " ) VALUES ( " + value + " )";

        OleDbCommand cmd = new OleDbCommand(queryCutting, conn);
        string[] _valseperated = value.Split(delimiterChars);
        string[] _columnsbase = Column.Split(delimiterChars);


        foreach (string str in _columnsbase )
        {              
            cmd.Parameters.AddWithValue(str,SqlDbType.VarChar).Value =  _valseperated[i];
            i++;

        }
        cmd.ExecuteNonQuery();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);        
    }

private void AddnewCode_Buttion_Click(object sender, RoutedEventArgs e)
        {
            _productBase.AddData("code, pv1, achat, designat", "123456789" +  ", " + Textbox_Achat.Text + ", " + Textbox_Achat.Text +", " + Produitsnom_TextBox.Text);

        }

Значение столбца представляет имя столбца в базе данных, значение - значение текстового поля.

Column = "code, pv1, achat, designat";
Value = "123456789, 10, 10, Productname";

значение queryCutting

queryCutting = "INSERT INTO [produits.dbf] ( code, pv1, achat, designat ) VALUES ( 123456789, 540, 120, NewProduct)"

enter image description here

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Я решил проблему, добавив вставку Produitsnom_TextBox.Text betweb вот так

_productBase.AddData("code, designat ,pv1, achat", "123456789" + ", " + "' " +Produitsnom_TextBox.Text + "'"  + ", " + Vente_TextBox.Text + ", " + Textbox_Achat.Text );

Также я удалил часть параметров.

public void AddData(string Column, string value)
    {
        try
        {
            int i = -1;
            char[] delimiterChars = { ',' };


            queryCutting = @"INSERT INTO [" + strFileNamenopath + "] ( " + Column + " ) VALUES ( " + value + " )";

            OleDbCommand cmd = new OleDbCommand(queryCutting, conn);


            MessageBox.Show(queryCutting);
            cmd.ExecuteNonQuery();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);        
        }


    }
0 голосов
/ 18 апреля 2019

Я думаю, что понял вашу проблему.Вы устанавливаете строку Значение непосредственно в тексте запроса, поэтому вы должны получить этот результат

   "INSERT INTO [theFolderName] (code, pv1, achat, designat) 
    VALUES ( 123456789, 10, 10, Productname )";

Первые три значения принимаются как правильные значения для числовых полей, и в параметрах не принимаетсяРассмотрим эти поля, но когда синтаксический анализатор достигает значения ProductName , он не может использоваться в качестве значения, поскольку он не является внутренним кавычками.Таким образом, он думает, что это параметр и ищет коллекцию параметров.Поскольку в OleDb параметры являются позиционными, он принимает первый параметр и передает его значение в OleDbCommand.И первым параметром является код.

Это должно решить проблему.Не указывайте имя параметра (OleDb это не волнует), и пусть OleDbCommand использует полный набор параметров, заданных в ожидаемом точном порядке

public void AddData(string Column, string value)
{
    try
    {
        char[] delimiterChars = { ','};

        // Query text is incomplete, we complete it inside the loop
        queryCutting = @"INSERT INTO [" + strFileNamenopath  + @"] 
                         ( " + Column +  " ) VALUES ( ";

        // The query and the connection will be set after the loop
        OleDbCommand cmd = new OleDbCommand();
        string[] _valseperated = value.Split(delimiterChars);
        string[] _columnsbase = Column.Split(delimiterChars);

        foreach (string str in _columnsbase )
        {              
            // The second parameter in AddWithValue is the Value not the type.
            cmd.Parameters.AddWithValue(str, _valseperated[i]);

            // Add a placeholder for each parameter
            queryCutting += "?,";
        }

        // Remove the ending colon an close the paren on the query text
        queryCutting = queryCutting.Substring(queryCutting.Length-1) + ")";
        cmd.CommandText = queryCutting;
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);        
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...