C # Sql данные не сохраняются - PullRequest
1 голос
/ 11 октября 2011

У меня есть несколько таблиц в приложении 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;

        }

Заранее благодарим за понимание.

ОБНОВЛЕНИЕ: 17 октября 2011 г. Я все еще не могу заставить это работать, есть еще идеи?

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

Сначала нам нужно больше информации, вы не показали случай, когда ваш код не работает.

Распространенными ошибками в коде такого типа является вызов DataSet.AcceptChanges() перед фактическим внесением изменений в базу данных.

Вторым является конфликт между данными, связанными через источник привязки, и изменениями в наборе данных напрямую.

Давайте посмотрим соответствующий код, и мы можем попытаться помочь.

Установите точку останова после вызова invoiceItemsTableAdapter и проверьте таблицу InvoiceItems для добавленной строки. Отпустите точку останова, а затем закройте свое приложение. Проверьте базу данных еще раз. Я бы сказал, что другая таблица может принудительно перезаписывать таблицу элементов счета.

0 голосов
/ 11 октября 2011

Вы должны выполнить свою команду Sql, чтобы сохранить сделанные вами изменения.

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

Метод ExecuteReader предназначен (как следует из названия) для чтения данных из таблицы SQL.Вам нужно использовать другой метод, как вы можете видеть выше.

...