1

我目前正在处理的 ac# 应用程序中有一些表格,对于 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 日。我仍然无法完成这项工作,还有其他想法吗?

4

2 回答 2

0

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

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

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

于 2011-10-11T06:47:38.840 回答
0

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

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

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

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

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

于 2011-10-11T06:51:05.310 回答