2017-10-14 56 views
0

我有兩列boatRegNumPayerret代碼只插入最後一行。有任何想法嗎?

boatRegNum是字符數據類型和Payerret是錢的數據類型。

我們正在使用一個GridView創建動態行。第一行是默認創建的。

在該第一行,用戶對boatRegNumPayerret進入值。出於演示的目的,在第一排爲boatRegNumB3098和價值Payerret爲同一行530.000

然後用戶點擊「添加新行」按鈕來添加一個額外的行。在新添加的行中,用戶輸入TY000代替boatRegNum90.00作爲第二行。

我們到目前爲止遇到的問題是,當這些值插入到數據庫中,僅第二行的值插入到數據庫中。第一行的值總是被忽略。

任何想法我做錯了什麼?

下面是相關的代碼。在此先感謝您的幫助。

標記:

<%foreach (System.Data.DataRow row in dtAirInfoTable.Rows) 
{%> 
    <tr> 
     <td> 
      <span class="form-control" style="width: 493px; color: #0093B2; font-weight: bold;"> 
      <%=Convert.ToString(row.ItemArray[1].ToString())%></span> 
     </td> 
     <td align="left"> 
      <span class="form-control txtPayerret" style="width: 326px; color: #0093B2; font-weight: bold;"> 
      <%=Convert.ToString(row.ItemArray[2].ToString())%></span> 
     </td> 
    </tr> 
<% } %> 

C#:

// datatable CurrTable 
private DataTable LoadTable1(bool createIfMissing) 
{ 
    const string ViewStateKey = "CurrTable"; 

    DataTable dt = ViewState[ViewStateKey] as DataTable; 

    if (createIfMissing) 
    { 
     if (dt == null) 
     { 
      dt = new DataTable(); 

      dt.Columns.Add(new DataColumn("ID", typeof(string))); 
      dt.Columns.Add(new DataColumn("boatregNum", typeof(string))); 
      dt.Columns.Add(new DataColumn("Payerret", typeof(string))); 

      ViewState[ViewStateKey] = dt; 
     } 

     if (dt.Rows.Count == 0) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["ID"] = 1; 
      dr["boatregNum"] = string.Empty; 
      dr["Payerret"] = string.Empty; 
      dt.Rows.Add(dr); 
     } 
    } 

    return dt; 
} 

private void SetInitialRow() 
{ 
    myMultiView.ActiveViewIndex = 0; 

    DataTable dt = LoadTable1(true); 

    Gridview1.DataSource = dt; 
    Gridview1.DataBind(); 
} 

DataTable regtable = ViewState["CurrTable"] as DataTable;  

foreach (DataRow row in regtable.Rows) 
{ 
    string txBoatRegNum = row.ItemArray[1].ToString(); 
    string txTaxPayerRet = row.ItemArray[2].ToString(); 

    //prevent money data types from breaking. If user does not enter value, then enter 0 in its place 
    //This sub will store Marine and Vessel info to the database. 
    if (txTaxPayerRet != null) 
    { 
     if (string.IsNullOrEmpty(txTaxPayerRet)) 
     { 
      txTaxPayerRet = "0"; 
     } 

     SqlCommand aircmd = new SqlCommand("sp_saveInfo", conn); 
     aircmd.CommandType = CommandType.StoredProcedure; 

     aircmd.Parameters.AddWithValue("@pid", accountnumber.Text); 
     aircmd.Parameters.AddWithValue("@eID", Request["pageId"]); 
     aircmd.Parameters.AddWithValue("@tID", tPayerID); 
     aircmd.Parameters.AddWithValue("@txYr", txtTaxYr.Text); 
     aircmd.Parameters.AddWithValue("@regno", txBoatRegNum); 
     aircmd.Parameters.Add("@txretval", SqlDbType.Money).Value = decimal.Parse(txTaxPayerRet); //convert text back to money 

     aircmd.ExecuteNonQuery(); 
    } 
} 

存儲過程:

ALTER PROCEDURE [dbo].[sp_saveInfo] 
    @pid INT, 
    @eID INT, 
    @txYr INT, 
    @regno VARCHAR(50), 
    @txretval DECIMAL(18, 2), 
    @tID INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRAN 

    IF EXISTS (SELECT * FROM Info WHERE pid = @pid) 
    BEGIN 
     UPDATE Info 
     SET EquipmentTypeID = @eID, 
      TaxYear = @txYr, 
      AirCraftRegNo = @regno, 
      TaxPyrRetdVal = @txretval 
     WHERE pid = @pid 
    END 
    ELSE 
    BEGIN 
     INSERT INTO [dbo].Info (pid, TaxYear, AirCraftRegNo, EquipmentTypeID, TaxPyrRetdVal, TaxpayerID) 
     VALUES (@pid, @txYr, @regno, @eID, @txretval, @tID) 
    END 

    COMMIT TRAN 
END 
+0

您在插入語句中使用標量變量。標量一次只能保存一個值,因此您一次只能插入一行數據。你獲得最後一個值的原因是因爲第一個值被第二個值推出,等等......最後一行沒有任何東西可以消除,所以這就是你得到的。 –

+0

幫我先生,我會如何改變這種情況? 我懷疑你的意思是存儲過程。 – Kenny

+0

我可以向你展示使用直接sql的語法,但是當涉及到XML和JSON時,我毫無用處......實際上,我得到了一個可擴展的XML,它被傳遞到一個proc並解析到一個表中。我沒有寫XML部分...讓我看看我能找到什麼。 –

回答

0

好...發現它...注意,除了傳遞concertin VARCHAR到xml,沒有使用標量變量。開發人員只需將select中的xml直接解析到表中即可。

CREATE PROCEDURE dbo.StoredProcName 
/* 
* mm/ff/yyyy xx, TASK:INC00000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
*/ 
@sXML VARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    BEGIN TRY 
     BEGIN TRANSACTION; 

     -- Change the VARCHAR(MAX) to XML data type. 
     DECLARE @XML XML = @sXML; 

     -- create a new temp table... 
     IF OBJECT_ID('tempdb..#XMLTABLE', 'U') IS NOT NULL 
     DROP TABLE #XMLTABLE; 

     CREATE TABLE #XMLTABLE (
      ItemNumberOne INT NOT NULL, 
      UserID INT NOT NULL, 
      ItemNumber3 INT NOT NULL, 
      Priority SMALLINT NOT NULL, 
      ActionType VARCHAR (3) NOT NULL 
      ); 
     -- insert the shreaded xml into the #temp table 
     INSERT INTO #XMLTABLE (UserPayorForInvoiceReviewID,UserID,PayorID,Priority,ActionType) 
     SELECT 
      ISNULL(NULLIF(ItemList.Item.query('./ItemNumberOne') .value('.','INT'), 0), -1), 
      ISNULL(NULLIF(ItemList.Item.query('./UserID')   .value('.','INT'), 0), -1), 
      ISNULL(NULLIF(ItemList.Item.query('./ItemNumber3')  .value('.','INT'), 0), -1), 
      ISNULL(NULLIF(ItemList.Item.query('./Priority')   .value('.','SMALLINT'), 0), -1), 
      ItemList.Item.query('./ActionType')      .value('.','VARCHAR(3)') ActionType 
     FROM 
      @XML.nodes('/ItemList/Item') AS ItemList(Item); 

     -- There's more to the rest of the procedure below 
     -- but the the xml data is loaded into the temp table. 

希望你能夠填寫剩下的空白。