Ошибка выдается только при попытке обновить 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;
}