Не могу понять подключение OLE DB, C# к Access 2016

Я кодирую в VS Community 2015. У меня новый компьютер с Windows 10, только что обновленный с 8.0. У меня только что установлен автономный (без пакета Office) Access 2016. Все работает нормально.

Я не могу найти приседание, которое даст мне строку подключения для Access 2016. Поэтому я попробовал этот код (в десятке воплощений):

    public OleDbConnection TryOleDbConnection()
    {
        string ConnString =
            "Provider=Microsoft.ACE.OLEDB.15.0;" + 
            "Data Source=" + 
            "C:\\A A A A AutoBot4\\CALENDAR\\CALENDAR.addcb;" +
            "User Id=admin; Password=;";
        MessageBox.Show(ConnString);

        OleDbConnection OLE = new OleDbConnection();
        OLE.ConnectionString = ConnString;

        try
        {
            OLE.Open();
            MessageBox.Show("Opened");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Failed");
        }
        finally
        {
        }
        return OLE;
    }

Я ничего не могу заставить работать и не знаю, как получить более точную информацию об ошибках. Я нахожусь на несетевом компьютере и являюсь единственным пользователем и администратором. Я также запутался в идентификаторе пользователя и пароле, не понимая, относятся ли они к системе, базе данных или чему-то еще. Любая помощь здесь будет принята с благодарностью! Я уверен, что как только я получу связь, остальное будет легко.


person OldRoboCoder    schedule 25.02.2016    source источник


Ответы (2)


Вы можете использовать такую ​​функцию:

 public void FindProvider()
 {
      var reader = OleDbEnumerator.GetRootEnumerator();

      var list = new List<String>();
      while (reader.Read())
      {
           for (var i = 0; i < reader.FieldCount; i++)
           {
                if (reader.GetName(i) == "SOURCES_NAME")
                {
                     list.Add(reader.GetValue(i).ToString());
                }
           }
      }
      reader.Close();
      foreach (var provider in list)
      {
           if (provider.StartsWith("Microsoft.ACE.OLEDB"))
           {
                this.provider = provider.ToString();
           }
      }
 }

Все, что он делает, — это ищет возможных поставщиков в вашей системе и выбирает тот, который соответствует Microsoft.ACE.OLEDB, но вы можете изменить это по своему усмотрению. Вы также должны знать, что ваше приложение должно работать в 64-разрядном режиме, если у вас 64-разрядная версия Office 2016, и в 32-разрядном режиме, если ваша версия Office 32-разрядная.

person HeedfulCrayon    schedule 30.11.2016

Прежде всего, совет вам:

Используйте ConnectionString Builder или используйте App.config для хранения вашей строки подключения.

Во-вторых: расширение базы данных «accdb», а не «addcb».

И, наконец, «Да», строка подключения к базе данных Microsoft Access 2016 отсутствует или встречается редко. Но если вы когда-нибудь гуглили "Microsoft Access Database Engine 2016 Распространяемый», который, я полагаю, вы не сделали, потому что он уже установлен, верно? не так ли? вы также обнаружите, что он говорит (раздел инструкций по установке):

Если вы являетесь разработчиком приложений, использующим OLEDB, задайте для аргумента Provider свойства ConnectionString значение «Microsoft.ACE.OLEDB.12.0». Это действительно неверно, и обсуждение этой вводящей в заблуждение информации ждет answer У меня была та же проблема, и мой код для ее решения, и как ранее упоминал @heedfulcrayon:

Imports System.Data.OleDb
Public Class ThisClass
  Private ConnectionString As String
  Private CN As OleDbConnection = New OleDbConnection
  'This function Returns the Oledb Provider for your Project
  'I.e: if you have Office 2016 installed, it will return :
  'Microsoft.ACE.OLEDB.16.0
  Public Function FindProvider() As String
        Dim Provider As String = String.Empty
        Dim reader = OleDbEnumerator.GetRootEnumerator()
        Dim list = New List(Of String)
        While reader.Read()
            For i = 0 To reader.FieldCount - 1
                If reader.GetName(i) = "SOURCES_NAME" Then
                    list.Add(reader.GetValue(i).ToString())
                End If
            Next
        End While
        Return Nothing
        reader.Close()
        For Each provider In list
            If Provider.StartsWith("Microsoft.ACE.OLEDB") Then
                Provider = Provider.ToString()
                Return Provider
            Else
                Return Nothing
                Exit Function
            End If
        Next
    End Function
'This function is to validate connection to the database *.accdb
Public Function DBConnected(ByVal DBLocation As String, ByVal DBPass As String) As Boolean
ConnectionString =
("Provider=" & FindProvider() & ";Data Source=" & DBLocation & ";" _
& "Jet OLEDB:Database Password = '" & DBPass & "'; " _
& "Persist Security Info=False;")
  CN.ConnectionString = ConnectionString
  If CN.State = ConnectionState.Open Then CN.Close()
        Try
            CN.Open()
        Catch ex As OleDbException
            MsgBox("Error Database connection : " & ex.Message, MsgBoxStyle.Critical)
            Result = False
            Return Result
            Exit Function
        End Try
        Result = True
        Return Result
    End Function
    'Ofcourse this is not secure connection String, but just an example.
    'You should always use Configuration Files to manage Database Connections.
End Class

Теперь помните, что вы можете просто использовать Microsoft.ACE.OLEDB.16.0 или использовать весь приведенный выше сценарий, который, если он сработает, означает, что все, что касается вашего Установка Access 2016 в порядке.

person evry1falls    schedule 27.05.2020