C# 在C中保存货币文本框值#

C# 在C中保存货币文本框值#,c#,C#,我下载了一个关于货币文本框的类 当我在“货币”文本框中输入值时,代码工作正常。但当我尝试从存储过程执行insert查询时,会出现以下错误: 将数据类型nvarchar转换为十进制时出错 我不知道错误在哪里 这是类货币文本框的代码 using System; using System.Linq; using System.Windows.Forms; using System.Globalization; namespace SSFASys { public partial class

我下载了一个关于货币文本框的类

当我在“货币”文本框中输入值时,代码工作正常。但当我尝试从存储过程执行insert查询时,会出现以下错误:

将数据类型nvarchar转换为十进制时出错

我不知道错误在哪里

这是类货币文本框的代码

using System;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;

namespace SSFASys
{
    public partial class currencytextbox:TextBox
    {
        readonly CultureInfo _ci = CultureInfo.InstalledUICulture;
        private readonly string _allowedCharacterSet;
        private readonly char _decimalSeparator;

        public currencytextbox()
        {
            var nf = new CultureInfo(_ci.Name, false).NumberFormat;
            _decimalSeparator = nf.CurrencyDecimalSeparator.ToCharArray()[0];
            _allowedCharacterSet = string.Format("0123456789{0}", _decimalSeparator);

            InitializeComponent();
        }
        /// Return Currency Text with No Formatting
        public string TextNoFormatting
        {
            get { return TypedText(); }
        }

        protected override void OnLeave(EventArgs e)
        {
            decimal amount;
            Text = decimal.TryParse(Text, NumberStyles.Currency, null, 
            out amount) ? amount.ToString("N") : 0.ToString("N");
            base.OnLeave(e);
        }

        private string TypedText()
        {
            var sonuc = string.Empty;
            return Text.Trim().Where(ch => _allowedCharacterSet.Contains(ch)).Aggregate
            (sonuc, (current, ch) => current + ch);
        }

