繁体   English   中英

当我的表上没有任何nvarchar时,如何解决“将nvarchar数据类型转换为数值错误”的问题?

[英]How can i solve “error converting data type nvarchar to numeric” when i don't have any nvarchar on my table?

我一直在关于数据类型为numeric错误的nvarchar遇到一些问题。 由于我仍然从SQL和C#入手,我想知道是否有人可以引导我得出一些有效的结论。

SQL代码:

CREATE TABLE [dbo].[CustomerMembership] 
(
    [CM_ID]            VARCHAR(255) NOT NULL,
    [CustomerID]       INT NOT NULL,
    [MembershipID]     INT NOT NULL,
    [DateFrom]         DATETIME NOT NULL,
    [Months]           VARCHAR(2) NOT NULL,
    [DateTo]           DATETIME NOT NULL,
    [ChargesPerMonth]  DECIMAL(18,2) NOT NULL,
    [DiscountPer]      DECIMAL(3,0) NOT NULL,
    [VATPer]           DECIMAL(3,0) NOT NULL,
    [VATAmount]        DECIMAL(3,0) NOT NULL,
    [ServiceTaxPer]    DECIMAL(3,0) NOT NULL,
    [ServiceTaxAmount] DECIMAL(3,0) NOT NULL,
    [TotalCharges]     DECIMAL(18,2) NOT NULL,
    [BillDate]         DATETIME NOT NULL,
    [SubTotal]         DECIMAL(18,2) NOT NULL,
    [GrandTotal]       DECIMAL(18,2) NOT NULL,
    [TotalPaid]        DECIMAL(18,2) NOT NULL,
    [DiscountAmount]   DECIMAL(3,0) NOT NULL,

    CONSTRAINT [PK_CustomerMembership] 
        PRIMARY KEY CLUSTERED ([CM_ID] ASC)
)

C#代码:

cb = @"insert into CustomerMembership
       (CM_ID,BillDate,CustomerID,MembershipID,DateFrom,
        Months,DateTo,ChargesPerMonth,TotalCharges,
        DiscountPer,DiscountAmount,SubTotal,VATPer,VATAmount,
        ServiceTaxPer,ServiceTaxAmount,GrandTotal,TotalPaid) VALUES 
       (@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9,@d10,@d11,
        @d12,@d13,@d14,@d15,@d16,@d17,@d18)";
cc.cmd = new SqlCommand(cb);
cc.cmd.Connection = cc.con;

cc.cmd.Parameters.AddWithValue("@d1",txtMembershipID.Text);
cc.cmd.Parameters.AddWithValue("@d2", dtpBillDate.Value);
cc.cmd.Parameters.AddWithValue("@d3", txtM_ID.Text);
cc.cmd.Parameters.AddWithValue("@d4", txtMembershipTypeID.Text);
cc.cmd.Parameters.AddWithValue("@d5", dtpDateFrom.Value);
cc.cmd.Parameters.AddWithValue("@d6", txtMonths.Text);
cc.cmd.Parameters.AddWithValue("@d7", dtpDateTo.Value);
cc.cmd.Parameters.AddWithValue("@d8", txtChargesPerMonth.Text);
cc.cmd.Parameters.AddWithValue("@d9", txtTotalCharges.Text);
cc.cmd.Parameters.AddWithValue("@d10", txtDiscountPer.Text);
cc.cmd.Parameters.AddWithValue("@d11", txtDiscountAmount.Text);
cc.cmd.Parameters.AddWithValue("@d12", txtSubTotal.Text);
cc.cmd.Parameters.AddWithValue("@d13", txtVATPer.Text);
cc.cmd.Parameters.AddWithValue("@d14", txtVATAmount.Text);
cc.cmd.Parameters.AddWithValue("@d15", txtServiceTaxPer.Text);
cc.cmd.Parameters.AddWithValue("@d16", txtServiceTaxAmount.Text);
cc.cmd.Parameters.AddWithValue("@d17", txtGrandTotal.Text);
cc.cmd.Parameters.AddWithValue("@d18", txtTotalPaid.Text);

cc.cmd.ExecuteReader();
cc.con.Close();

st1 = lblUser.Text;
st2 = "Foi adicionada uma nova mensalidade com o id '" + txtMembershipID.Text + "' ao membro '" + txtMemberName.Text + "'";
cf.LogFunc(st1, System.DateTime.Now, st2);
btnSave.Enabled = false;

MessageBox.Show("Gravado com sucesso", "Registo", MessageBoxButtons.OK, MessageBoxIcon.Information);

评论后:

