Asp.net 获取错误:未能在cmnd.ExecuteOnQuery()上将参数值从字符串转换为十进制;

Asp.net 获取错误:未能在cmnd.ExecuteOnQuery()上将参数值从字符串转换为十进制;,asp.net,Asp.net,我通过同一个按钮插入和更新记录。但我希望主键(req_no)仅在插入操作期间自动生成,而不是在更新时自动生成。怎么做? 获取错误:未能在cmnd.ExecuteOnQuery()上将参数值从字符串转换为十进制; 代码如下: public partial class Service_master : System.Web.UI.Page { OleDbConnection con = new OleDbConnection(ConfigurationManager.

我通过同一个按钮插入和更新记录。但我希望主键(req_no)仅在插入操作期间自动生成,而不是在更新时自动生成。怎么做? 获取错误:未能在cmnd.ExecuteOnQuery()上将参数值从字符串转换为十进制; 代码如下:

    public partial class Service_master : System.Web.UI.Page
       {

    OleDbConnection con = new OleDbConnection(ConfigurationManager.ConnectionStrings["constring"].ToString());
    protected void Page_Load(object sender, EventArgs e)
    {


        Session["UserName"] = "laxmi";
        this.TextBox9.Text = DateTime.Today.ToString("dd/MMM/yyyy");
        lb1.Text = Session["UserName"].ToString();
          if (!IsPostBack)
        {
            BindDropDownList();
            BindDropDowns();
            Bindservcd();


        }
    }


       private void Autogenrate()
        {
           int r;

            try
            {
            con.Open();
            TextBox TextBox1 = (TextBox)FindControl("TextBox1");
            string sqlcmd = "Select max(req_no)as req_no from service_master";
            OleDbCommand cmd = new OleDbCommand(sqlcmd, con);
            OleDbDataReader dr = cmd.ExecuteReader();
           if (dr.Read())
        {

            string d = dr[0].ToString();
            if (d == "")
            {
            TextBox1.Text = "1" ;
            }
                else
            {

                r = Convert.ToInt32(dr[0]);
                r = r + 1;
                TextBox1.Text = r.ToString();
            }
        }
                con.Close();

            }
                   catch (Exception ex)
                        {
                       WebMsgBox.Show("null is not allowed");
                            }

        }
 public bool uniquereq_no(string req_no)
{
        string strreqno;
        string querye = "select count(req_no) as req_no from service_master where req_no='"+ this.TextBox1.Text.ToString()+"'" ;
        OleDbCommand cmnd = new OleDbCommand(querye, con);
        OleDbDataReader dr;
        dr = cmnd.ExecuteReader();
        while (dr.Read())
        {
            try
            {
                strreqno = dr["req_no"].ToString();
                return (strreqno != "0");
                if (strreqno != "0")
                {
                    WebMsgBox.Show("already exists");
                    //errlblemail.Text = "email already exist";
                    return false;
                }

            }
            catch (Exception e)
            {
                string message = "error";
                message += e.Message;
            }
            finally
            {
                dr.Close();
            }
        }

        return true;


    }
  protected void Button1_Click(object sender, EventArgs e)
    {
        string UserName = "UserName";
        Session["UserName"] = lb1.Text;

        TextBox TextBox1 = (TextBox)FindControl("TextBox1");
        TextBox TextBox9 = (TextBox)FindControl("TextBox9");
        TextBox TextBox2 = (TextBox)FindControl("TextBox2");
        TextBox TextBox3 = (TextBox)FindControl("TextBox3");
        TextBox TextBox4 = (TextBox)FindControl("TextBox4");
        DropDownList DropDownList3 = (DropDownList)FindControl("DropDownList3");
        DropDownList DropDownList1 = (DropDownList)FindControl("DropDownList1");
        TextBox TextBox5 = (TextBox)FindControl("TextBox5");
        TextBox TextBox6 = (TextBox)FindControl("TextBox6");
        DropDownList DropDownList2 = (DropDownList)FindControl("DropDownList2");
        TextBox TextBox7 = (TextBox)FindControl("TextBox7");
        TextBox TextBox8 = (TextBox)FindControl("TextBox8");


        {
            con.Open();
            OleDbCommand cmnd = con.CreateCommand();
            cmnd.CommandType = CommandType.StoredProcedure;
            if (uniquereq_no(TextBox1.Text)== true)
            {
                cmnd.CommandText = "upd_ser_mas";
                cmnd.Parameters.Add("xreq_no", OleDbType.Numeric, 8).Value = 
                  Convert.ToString(this.TextBox1.Text);
                cmnd.Parameters.Add("xreq_dt", OleDbType.Date).Value = 
           Convert.ToDateTime(TextBox9.Text);
                cmnd.Parameters.Add("xreq_by", OleDbType.VarChar, 7).Value = Convert.ToString(Session["UserName"]);
                cmnd.Parameters.Add("xser_cd", OleDbType.VarChar, 16).Value = Convert.ToString(TextBox3.Text);
                cmnd.Parameters.Add("xserv_desc", OleDbType.VarChar, 40).Value = Convert.ToString(TextBox4.Text);
                cmnd.Parameters.Add("xserv_grp_cd", OleDbType.VarChar, 3).Value = Convert.ToString(DropDownList3.SelectedItem.Value);
                cmnd.Parameters.Add("xbase_uom_cd", OleDbType.VarChar, 3).Value = Convert.ToString(DropDownList1.SelectedItem.Value);
                cmnd.Parameters.Add("xsac_cd", OleDbType.VarChar, 16).Value = Convert.ToString(TextBox5.Text);
                cmnd.Parameters.Add("xser_long_desc", OleDbType.VarChar, 100).Value = Convert.ToString(TextBox6.Text);
                cmnd.Parameters.Add("xtax_ind", OleDbType.Char, 1).Value = Convert.ToString(DropDownList2.SelectedItem.Value);
                cmnd.Parameters.Add("xactive_ind", OleDbType.Char, 1).Value = Convert.ToString(TextBox7.Text);
                cmnd.Parameters.Add("xdel_ind", OleDbType.Char, 1).Value = Convert.ToString(TextBox8.Text);
                WebMsgBox.Show("Data Successfully Updated");
            }
            else
            {
                Autogenrate();
                cmnd.CommandText = "ins_ser_mas";
                cmnd.Parameters.Add("xreq_no", OleDbType.Numeric, 8).Value = Convert.ToString(this.TextBox1.Text);
                cmnd.Parameters.Add("xreq_dt", OleDbType.Date).Value = Convert.ToDateTime(TextBox9.Text);
                cmnd.Parameters.Add("xreq_by", OleDbType.VarChar, 7).Value = Convert.ToString(Session["UserName"]);
                cmnd.Parameters.Add("xser_cd", OleDbType.VarChar, 16).Value = Convert.ToString(TextBox3.Text);
                cmnd.Parameters.Add("xserv_desc", OleDbType.VarChar, 40).Value = Convert.ToString(TextBox4.Text);
                cmnd.Parameters.Add("xserv_grp_cd", OleDbType.VarChar, 3).Value = Convert.ToString(DropDownList3.SelectedItem.Value);
                cmnd.Parameters.Add("xbase_uom_cd", OleDbType.VarChar, 3).Value = Convert.ToString(DropDownList1.SelectedItem.Value);
                cmnd.Parameters.Add("xsac_cd", OleDbType.VarChar, 16).Value = Convert.ToString(TextBox5.Text);
                cmnd.Parameters.Add("xser_long_desc", OleDbType.VarChar, 100).Value = Convert.ToString(TextBox6.Text);
                cmnd.Parameters.Add("xtax_ind", OleDbType.Char, 1).Value = Convert.ToString(DropDownList2.SelectedItem.Value);
                cmnd.Parameters.Add("xactive_ind", OleDbType.Char, 1).Value = Convert.ToString(TextBox7.Text);
                cmnd.Parameters.Add("xdel_ind", OleDbType.Char, 1).Value = Convert.ToString(TextBox8.Text);
                WebMsgBox.Show("The data for request number" + TextBox1.Text + "is saved");
            }
            cmnd.ExecuteNonQuery();
            con.Close();
        }

        }

OleDbType.Numeric
具有与中给出的
System.Decimal
等效的数据类型。由于
TextBox1.Text
返回字符串值,因此需要将十进制转换与
decimal.Parse
Convert.ToDecimal
一起用于此行:

cmnd.Parameters.Add("xreq_no", OleDbType.Numeric, 8).Value = decimal.Parse(this.TextBox1.Text);
或者您可以使用更安全的
decimal.TryParse
方法:

decimal xreqNo;

bool isDecimalValue = decimal.TryParse(this.TextBox1.Text, out xreqNo);
if (isDecimalValue)
{
    cmnd.Parameters.Add("xreq_no", OleDbType.Numeric, 8).Value = xreqNo; 
}

代码中很少有东西可以被更正

1) 无需使用
ExecuteReader
。改用
ExecuteScalar
。因为它只返回一个值。(在下文第2点之后提到的
SQL
中)

2) 更改了
sql
query以执行代码的+1部分。(如果数据库支持ISNull)。否则,数据库中可能会有类似的内容

//SQL query will find max and will do +1
var sqlcmd = "Select IsNull(max(req_no),0) + 1 as req_no from service_master";
var cmd = new OleDbCommand(sqlcmd, con);
var outval  = cmd.ExecuteScalar();
       //now outval will have value
TextBox1.Text = outval.ToString();
3) 您正在为参数指定
string
值,但指定的类型不同

cmnd.Parameters.Add("xreq_no", OleDbType.Numeric, 8).Value = Convert.ToString(this.TextBox1.Text);
TextBox1.Text本身就是
string
,您不必使用
Convert.ToString
。或者使用正确的转换,如
Convert.ToInt32
等,因为您的参数是
OledbType.Numeric

还有,为什么必须使用
FindControl
?删除
FindControl

TextBox TextBox1 = (TextBox)FindControl("TextBox1");

TextBox1
可以直接引用

哪一行抛出错误?使用
decimal.Parse
来缓解此问题。您好,欢迎使用SO。感谢您发布代码,但其中包含许多与您的问题完全无关的内容。您需要将其最小化,以便我们能够提供更好更快的答案。请参阅。请更正代码的格式