Short answer
Both should be perfectly fine in 99% of cases.
Explanation
The currently executing assembly's directory is a reliable way to get the location of the current executable. Using System.IO, you could simply remove the file name from the path:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
If the Data folder is shipped as part of a dll file that you compile, you might want to use typeof(SomeClassInMyDll).Assembly.Location instead of the executing assembly. This is to allow for a user of your DLL to have uncommon logic such as loading your assembly based on its path, which might be a different location than the currently executing assembly.
The AppDomain.BaseDirectory property is the location where the currently running code looks for DLL files when it needs to load a dependency. This is generally the same location as the currently executing assembly's path, however, if whoever is calling your code is loading your DLL in a separate AppDomain, again loading it from a file name explicitly, the BaseDirectory might be different from the folder that contains your DLL or executable.
To give an example of that uncommon scenario, let's say there is an executable C:\foo\bar.exe, which dynamically loads a DLL from a different path. This would be done by calling the method Assembly.LoadFrom("C:\MyFolder\MyDll.dll"). In that case, the following would be returned:
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) = C:\foo\
AppDomain.BaseDirectory = C:\foo\
Path.GetDirectoryName(typeof(SomeClassInMyDll).Assembly.Location) = C:\MyFolder\