cc.con = new SqlConnection(cs.DBConn);
cc.con.Open();
string cb = "insert into CustomerMembership
            (CM_ID,BillDate,CustomerID,MembershipID,DateFrom,Months,DateFrom,
             ChargesPerMonth,TotalCharges,DiscountPer,DiscountAmount,
             SubTotal,VATPer,VATAmount,ServiceTaxPer,
             ServiceTaxAmount,GrandTotal,TotalPaid) VALUES  
           (@d1,@d2,@d3,@d4,@d5,@d6,@d7,@d8,@d9,@d10,@d11,@d12,
            @d13,@d14,@d15,@d16,@d17,@d18)";
cc.cmd = new SqlCommand(cb);
cc.cmd.Connection = cc.con;
cc.cmd.Parameters.Add("@d1", SqlDbType.Int, 50).Value = txtMembershipID.Text ;
cc.cmd.Parameters.Add("@d2", SqlDbType.DateTime).Value = dtpBillDate.Value;
cc.cmd.Parameters.Add("@d3", SqlDbType.VarChar, 50).Value = txtM_ID.Text;
cc.cmd.Parameters.Add("@d4", SqlDbType.VarChar, 50).Value = txtMembershipTypeID.Text;
cc.cmd.Parameters.Add("@d5", SqlDbType.DateTime).Value = dtpDateFrom.Value;
cc.cmd.Parameters.Add("@d6", SqlDbType.VarChar, 2).Value = txtMonths.Text;
cc.cmd.Parameters.Add("@d7", SqlDbType.DateTime).Value = dtpDateTo.Value;
cc.cmd.Parameters.Add("@d8", SqlDbType.VarChar, 50).Value = txtChargesPerMonth.Text;
cc.cmd.Parameters.Add("@d9", SqlDbType.VarChar, 50).Value = txtTotalCharges.Text;
cc.cmd.Parameters.Add("@d10", SqlDbType.VarChar, 50).Value = txtDiscountPer.Text;
cc.cmd.Parameters.Add("@d11", SqlDbType.VarChar, 50).Value = txtDiscountAmount.Text;
cc.cmd.Parameters.Add("@d12", SqlDbType.VarChar, 50).Value = txtSubTotal.Text;
cc.cmd.Parameters.Add("@d13", SqlDbType.VarChar, 50).Value = txtVATPer.Text;
cc.cmd.Parameters.Add("@d14", SqlDbType.VarChar, 50).Value = txtVATAmount.Text;
cc.cmd.Parameters.Add("@d15", SqlDbType.VarChar, 50).Value = txtServiceTaxPer.Text;
cc.cmd.Parameters.Add("@d16", SqlDbType.VarChar, 50).Value = txtServiceTaxAmount.Text;
cc.cmd.Parameters.Add("@d17", SqlDbType.VarChar, 50).Value = txtGrandTotal.Text;
cc.cmd.Parameters.Add("@d18", SqlDbType.VarChar, 50).Value = txtTotalPaid.Text;

cc.cmd.ExecuteReader();
cc.con.Close();
st1 = lblUser.Text;
st2 = "Foi adicionada uma nova mensalidade com o id '" + txtMembershipID.Text + "' ao membro '" + txtMemberName.Text + "'";
cf.LogFunc(st1, System.DateTime.Now, st2);
btnSave.Enabled = false;
MessageBox.Show("Gravado com sucesso", "Registo", MessageBoxButtons.OK, MessageBoxIcon.Information);

回答您的更新代码:

你的线

cc.cmd.Parameters.Add("@d1", SqlDbType.Int, 50).Value = txtMembershipID.Text ;

期望传入一个int ,您正在从文本框中传入一个字符串。 在分配值之前,需要将字符串转换为int。

//This can throw a exception if the text is not a valid int.
cc.cmd.Parameters.Add("@d1", SqlDbType.Int).Value = int.Parse(txtMembershipID.Text) ;

对于所有decimaldatetime条目,也需要针对其各自的数据类型执行相同的操作。

您需要传递要更新的列所期望的确切数据类型的参数。 例如,数据表中的CustomerID列的类型为INT。 此字段的参数应为整数

还应考虑所有这些转换都应根据用户输入进行适当检查。 当您期望输入数字时,您不能相信您的用户准确键入数字。

 .... string columns could get directly from the Text property
 .... date columns need a DateTime parameter as well as int columns

 int memberID;
 if(!Int32.TryParse(txtMembershipID.Text, out memberID))
 {
    MessageBox.Show("Invalid number");
    return;
 }
 cc.cmd.Parameters.Add("@d3", SqlDbType.Int).Value = memberID;

另外,为避免与所有这些带有准相同名称的参数占位符混淆,我建议以更易于识别的方式命名参数。 您可以使用带有@前缀的列的相同名称。 因此,当您设置值时,您将对代码有更清晰的了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM