【问题标题】:Saving currency textbox values in C#在 C# 中保存货币文本框值
【发布时间】:2018-04-17 18:12:38
【问题描述】:

我下载了这个用于货币文本框的课程。

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

将数据类型 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();
            }
        }

【问题讨论】:

  • 您的数据库存储 nvarchar,它是类似字符串的文本。当你从数据库中得到它时,你会得到一个像“50.30”或“50,30”这样的字符串,但那是文本而不是小数。你需要转换它
  • 您的数据库架构是什么?金额是小数还是 nvarchar?
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
  • 我的货币文本框被格式化为数字或会计格式,例如“6,000.00”,因为当我们在其中键入数字时它会显示在货币文本框中。是否可以将“6,000.00”转换为数字?如果可能的话,你能否给出一个想法/或示例代码,如果有的话。

标签: c#


【解决方案1】:

你的错误应该在这里:

 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();

}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2015-12-17
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多