Параметры команды C # SQL, перенос значений из формы в объект в метод

Я совершенно новичок в параметрах команды SQL (вчера я кратко объяснил эту концепцию, и, возможно, не понял ее) и в целом в ООП, но мне это нравится: D

Вот ссылка на мой вчерашний вопрос;) Ребята действительно помогло, но теперь я изо всех сил пытаюсь реализовать это в своем приложении

Я собственно построил в качестве примера:

  • Форма "formConnection.cs", содержащая 2 пользовательских ввода "comboBoxEmployeeId" (выбранное значение - целое число) + "txtDuration" (значение является десятичным), при нажатии на "btnInsert" я обрабатываю это: `

    sqlDbOperations sqlDbOp = new sqlDbOperations();`
    
    public void btnInsert_Click(object sender, EventArgs e)
    {
        //Create new contract
        var contract = new contract{
            employeeId = Convert.ToInt32(this.comboBoxEmployeeName.SelectedValue),
            duration = Convert.ToDecimal(this.txtDuration.Text)
        };
    
        //Insert command to Db
        sqlDbOp.insertContract();
    
        MessageBox.Show("Done");
    }
    
  • Класс "contract.cs"

    class contract { public int employeeId { get; set; } public decimal duration { get; set; } }

  • Класс "sqlDbOperations.cs"

    public class sqlDbOperations {// Строка подключения // SqlConnection myConnection = new SqlConnection ("ATLELAG786576 \ SQLEXPRESS; Initial Catalog = TEST; Integrated Security = False; Connect Timeout = 30; User Instance = False; User ID = basicuser; Password = basicpw" ); SqlConnection myConnection = new SqlConnection (ConfigurationManager.ConnectionStrings ["EngAdminSqlDbConnectionString"]. ConnectionString);

        //Connection open
        //SqlConnection.Open() is a void function and does not return an error but throws an exception so remember to put it in a try/catch brace
        //Rather than having the program explode in front of the user
        public void openConnection()
        {
            //Connection open
            try
            {
                myConnection.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                MessageBox.Show(e.ToString());
            }
        }
    
        //Connection close
        //Try/catch because like SqlConnection.Open() it does not return errors but throws an exception instead
        public void closeConnection()
        {
            try
            {
                myConnection.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    
        contract contract = new contract();
    
        public void insertContract()
        {
            //Open
            openConnection();
    
            //Command
            SqlCommand myCommand = new SqlCommand("INSERT INTO tblContracts (EmployeeId, Duration) VALUES (@employeeId, @contractDuration)", myConnection);
    
            //Get values from form
            formConnection formInput = new formConnection();
    
            //Add parameters
            myCommand.Parameters.AddWithValue("@employeeId", contract.employeeId);
            myCommand.Parameters.AddWithValue("@contractDuration", contract.duration);
    
    
            //Execute
            myCommand.ExecuteNonQuery();
    
            //Close
            closeConnection();
    
    
    
    
        }
    }
    

Это работает без работы - когда я помещаю «десятичное» значение, например 2.7, в текстовое поле txtDuration, я все равно получаю сообщение:

System.FormatException: неверный формат входящей цепи. = «Формат входной строки неправильный» à System.Number.StringToNumber (строка str, параметры NumberStyles, NumberBuffer & number, информация NumberFormatInfo, логический parseDecimal) à System.Number.ParseDecimal (значение String, NumberStyles options, NumberFormatInfo numfmt) à System.Convert.ToDecimal (строковое значение) à SQLStatementParameters.formConnection.btnInsert_Click (отправитель объекта, EventArgs e) в D: \ C # \ Projects \ SQLStatementParameters \ SQLStatementParameters \ formConnectionParameters \ formConnection 26 .Forms.Control.OnClick (EventArgs e) ".....

  • В БД ничего не хранится (как будто значения не переносятся из формы в объект «контракт», а затем в метод, выполняющий INSERT), у меня есть новая запись, но она пуста.

Что я делаю неправильно? Спасибо за помощь!

Брайс


person Panda    schedule 06.12.2012    source источник


Ответы (2)


На самом деле значения не переносятся в вашу команду sql. Экземпляр контракта класса, который вы создаете в классе sqlDbOperations, отличается от того, который вы создаете в btnInsert_Click. И вам нужно перенести созданный в btnInsert_Click в sqlDbOp.insertContract(); для вставки в БД.

Итак, вы можете сделать что-то вроде этого:

public void insertContract(contract con)
{
    //Open
    openConnection();

    //Command
    SqlCommand myCommand = new SqlCommand("INSERT INTO tblContracts (EmployeeId,   Duration) VALUES (@employeeId, @contractDuration)", myConnection);

    //Get values from form
    formConnection formInput = new formConnection();

    //Add parameters
    myCommand.Parameters.AddWithValue("@employeeId", con.employeeId);
    myCommand.Parameters.AddWithValue("@contractDuration", con.duration);


    //Execute
    myCommand.ExecuteNonQuery();

    //Close
    closeConnection();
}

И за исключением «Формат входной строки неправильный». Возможно, вы можете обратиться к этой ссылке

person Colin    schedule 06.12.2012
comment
Спасибо, Колин, все было ясно и моя проблема решена;) - person Panda; 06.12.2012

Каков тип данных Duration в вашей базе данных, убедитесь, что он должен быть numeric(19,6) или должен быть тип данных, принимающий десятичные значения

person Rohit Vyas    schedule 06.12.2012