ошибка обновления представления сетки

это основа для моего обновления в представлении сетки. когда я выполняю его, команда редактирования работает правильно, но когда я нажимаю «Обновить», эта ошибка появляется рядом с моим cmd.ExecuteNonQuery(); «Не удалось преобразовать значение параметра из строки в десятичное число». Пожалуйста, помогите мне здесь. Если у меня есть другой способ добавить данные в базу данных, пожалуйста, скажите мне заранее спасибо. :)

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string v =   System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString;
    con = new OracleConnection(v);
    con.Open();


    string query = "update leave_module1 set name=:name,desig=:desig,srno=:srno,tol=:tol,compdates=:compdates,fd=:fd,td=:td,noofdays=:nod,remarks=:remarks";
    OracleCommand cmd = new OracleCommand(query, con);
        cmd.Parameters.Add(":name", OracleType.VarChar, 50).Value = GridView1.Rows[e.RowIndex].Cells[0].Text;
        cmd.Parameters.Add(":desig", OracleType.VarChar, 30).Value = GridView1.Rows[e.RowIndex].Cells[1].Text;
        cmd.Parameters.Add(":srno", OracleType.Number, 8).Value = GridView1.Rows[e.RowIndex].Cells[2].Text;
        cmd.Parameters.Add(":tol", OracleType.VarChar, 10).Value = GridView1.Rows[e.RowIndex].Cells[3].Text;
        cmd.Parameters.Add(":compdates", OracleType.VarChar, 30).Value = GridView1.Rows[e.RowIndex].Cells[4].Text;
        cmd.Parameters.Add(":fd", OracleType.DateTime).Value = GridView1.Rows[e.RowIndex].Cells[5].Text;
        cmd.Parameters.Add(":td", OracleType.DateTime).Value = GridView1.Rows[e.RowIndex].Cells[6].Text;
        cmd.Parameters.Add(":nod", OracleType.Number, 3).Value = GridView1.Rows[e.RowIndex].Cells[7].Text;
        cmd.Parameters.Add(":remarks", OracleType.VarChar, 50).Value = GridView1.Rows[e.RowIndex].Cells[8].Text;

        cmd.ExecuteNonQuery();
        ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('The Data has been added');window.location='Default2.aspx';</script>;");


        cmd.Dispose();
        con.Close();    
}

person Huga    schedule 13.06.2012    source источник


Ответы (2)


  • Не ставьте перед именованным параметром двоеточие (:). Поставщик данных .NET Framework для Oracle автоматически предоставляет двоеточие.
  • Преобразование параметров в соответствующий тип перед назначением параметру

    cmd.Parameters.Add("name", OracleType.VarChar, 50).Value = GridView1.Rows[e.RowIndex].Cells[0].Text; // this is ok 
    cmd.Parameters.Add("fd", OracleType.DateTime).Value = Convert.ToDateTime(GridView1.Rows[e.RowIndex].Cells[5].Text);
    cmd.Parameters.Add("nod", OracleType.Number, 3).Value = Convert.ToDecimal(GridView1.Rows[e.RowIndex].Cells[7].Text);
    
  • Используйте Using block

    вот пример кода

    using (var connection = new OracleConnection(connectionString))
    {
        connection.Open();
        using (var command = new OracleCommand(queryString, connection))
        {
           // add parameters here 
           command.ExecuteNonQuery();
        }
    
     }
    
person Damith    schedule 13.06.2012
comment
: теперь появляется эта ошибка. Строка не была распознана как допустимая дата и время. - person Huga; 13.06.2012
comment
какое значение вы получаете как поле даты, если вы знаете формат, вы можете преобразовать его в дату и время, используя DateTime.ParseExact(dateTo, "mm/dd/yyyy", CultureInfo.InvariantCulture); - person Damith; 13.06.2012

Преобразовать строку в десятичную:

    cmd.Parameters.Add(":srno", OracleType.Number, 8).Value = Convert.ToDecimal(GridView1.Rows[e.RowIndex].Cells[2].Text);
    cmd.Parameters.Add(":nod", OracleType.Number, 3).Value = Convert.ToDecimal(GridView1.Rows[e.RowIndex].Cells[7].Text);

Преобразование строки в дату и время:

    cmd.Parameters.Add(":fd", OracleType.DateTime).Value = DateTime.Parse(GridView1.Rows[e.RowIndex].Cells[5].Text);
    cmd.Parameters.Add(":td", OracleType.DateTime).Value = DateTime.Parse(GridView1.Rows[e.RowIndex].Cells[6].Text);

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

person Coder    schedule 13.06.2012
comment
Хм, позже и для DateTime тоже :) - person V4Vendetta; 13.06.2012
comment
@V4Vendetta: теперь отображается неверный формат входной строки в строке cmd.Parameters.Add(:srno, OracleType.Number, 8).Value = Convert.ToDecimal(GridView1.Rows[e.RowIndex].Cells[2 ].Текст); - person Huga; 13.06.2012
comment
@Huga, какой текст вы получаете из GridView1.Rows[e.RowIndex].Cells[2].Text ? - person Coder; 13.06.2012