abboudi_ammar Ответов: 1

Подключение к базе данных в WPF с помощью шаблона проектирования MVVM


Я новичок в MVVM design patter и WPF я пытаюсь сделать небольшой пример подключения к базе данных MS Access с помощью WPF и MVVM Light Toolkit patter design. но когда я запускаю программу, она ничего не делает, и когда я отлаживаю, я обнаруживаю, что инструкция останавливается на уровне инструкции.
con.Open(); 


файл model / DataConnection.cs, а затем он переходит в MainWindow.xaml.cs.
Я не нахожу, почему он не продолжает выполнение всех инструкций?

Что я уже пробовал:

Модель / DataConnection.cs
public  class DataConnection  
   {  
        public void OpenConnection()  
        {  
        OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=db.accdb;" +  
              "Persist Security Info=False;");  
  
  
               OleDbCommand cmd = con.CreateCommand();  
               cmd.CommandText = "Insert into table (num,nom)Values(123,'nom1')";  
               cmd.Connection = con;  
               con.Open();  
               cmd.ExecuteNonQuery();  
               MessageBox.Show("Record Submitted", "Congrats");  
                   }  
   }  


Модель Представления / MainViewModel.в CS
public class MainViewModel : ViewModelBase  
    {  
 private DataConnection _dataconnection;  
 public MainViewModel(DataConnection dataconnexion)  
        {  
            _dataconnection = dataconnexion;  
          _dataconnection.OpenConnection();  
   
 }  
}  

Модель Представления / ViewModelLocator.в CS
public class ViewModelLocator  
   {  
       static ViewModelLocator()  
       {  
           ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);  
SimpleIoc.Default.Register<DataConnection>();  
SimpleIoc.Default.Register<MainViewModel>();  
       }  
 public MainViewModel Main  
       {  
           get  
           {  
               return ServiceLocator.Current.GetInstance<MainViewModel>();  
           }  
       }  
  
       /// <summary>  
       /// Cleans up all the resources.  
       /// </summary>  
       public static void Cleanup()  
       {  
       }  
   }

J. Calhoun

Вы хотите сказать, что он останавливается на утверждении con.open()? Если это так, то я думаю, что это будет проблема с вашей строкой подключения. Сначала я бы обернул вашу логику OleDBConnection в Try/Catch, а затем, когда вы отлаживаете, если что-то должно было сломаться, catch облегчит отладку, не говоря уже о том, чтобы изящно обработать ошибку, если она должна была быть. Кроме того, судя по + в вашей строке, у вас нет пробела между ; и Persist, что может быть вашей проблемой.

abboudi_ammar

я использую это с помощью try и он показывает мне ошибку:
"Система.InvalidOperationException: поставщик "Microsoft.ACE.OLEDB.12.0" не записан на локальном компьютере"

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Он говорит, что потому, что у вас нет ни соответствующей архитектуры Office, ни Время Выполнения Доступа[^] установлен на машине.

Если ваше приложение скомпилировано AnyCPU и работает на 64-разрядной машине, вам придется использовать 64-разрядный Office или среду выполнения.

Если ваше приложение скомпилировано AnyCPU и работает на 32-разрядной машине, вам придется использовать 32-разрядный Office или среду выполнения.

Если ваше приложение скомпилировано на x86, у вас должен быть установлен 32-разрядный Office или среда выполнения.

Если ваше приложение скомпилировано на x64, вам необходимо установить 64-разрядный Office или среду выполнения.


abboudi_ammar

мое приложение скомпилировано AnyCPU и работает на 64-разрядной машине, а я использую 32-разрядный office 2007 и устанавливаю драйвер системы Office 2007: компоненты подключения к данным(https://www.microsoft.com/en-us/download/details.aspx?id=23734) но это не сработало.

Dave Kreskowiak

Конечно, это не работает. You're app is compiled AnyCPU, работающий на 64-разрядной версии Windows, означает, что он работает как 64-разрядный процесс.

У вас установлен 32-разрядный Office и/или среда выполнения.

Вы не можете смешивать 32-битный и 64-битный код в одном и том же процессе. Ваш 64-битный код пытается использовать 32-битные компоненты, и это не сработает.

Перекомпилируйте ваше приложение только на x86, и оно будет работать. Ну, до тех пор, пока в коде есть какие-то другие ошибки.