        protected override void OnEnter(EventArgs e)
        {     
            Text = TypedText();
            base.OnEnter(e);
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && 
            e.KeyChar != _decimalSeparator && !char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // currencytextbox
            // 
            this.Font = new System.Drawing.Font("Consolas", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.ResumeLayout(false);

        }
    }
}
private void scholarshipinputs()
        {
            if (cmbclass.Text == string.Empty)
            {
                MessageBox.Show("Please fill-in required CLASSIFICATION OF SCHOLARSHIP to proceed.");

            else if (currencytextboxamount.Text == string.Empty)
            {
                MessageBox.Show("Please indicate a specific AMOUNT GRANTED for this SCHOLARSHIP PROGRAM to proceed.");
            }
            else if (cmbclass.Text == string.Empty && cmbtype.Text == string.Empty && cmbcode.Text == string.Empty && cmbdesc.Text == string.Empty && cmbterm.Text == string.Empty && currencytextboxamount.Text == string.Empty)
            {
                MessageBox.Show("Please fill-in all required fields to proceed.");
            }
            else
            {
                sqlcon.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "insertssfapsdetails";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = sqlcon;
                cmd.Parameters.Add(new SqlParameter("@ssfaptype", ssfaptype));
                cmd.Parameters.Add(new SqlParameter("@ssfapsclass", ssfapclass));
                cmd.Parameters.Add(new SqlParameter("@amount", currencytextboxamount.Text));
                cmd.Parameters.Add(new SqlParameter("@ssfapscode", cmbcode.Text));
                cmd.Parameters.Add(new SqlParameter("@ssfapsdesc", cmbdesc.Text));
                cmd.Parameters.Add(new SqlParameter("@term", cmbterm.Text));
                int rowsaffected = cmd.ExecuteNonQuery();
                if (rowsaffected > 0)
                {
                    MessageBox.Show("Scholarship program successfully included for the term.");
                    cmbclass.Refresh();
                    cmbtype.Refresh();
                    cmbcode.Text = "";
                    cmbdesc.Text = "";
                    cmbterm.Text = "";
                    currencytextboxamount.Text = "";
                }
                else 
                {
                    MessageBox.Show("No scholarship program included for the term. Please contact your system administrator to fix the problem.");
                }
                sqlcon.Close();
            }
        }
这是我用来插入货币文本框值的存储过程

using System;
using System.Linq;
using System.Windows.Forms;
using System.Globalization;

namespace SSFASys
{
    public partial class currencytextbox:TextBox
    {
        readonly CultureInfo _ci = CultureInfo.InstalledUICulture;
        private readonly string _allowedCharacterSet;
        private readonly char _decimalSeparator;

        public currencytextbox()
        {
            var nf = new CultureInfo(_ci.Name, false).NumberFormat;
            _decimalSeparator = nf.CurrencyDecimalSeparator.ToCharArray()[0];
            _allowedCharacterSet = string.Format("0123456789{0}", _decimalSeparator);

            InitializeComponent();
        }
        /// Return Currency Text with No Formatting
        public string TextNoFormatting
        {
            get { return TypedText(); }
        }

        protected override void OnLeave(EventArgs e)
        {
            decimal amount;
            Text = decimal.TryParse(Text, NumberStyles.Currency, null, 
            out amount) ? amount.ToString("N") : 0.ToString("N");
            base.OnLeave(e);
        }

        private string TypedText()
        {
            var sonuc = string.Empty;
            return Text.Trim().Where(ch => _allowedCharacterSet.Contains(ch)).Aggregate
            (sonuc, (current, ch) => current + ch);
        }

        protected override void OnEnter(EventArgs e)
        {     
            Text = TypedText();
            base.OnEnter(e);
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && 
            e.KeyChar != _decimalSeparator && !char.IsControl(e.KeyChar))
            {
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // currencytextbox
            // 
            this.Font = new System.Drawing.Font("Consolas", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.ResumeLayout(false);

        }
    }
}
private void scholarshipinputs()
        {
            if (cmbclass.Text == string.Empty)
            {
                MessageBox.Show("Please fill-in required CLASSIFICATION OF SCHOLARSHIP to proceed.");

            else if (currencytextboxamount.Text == string.Empty)
            {
                MessageBox.Show("Please indicate a specific AMOUNT GRANTED for this SCHOLARSHIP PROGRAM to proceed.");
            }
            else if (cmbclass.Text == string.Empty && cmbtype.Text == string.Empty && cmbcode.Text == string.Empty && cmbdesc.Text == string.Empty && cmbterm.Text == string.Empty && currencytextboxamount.Text == string.Empty)
            {
                MessageBox.Show("Please fill-in all required fields to proceed.");
            }
            else
            {
                sqlcon.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.CommandText = "insertssfapsdetails";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = sqlcon;
                cmd.Parameters.Add(new SqlParameter("@ssfaptype", ssfaptype));
                cmd.Parameters.Add(new SqlParameter("@ssfapsclass", ssfapclass));
                cmd.Parameters.Add(new SqlParameter("@amount", currencytextboxamount.Text));
                cmd.Parameters.Add(new SqlParameter("@ssfapscode", cmbcode.Text));
                cmd.Parameters.Add(new SqlParameter("@ssfapsdesc", cmbdesc.Text));
                cmd.Parameters.Add(new SqlParameter("@term", cmbterm.Text));
                int rowsaffected = cmd.ExecuteNonQuery();
                if (rowsaffected > 0)
                {
                    MessageBox.Show("Scholarship program successfully included for the term.");
                    cmbclass.Refresh();
                    cmbtype.Refresh();
                    cmbcode.Text = "";
                    cmbdesc.Text = "";
                    cmbterm.Text = "";
                    currencytextboxamount.Text = "";
                }
                else 
                {
                    MessageBox.Show("No scholarship program included for the term. Please contact your system administrator to fix the problem.");
                }
                sqlcon.Close();
            }
        }

您的错误应该在这里:

 cmd.Parameters.Add(new SqlParameter("@ssfapsclass", ssfapclass));
            cmd.Parameters.Add(new SqlParameter("@amount", currencytextboxamount.Text));
            cmd.Parameters.Add(new SqlParameter("@ssfapscode", cmbcode.Text));
            cmd.Parameters.Add(new SqlParameter("@ssfapsdesc", cmbdesc.Text));
            cmd.Parameters.Add(new SqlParameter("@term", cmbterm.Text));
您试图将文本写入数据库中的十进制字段,但不确定它是哪个参数(可能是数量),但需要先将其转换为十进制

与问题无直接关系: 你应该使用

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

}

这样,即使程序抛出您当前未处理的异常,您的连接也将关闭

您的数据库将存储类似文本字符串的nvarchar。当你从数据库中得到它时,你会得到一个像“50.30”或“50,30”这样的字符串,但这不是小数点。您需要转换它您的数据库模式是什么?金额是十进制还是nvarchar?请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。当我们在“我的货币”文本框中键入数字时,“我的货币”文本框的格式为数字或会计格式,如“6000.00”。是否可以将“6000.00”转换为数字?如果可能的话,你能给出一个想法/或示例代码(如果有的话)吗。