How to read data from embedded database? - c#

I wanna improve one application which database is unknown for me. So i have interface to work with but no data to fill forms/documents etc in a new application... Installation folder only containts .dll files without any clue of database. For now i have tried to inspect .dll files with JetBrains and found only source code of those dll's without any "physical" location of database on my hard drive so i started to think it's embedded in application. I also inspected all my hard drive to try find it in some hidden folder without success. After further investigation i figured out that i have to get Microsoft Access database who works with Jet Oledb 4.0.. I found this line of code where it says :
this._connectionString = "PROVIDER=microsoft.jet.oledb.4.0; Data Source=" + this.DataBasePath + "; Jet OLEDB:Database Password = 12345678";
So basically i know the password of that database but i don't know where is that database. And now i am stuck because i have never worked with embedded database. I only got installed application and installation file (which was generated thru visual studio).
Is it possible to get tables/data from embedded database and if so how to do it? Is it maybe possible to get database from installation file and if so how to do it?
Any help would be nice.
Thanks KuKeC

Unless I'm wrong there has to be an actual file to store the database so why dont you just look for a *.db file in your system and open it with a db tool to check the content

Related

Where does `dbcontext.savechanges()` save data when no connection string

I am working with Microsoft's documentation and learning c#. I am copying an example of databinding with winforms.
The example works, but where is the data stored? I checked my folder, there is no mdf file, and my computer doesn't have SQL Server installed, but when I added something to the table, close the program and reopen it , the data is still there. Where is the data stored?

New C# project cannot open ACCDB microsoft database file

I recently had a new project assigned to me (I'm new to C# and I'm a junior). It makes use of a Microsoft access database file (.accdb file)
I've imported the project into Visual Studio but I can't for the life of me run the code. Initially I had file register issues, and I think I managed to resolve that by getting the IT teams to install a "2007 Office System Driver: Data Connectivity Components" driver from the Microsoft website.
Bow the error says:
System.Data.OleDb.OleDbExceptions: 'Cannot open database''. It may not be a database that your application recognizes, or the file may be corrupt.'
The team I'm trying to help only has one dev (working from a different country) who is the main person to handle the code. It works on her side, but she doesn't really have the experience to help me troubleshoot this.
I tried sending her my database file, for her to swap her file for mine, and she said it was still working, so it sounds like the issue might not be to do with the file?
Could I get any help if possible? So far my only approach is to keep googling the error.
But the only resolutions I see are from people who have database files nearing their file size limit (2GB). My database file is just 1MB.
The database file is password protected (the password happens to be in the code). I opened the database file (Microsoft access opens) and entered the password and I had no issue accessing the data)
Out of luck, I managed to find the right article to help me!
The issue with Microsoft access database files is only one user can really use then at a time I believe.
I saw a forum about potential locks made by other users. I googled how to remove locks but it seems that it might not be a lock issue (Microsoft creates a lock file which I dont have).
Regardless, I assumed that the issue is still somewhat similar. Since I had access to the database in Microsoft Access, I decided to open a new database, then go to external data tab and click on access to import EVERYTHING from the other file. Then I just renamed to old file and give my new file the original name.
I reran the code and it worked!
I dont know why the other dev had no issue opening the file. My assumption is that because she is the only developer her laptop is already 'set up' in some way to run everything as normal, whereas if someone new tried (or if something happens and she has to re-open the code on a new laptop) they would have to try and replicate the 'set up' or try and work from scratch
Hope this helps

Dumping an SQLite database stored as dll file?

