【问题标题】:C# Sql Data not savingC# Sql 数据不保存
【发布时间】:2011-12-05 01:02:50
【问题描述】:

我目前正在处理的 c# 应用程序中有几个表,对于 4/5 的表,一切都保存得很好,没有问题。对于第 5 个表,一切似乎都很好,直到我再次重新加载程序(不修改代码或使用单独安装以使数据不会消失) 4/5 表很好,但第 5 个表没有任何记录在它重新启动后(但它在上次运行时确实如此)。下面是一些代码摘录。我在网上尝试了一些不同的解决方案,包括创建一个字符串来手动在数据库上运行 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 日。我仍然无法使这项工作正常进行,还有其他想法吗?

【问题讨论】:

  • 我还不会投票结束。问题在于您的 SQL 写入和/或数据适配器和数据集代码。您能否从您的代码中删除任何不是面向 SQL、数据集或绑定源的内容,我们可以尝试提供帮助。
  • 只要您的 InvoiceItemsTableAdapter 没有损坏,就没有理由不更新您的代码。
  • 我查看了我所有的代码并验证了上面的代码被调用了,这是唯一被调用的代码。虽然它仍然没有保存在数据库中
  • 可能值得注意的是,添加项目代码被调用了 0+ 次(在大多数情况下为测试目的是 1 次),并且在不久之后调用了保存发票
  • 我更新了我的答案,您需要验证在调用 UpdateAdapter 后您的 SQL 数据库是否已更新。如果是,则其他内容正在删除该行,否则问题是表适配器。

标签: sql database c#-4.0 data-loss


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我已插入断点,检查 invoiceitems 表确认已添加记录。我释放了断点并退出了应用程序(此时我做了一个停止操作并在单独的运行中正常退出),重新启动程序没有改变任何东西,在这两种情况下,表在启动时都是空的
  • 作为旁注,我在整个解决方案中搜索了对“InvoiceItems”和上述内容的引用,一个单一的报告(在似乎没有裸露的单独实例中运行和不运行),设计属性出现条目的形式(禁用视图的使用,以便他们必须使用我的文本框),以及未提及的数据集类声明
  • 至于表格适配器,我不知道它是如何被破坏的,因为我可以看到的唯一可以修改的值与发票完全相同,除了它用于不同的表格
  • 因此,当您说“已添加记录”时,您已运行 SQL 查询以确认其存在。当您重新启动应用程序时,它就消失了。必须对表执行删除操作,或者您有一个围绕未提交的整个操作的事务。
  • 好吧,一旦应用程序关闭,我就无法查询 Visual Studio 2010 中的任何表,它只是说数据不存在,即使对于它记住数据的表也是如此。当我确认它在那里时,我正在检查表的计数是否增加了。我没有使用任何交易。
【解决方案2】:

您必须执行您的 Sql 命令才能保留您所做的更改。

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

ExecuteReader 方法旨在(顾名思义)从 SQL 表中读取数据。如上所示,您需要使用不同的方法。

【讨论】:

  • 它很有趣,因为我认为阅读器会工作,但返回零结果。我同意 ExecuteNonQuery 是更好的 API,尤其是它会返回受影响的行数。
  • 我已更新我的代码以在适用的情况下使用此调用,谢谢!
  • 它并没有解决我的问题:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2013-10-12
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多