[英]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.