A little background first: I need to extract a database from an SQLite dll file for my client who has burned bridges with the previous dev.
I have these 4 files sitting on my desktop:
System.data.SQLite.Linq.dll
System.data.SQLite.dll
SQLite.Interop.dll
Payroll.exe
I am also given the password for the SQLite DB which Payroll.exe uses to interact with the database. With this is it possible for me to dump an SQL file (so I can work with something familiar)?
Major problem is that I have no experience with C#, .NET stuff and DLL files (I know it stands for Dynamic Link Library!)
I'm willing to dabble and learn some C# to do this.
As suggested, I decompiled the source and found some interesting code:
namespace Payroll
{
internal class Payroll_Database
{
private static string ConnectionStr = "Data Source=.\\System.Data.SQLite.Linq.dll; Password=******!";
private static SQLiteConnection Connection = new SQLiteConnection();
It seems certain that System.Data.SQLite.Linq.dll is the database file. I have trouble opening it with tools such as SQLite Browser. I have tried renaming it to a .db, but again no dice.
Your database won't be in the dll and exe files you list.
It should be in a separate file, possibly with an extension like .sqlite, .sqlite3, .sdb3 .db or .db3 (but this is not mandated).
If you can locate the db file, you can open it with any sqlite client (e.g. you can use the firefox sqlite-manager plugin), and extract the data as required.
You could probably find the database filename from the Payroll.exe source code, which you can read by opening Payroll.exe in ILSpy.
If you cannot locate the db file, you will be unable to retrieve the data. In which case, the best you can achieve with the files you list would be to determine the database schema by reading the payroll application's source code.
Update:
Now you've found the connection string, it looks possible that the database could indeed be the System.Data.SQLite.Linq.dll file, and the developer has given it a name to match a known .NET assembly as some kind of security through obscurity.
If that is indeed the db file you should be able to open it directly in a SQLite client application like the firefox sqlite-manager plugin I mentioned above. If you can't open it in a SQLite client application, then you can to check to see if it is a .NET assembly after all by opening it with ILSpy or Microsoft's MSIL disassmebler.
Update 2:
According to this SO question, you should be able to open your encrypted db file with the free SQLite2009 Pro Enterprise Manager.

Release plan for my application on other machine by using .mdf file

I am using SQL server 2008 R2 and VS2010. I made simple application by using this tools. I attach database as .mdf in my application and deploy that application on other machine its works fine. Now if I plan for new release of my app which some extended features, I can upload Code by DLL, But problem is updating .mdf file, to handle this I am exporting database into .xls sheets (Application have one utility to backup database) and then import into SQL Server to create new .mdf file. Someone have better solution on this? Can I open old version of .mdf file in SQL Server(Third party software) and Execute DML/DDL script on it to make latest code and database compatible ? May I keep .sql file in one of my project code and execute it by some utility..? Any Class in C# which can handle this..?
I did not get your query completely. Do you want to upgrade the DB through the application?
You can of course run .sql files through your application, but I'm not sure it would help you change the Database configuration.
Alternatively, if you already have the updated .mdf file and the database name is same, then you can follow the following steps.
1. Detach the database by SSMS in the third party environment through SSMS.
2. Replace the .mdf, .ldf and .ndf (if any) in the disk.
3. Attach the updated .mdf file.
This will get the new Object definitions as well as data.
As far as I'm aware, there is no process for merging .mdf files, because the SQL Server might not be able to identify the similar objects properly as sys tables may be different, and also would not know which data to keep in the final data base, in case the table structure, constraints or data conflicts occur.
However, looking at your requirement, the best way I can suggest is,
1. Generate the Alter scripts for the tables modified (By right clicking on the object name and using Script Table As.. option). Of course, I assume you have the list of objects modified and the modifications.
2. Connect the two DB servers over network and write an SSIS package or Import data from the old DB to the new one for the tables you want.
Hope this helps.

Read-Only ADO.NET Connection String for Excel

I'm trying to prevent the following from coming up when reading an Excel file using ADO.NET:
The Microsoft Jet database engine cannot open the file ''. It is already opened exclusively by another user, or you need permission to view its data.
I know it is happening because another user has the file open, but I can't get rid of it. I've tried adding Read Only=True; to my connection string, but that doesn't work. I've also tried to set the Mode of the connection to read-only, but I can't figure out how to in C#.
Here is my connection string:
Provider=Microsoft.Jet.OLEDB.4.0; data source=test.xls; Extended Properties="Excel 8.0;HDR=No;IMEX=1"
Thanks for the help!
This can also come up if you don't have permissions for the file, not just when it's exclusively open. In any event, I always found the best workaround for this problem was to automate a copy of the file to a new temp file. Copies are almost instantaneous, even for large files, so they shouldn't slow you down much, and since your application is only read-only, you don't have to worry about discarding the temp file afterwards.
Furthermore, this will clear up any permissions issues that can be cleared up. If you have read permissions, the copy will work, if not, then there's no workaround anyways. You will have full permissions for the copied file if you make the destination path of the temp copy the same path as the workbook. (Application.Path)
Use the FileCopy srcFile, destName command for this.
Well, you said you tried changing the mode to read only, how exactly did you do that?
As per MSDN, by default, the OLE DB Provider for Microsoft Jet opens Microsoft Jet databases in read/write mode. To open a database in read-only mode, set the Mode property on the ADO Connection object to adModeRead.
So in C# it should have looked like:
ADODB.Connection myConn = new new ADODB.Connection();
myConn.Mode = adModeRead; //1
myConn.Open(strConectionString, null, null, -1);

Categories