Пример #1
0
        /// <summary>
        /// Writes changes made to current incid back to database and GIS layer.
        /// Also synchronizes shadow copy of GIS layer in DB and writes history.
        /// </summary>
        internal bool Update()
        {
            _viewModelMain.DataBase.BeginTransaction(true, IsolationLevel.ReadCommitted);

            try
            {
                _viewModelMain.ChangeCursor(Cursors.Wait, "Saving ...");

                int incidCurrRowIx = _viewModelMain.IncidCurrentRowIndex;

                if (_viewModelMain.IsDirtyIncid())
                {
                    IncidCurrentRowDerivedValuesUpdate(_viewModelMain);

                    _viewModelMain.IncidCurrentRow.last_modified_date    = DateTime.Now;
                    _viewModelMain.IncidCurrentRow.last_modified_user_id = _viewModelMain.UserID;

                    if (_viewModelMain.HluTableAdapterManager.incidTableAdapter.Update(
                            (HluDataSet.incidDataTable)_viewModelMain.HluDataset.incid.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update '{0}' table.",
                                                          _viewModelMain.HluDataset.incid.TableName));
                    }
                }

                if ((_viewModelMain.IncidIhsMatrixRows != null) && _viewModelMain.IsDirtyIncidIhsMatrix())
                {
                    if (_viewModelMain.HluTableAdapterManager.incid_ihs_matrixTableAdapter.Update(
                            (HluDataSet.incid_ihs_matrixDataTable)_viewModelMain.HluDataset.incid_ihs_matrix.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update '{0}' table.",
                                                          _viewModelMain.HluDataset.incid_ihs_matrix.TableName));
                    }
                }

                if ((_viewModelMain.IncidIhsFormationRows != null) && _viewModelMain.IsDirtyIncidIhsFormation())
                {
                    if (_viewModelMain.HluTableAdapterManager.incid_ihs_formationTableAdapter.Update(
                            (HluDataSet.incid_ihs_formationDataTable)_viewModelMain.HluDataset.incid_ihs_formation.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update '{0}' table.",
                                                          _viewModelMain.HluDataset.incid_ihs_formation.TableName));
                    }
                }

                if ((_viewModelMain.IncidIhsManagementRows != null) && _viewModelMain.IsDirtyIncidIhsManagement())
                {
                    if (_viewModelMain.HluTableAdapterManager.incid_ihs_managementTableAdapter.Update(
                            (HluDataSet.incid_ihs_managementDataTable)_viewModelMain.HluDataset.incid_ihs_management.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update '{0}' table.",
                                                          _viewModelMain.HluDataset.incid_ihs_management.TableName));
                    }
                }

                if ((_viewModelMain.IncidIhsComplexRows != null) && _viewModelMain.IsDirtyIncidIhsComplex())
                {
                    if (_viewModelMain.HluTableAdapterManager.incid_ihs_complexTableAdapter.Update(
                            (HluDataSet.incid_ihs_complexDataTable)_viewModelMain.HluDataset.incid_ihs_complex.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update '{0}' table.",
                                                          _viewModelMain.HluDataset.incid_ihs_complex.TableName));
                    }
                }

                if (_viewModelMain.IsDirtyIncidBap())
                {
                    UpdateBap();
                }

                if (_viewModelMain.IncidSourcesRows != null)
                {
                    int j = 0;
                    for (int i = 0; i < _viewModelMain.IncidSourcesRows.Length; i++)
                    {
                        if (_viewModelMain.IncidSourcesRows[i] != null)
                        {
                            _viewModelMain.IncidSourcesRows[i].sort_order = ++j;
                        }
                    }

                    if (_viewModelMain.HluTableAdapterManager.incid_sourcesTableAdapter.Update(
                            (HluDataSet.incid_sourcesDataTable)_viewModelMain.IncidSourcesTable.GetChanges()) == -1)
                    {
                        throw new Exception(String.Format("Failed to update {0} table.",
                                                          _viewModelMain.HluDataset.incid_sources.TableName));
                    }
                }

                // update all GIS rows corresponding to this incid
                List <SqlFilterCondition> incidCond = new List <SqlFilterCondition>(new SqlFilterCondition[] {
                    new SqlFilterCondition(_viewModelMain.HluDataset.incid_mm_polygons,
                                           _viewModelMain.HluDataset.incid_mm_polygons.incidColumn, _viewModelMain.Incid)
                });

                var q = _viewModelMain.HluDataset.lut_ihs_habitat
                        .Where(r => r.code == _viewModelMain.IncidCurrentRow.ihs_habitat);
                string ihsHabitatCategory = q.Count() == 1 ? q.ElementAt(0).category : null;

                DataTable historyTable = _viewModelMain.GISApplication.UpdateFeatures(new DataColumn[] {
                    _viewModelMain.HluDataset.incid_mm_polygons.ihs_categoryColumn,
                    _viewModelMain.HluDataset.incid_mm_polygons.ihs_summaryColumn
                },
                                                                                      new object[] { ihsHabitatCategory, _viewModelMain.IncidIhsSummary },
                                                                                      _viewModelMain.HistoryColumns, incidCond);

                if (historyTable == null)
                {
                    throw new Exception("Error updating GIS layer.");
                }
                else if (historyTable.Rows.Count == 0)
                {
                    throw new Exception("No GIS features to update.");
                }

                // likewise update DB shadow copy of GIS layer
                if (_viewModelMain.DataBase.ExecuteNonQuery(String.Format("UPDATE {0} SET {1} = {3}, {2} = {4} WHERE {5}",
                                                                          _viewModelMain.DataBase.QualifyTableName(_viewModelMain.HluDataset.incid_mm_polygons.TableName),
                                                                          _viewModelMain.DataBase.QuoteIdentifier(
                                                                              _viewModelMain.HluDataset.incid_mm_polygons.ihs_categoryColumn.ColumnName),
                                                                          _viewModelMain.DataBase.QuoteIdentifier(
                                                                              _viewModelMain.HluDataset.incid_mm_polygons.ihs_summaryColumn.ColumnName),
                                                                          _viewModelMain.DataBase.QuoteValue(ihsHabitatCategory),
                                                                          _viewModelMain.DataBase.QuoteValue(_viewModelMain.IncidIhsSummary),
                                                                          _viewModelMain.DataBase.WhereClause(false, true, true, incidCond)),
                                                            _viewModelMain.DataBase.Connection.ConnectionTimeout, CommandType.Text) == -1)
                {
                    throw new Exception("Failed to update database copy of GIS layer.");
                }

                // save history returned from GIS
                Dictionary <int, string> fixedValues = new Dictionary <int, string>();
                fixedValues.Add(_viewModelMain.HluDataset.history.incidColumn.Ordinal, _viewModelMain.Incid);
                ViewModelWindowMainHistory vmHist = new ViewModelWindowMainHistory(_viewModelMain);
                vmHist.HistoryWrite(fixedValues, historyTable, ViewModelWindowMain.Operations.AttributeUpdate);

                _viewModelMain.DataBase.CommitTransaction();
                _viewModelMain.HluDataset.AcceptChanges();
                _viewModelMain.Saved = true;

                _viewModelMain.IncidRowCount(true);
                _viewModelMain.IncidCurrentRowIndex = incidCurrRowIx;

                return(true);
            }
            catch (Exception ex)
            {
                _viewModelMain.DataBase.RollbackTransaction();
                if (_viewModelMain.HaveGisApp)
                {
                    _viewModelMain.Saved = false;
                    MessageBox.Show("Your changes could not be saved. The error message returned was:\n\n" +
                                    ex.Message, "HLU: Save Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return(false);
                }
                else
                {
                    return(true);
                }
            }
            finally
            {
                _viewModelMain.SavingAttempted = true;
                _viewModelMain.Saving          = false;
                _viewModelMain.ChangeCursor(Cursors.Arrow, null);
            }
        }