OleDbCommand ExecuteNonQuery изменяет путь файла к базе данных (Access .accdb) - PullRequest
0 голосов
/ 10 мая 2018

Ошибка выдается только при попытке обновить Access DB

У меня есть проблема, которую я не могу решить. У меня есть многоуровневое приложение WPF, которое использует базу данных MS Access (версия 2010 .accdb).
Примечание - я могу читать из базы данных без проблем. Однако когда я пытаюсь обновить базу данных, путь к файлу базы данных изменяется и выдается ошибка.

Правильный путь:
"\\ hcpclrfs1w01 \ LakefrontShared \ EmployeeInfo \ EmployeeData.accdb"

Внутреннее исключение брошено
OleDbException: не удалось найти файл 'C: \ Users \ trice \ AllDevProjects \ QaDashboard \ QaDashboard_Presentation \ bin \ Debug \ dbo.mdb'.
Сообщение : Ошибка при выполнении запроса

После изучения этой проблемы в течение нескольких дней самым близким предложением, которое я смог найти, является изменение поля свойств файла в разделе «Копировать в выходной файл» на значение Копировать, если новее .
Смотрите это ССЫЛКА .

Список условий:

  • Access 2010/32-битное приложение
  • Операционная система - Windows 7 Enterprise / 32-bit
  • VS 2017 / c #
  • Пробовал разные конфигурации сборки (Любой ЦП, x86)
  • Свойства файла (в разделе «Копировать в вывод напрямую») установлены на «Копировать, если новее»
  • База данных защищена паролем
  • База данных не импортируется в проект (но не требуется)
  • В базе данных нет связанных таблиц

Кто-нибудь знает исправление для этого? Ниже приведен метод обновления, который я использую:

public void Update(Employee dto)
{
    AccessDao dao = new AccessDao();
    string sql = string.Format(@"UPDATE [dbo].[{0}]
        SET [EmployeeName] = @EmployeeName 
           ,[OutLookFullName] = @OutLookFullName 
           ,[EmployeeAlias] = @EmployeeAlias 
           ,[EmployeeTEAM] = @EmployeeTEAM 
           ,[SpecificTeam] = @SpecificTeam 
           ,[SpecialAssignment] = @SpecialAssignment 
           ,[EmailAddress] = @EmailAddress 
           ,[ShiftStartTime] = @ShiftStartTime 
           ,[ShiftEndTime] = @ShiftEndTime 
           ,[EmployeeSHIFT] = @EmployeeSHIFT 
           ,[JobAssignment] = @JobAssignment 
           ,[NOTES] = @NOTES 
       WHERE ID = @ID ", EmpTable);

OleDbCommand command = dao.GetAccessCommand(sql);

command.Parameters.AddWithValue("@EmployeeName", dto.EmployeeName);
command.Parameters.AddWithValue("@OutLookFullName", dto.OutlookFullName);
command.Parameters.AddWithValue("@EmployeeAlias", dto.EmployeeAlias);
command.Parameters.AddWithValue("@EmployeeTEAM", dto.EmployeeTeam);
command.Parameters.AddWithValue("@SpecificTeam", dto.SpecificTeam);
command.Parameters.AddWithValue("@SpecialAssignment", dto.SpecialAssignment);
command.Parameters.AddWithValue("@EmailAddress", dto.EmailAddress);
command.Parameters.AddWithValue("@ShiftStartTime", dto.ShiftStartTime);
command.Parameters.AddWithValue("@ShiftEndTime", dto.ShiftEndTime);
command.Parameters.AddWithValue("@EmployeeSHIFT", dto.EmployeeShift);
command.Parameters.AddWithValue("@JobAssignment", dto.JobAssignment);
command.Parameters.AddWithValue("@NOTES", dto.Notes);
command.Parameters.AddWithValue("@ID", dto.EmployeeRecordId);
dao.ExecuteNonQuery(command);
}

Строка подключения находится в файле App.config следующим образом:

  <add name="EmployeeCONN" 
              connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\hcpclrfs1w01\LakefrontShared\EmployeeInfo\EmployeeData.accdb;Jet OLEDB:Database Password= password;" 
              providerName="Microsoft.ACE.OLEDB.12.0" />

Соединение и работа выполняются отдельным классом доступа к данным следующим образом:

 public class AccessDao
    {

        //TODO: TEMP While Testing
        private const string TestConnection = "EmployeeCONN";

        #region "Database Helper Methods"            

        // Connection
        private OleDbConnection _sharedConnection;
        public OleDbConnection SharedConnection
        {
            get
            {
                if (_sharedConnection == null)
                {
                    _sharedConnection = new
                        OleDbConnection(ConfigurationManager.ConnectionStrings[TestConnection].ConnectionString);
                }
                return _sharedConnection;
            }
            set { _sharedConnection = value; }
        }


        // Constructors
        public AccessDao() { }


   public void ExecuteNonQuery(OleDbCommand command)
        {
            try
            {
                if (command.Connection.State != ConnectionState.Open)
                {
                    command.Connection.Open();
                }
                command.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw new Exception("Error executing query", e);
            }
            finally
            {
                command.Connection.Close();
            }
        }

 public OleDbCommand  GetAccessCommand(string sqlQuery)
        {
            OleDbCommand command = new OleDbCommand();
            command.Connection = SharedConnection;
            command.CommandType = CommandType.Text;
            command.CommandText = sqlQuery;
            return command;
        }
...