C#Sql数据不保存

问题描述:

我有一个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

您必须执行您的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

我们首先需要一些更多的信息,您还没有显示出代码失败的情况。

这种代码的常见错误是在实际将更改提交到数据库之前调用DataSet.AcceptChanges()

其次是数据绑定数据通过绑定源与直接编辑到数据集之间的冲突。

让我们看看相应的代码,我们可以尝试和帮助。

在调用invoiceItemsTableAdapter之后设置一个断点,并检查InvoiceItems表中已添加的行。释放断点然后关闭你的应用程序。再次检查数据库。我会说另一张表可能会强行覆盖发票项目表。

+0

我更新了上面的代码 – Brandon

+0

我插入了断点,检查invoiceitems表确认记录已被添加。我发布了断点并退出了应用程序(此时我做了停止操作并在单独运行中正常退出),重新启动了没有任何改变的程序,并且在这两种情况下,表在启动时都是空的 – Brandon

+0

作为一个附注,我搜索了引用“InvoiceItems”和上面的整个解决方案,一个报告(它并不是在单独的实例中运行,看起来没有任何停留),条目发生的窗体的设计属性(禁用视图的使用,以便他们必须使用我的文本框)和数据集类声明它没有提到 – Brandon