[英]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) ;
对于所有decimal
和datetime
条目,也需要针对其各自的数据类型执行相同的操作。
您需要传递要更新的列所期望的确切数据类型的参数。 例如,数据表中的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.