簡體   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