2011-10-11 91 views
1

我有一個C#應用程序中的幾個表我目前正在工作,併爲表的4/5的一切保存完全沒有問題。對於第五張表,一切似乎都很好,直到我再次重新加載程序(無需修改代碼或使用單獨安裝,以使數據不會消失)4/5表格沒問題,但第5個表格沒有任何記錄在它重新啓動之後(但它在最後一次運行時)。以下是一些代碼摘錄。我已經在線嘗試了一些不同的解決方案,包括創建一個字符串以手動運行數據庫上的sql命令並直接創建行,而不是使用通用數據行的下面的實現。C#Sql數據不保存

//From main window 
     private void newInvoice_Click(object sender, EventArgs e) 
     { 
      PosDatabaseDataSet.InvoicesRow newInvoice = posDatabaseDataSet1.Invoices.NewInvoicesRow(); 
      Invoices iForm = new Invoices(newInvoice, posDatabaseDataSet1, true); 
     } 

//Invoices Table save [Works] (from Invoices.cs) 
private void saveInvoice_Click(object sender, EventArgs e) 
     { 
      iRecord.Date = Convert.ToDateTime(this.dateField.Text); 
      iRecord.InvoiceNo = Convert.ToInt32(this.invoiceNumField.Text); 
      iRecord.Subtotal = (float) Convert.ToDouble(this.subtotalField.Text); 
      iRecord.Tax1 = (float)Convert.ToDouble(this.hstField.Text); 
      iRecord.Total = (float)Convert.ToDouble(this.totalField.Text); 
      iRecord.BillTo = this.billToField.Text; 
      invoicesBindingSource.EndEdit(); 
      if (newRecord) 
      { 
       dSet.Invoices.Rows.Add(iRecord); 
       invoicesTableAdapter.Adapter.Update(dSet.Invoices); 
      } 
      else 
      { 
       string connString = Properties.Settings.Default.PosDatabaseConnectionString; 
       string queryString = "UPDATE dbo.Invoices set "; 
       queryString += "Date='" + iRecord.Date+"'"; 
       queryString += ", Subtotal=" + iRecord.Subtotal; 
       queryString += ", Tax1=" + iRecord.Tax1.ToString("N2"); 
       queryString += ", Total=" + iRecord.Total; 
       queryString += " WHERE InvoiceNo=" + iRecord.InvoiceNo; 
       using (SqlConnection dbConn = new SqlConnection(connString)) 
       { 
        SqlCommand command = new SqlCommand(queryString, dbConn); 
        dbConn.Open(); 
        SqlDataReader r = command.ExecuteReader(); 
        dbConn.Close(); 
       } 
      } 
      dSet.Invoices.AcceptChanges(); 
     } 

//Invoice Items save [works until restart] (also from Invoices.cs) 
    private void addLine_Click(object sender, EventArgs e) 
     { 
       DataRow iRow = dSet.Tables["InvoiceItems"].NewRow(); 
       iRow["Cost"] = (float)Convert.ToDouble(this.costField.Text); 
       iRow["Description"] = this.descriptionField.Text; 
       iRow["InvoiceNo"] = Convert.ToInt32(this.invoiceNumField.Text); 
       iRow["JobId"] = Convert.ToInt32(this.jobIdField.Text); 
       iRow["Qty"] = Convert.ToInt32(this.quantityField.Text); 
       iRow["SalesPerson"] = Convert.ToInt32(this.salesPersonField.Text); 
       iRow["SKU"] = Convert.ToInt32(this.skuField.Text); 

       dSet.Tables["InvoiceItems"].Rows.Add(iRow); 
       invoiceItemsTableAdapter.Adapter.Update(dSet,"InvoiceItems"); 
       PosDatabaseDataSet.InvoiceItemsDataTable dTable = (PosDatabaseDataSet.InvoiceItemsDataTable)dSet.InvoiceItems.Copy(); 
       DataRow[] d = dTable.Select("InvoiceNo=" + invNo.ToString()); 
       invoiceItemsView.DataSource = d; 

     } 

在此先感謝您的任何見解。

更新:2011年10月17日。我仍然無法得到這個工作是否有更多的想法嗎?

+0

我還沒有投票結束。問題在於你的SQL寫入和/或數據適配器和數據集代碼。你能否從你的代碼中移除任何不是SQL,數據集或綁定源代碼的東西,我們可以嘗試提供幫助。 – Spence

+0

我更新了上面的代碼 – Brandon

+0

假設你的InvoiceItemsTableAdapter沒有被破壞,沒有理由不更新你的代碼。 – Spence

回答

0

您必須執行您的Sql命令才能使您所做的更改持久化。

using (SqlConnection dbConn = new SqlConnection(connString)) 
{ 
    dbConn.Open(); 
    SqlCommand command = new SqlCommand(queryString, dbConn); 
    command.ExecuteNonQuery(); 
    dbConn.Close(); 
} 

ExecuteReader方法意圖(如名稱說)從SQL表讀出的數據。您需要使用不同的方法,如上所示。

+0

其有趣,因爲我認爲讀者會工作,但返回零結果。我同意,儘管ExecuteNonQuery是更好的API使用,但不僅僅是它會返回受影響的行數。 – Spence

+0

我已更新我的代碼以便在適用的情況下使用此調用,謝謝! – Brandon

+0

它沒有解決我的問題,但:( – Brandon

0

我們首先需要一些更多的信息,您還沒有顯示出代碼失敗的情況。

這種代碼的常見錯誤是在實際將更改提交到數據庫之前調用DataSet.AcceptChanges()

其次是數據綁定數據通過綁定源與直接編輯到數據集之間的衝突。

讓我們看看相應的代碼,我們可以嘗試和幫助。

在調用invoiceItemsTableAdapter之後設置一個斷點,並檢查InvoiceItems表中已添加的行。釋放斷點然後關閉你的應用程序。再次檢查數據庫。我會說另一張表可能會強行覆蓋發票項目表。

+0

我更新了上面的代碼 – Brandon

+0

我插入了斷點,檢查invoiceitems表確認記錄已被添加。我發佈了斷點並退出了應用程序(此時我做了停止操作並在單獨運行中正常退出),重新啓動了沒有任何改變的程序,並且在這兩種情況下,表在啓動時都是空的 – Brandon

+0

作爲一個附註,我搜索了引用「InvoiceItems」和上面的整個解決方案,一個報告(它並不是在單獨的實例中運行,看起來沒有任何停留),條目發生的窗體的設計屬性(禁用視圖的使用,以便他們必須使用我的文本框)和數據集類聲明它沒有提到 – Brandon