Writing into excel file with OLEDB - c#

Does anyone know how to write to an excel file (.xls) via OLEDB in C#? I'm doing the following:
OleDbCommand dbCmd = new OleDbCommand("CREATE TABLE [test$] (...)", connection);
dbCmd.CommandTimeout = mTimeout;
results = dbCmd.ExecuteNonQuery();
But I get an OleDbException thrown with message:
"Cannot modify the design of table
'test$'. It is in a read-only
database."
My connection seems fine and I can select data fine but I can't seem to insert data into the excel file, does anyone know how I get read/write access to the excel file via OLEDB?

I was also looking for and answer but Zorantula's solution didn't work for me.
I found the solution on http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html
I removed the ReadOnly=false parameter and the IMEX=1 extended property.
The IMEX=1 property opens the workbook in import mode, so structure-modifying commands (like CREATE TABLE or DROP TABLE) don't work.
My working connection string is:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=workbook.xls;Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=Yes;\";"

You need to add ReadOnly=False; to your connection string
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fifa_ng_db.xls;Mode=ReadWrite;ReadOnly=false;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";

I also had the same problem. Only remove the extended property IMEX=1. That will solve your problem. Your table will be created in your Excel file...

A couple questions:
Does the user that executes your app (you?) have permission to write to the file?
Is the file read-only?
What is your connection string?
If you're using ASP, you'll need to add the IUSER_* user as in this example.

How do I check the permissions for writing to an excel file for my application (I'm using excel 2007)?
The file is not read only, or protected (to my knowledge).
My connection String is:
"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=fifa_ng_db.xls;Mode=ReadWrite;Extended
Properties=\"Excel
8.0;HDR=Yes;IMEX=1\""

Further to Michael Haren's answer. The account you will need to grant Modify permissions to the XLS file will likely be NETWORK SERVICE if this code is running in an ASP.NET application (it's specified in the IIS Application Pool). To find out exactly what account your code is running as, you can do a simple:
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);

I was running under ASP.NET, and encountered both "Cannot modify the design..." and "Cannot locate ISAM..." error messages.
I found that I needed to:
a) Use the following connection string:
Provider=Microsoft.Jet.OLEDB.4.0;Mode=ReadWrite;Extended Properties='Excel 8.0;HDR=Yes;';Data Source=" + {path to file};
Note I too had issues with IMEX=1 and with the ReadOnly=false attributes in the connection string.
b) Grant EVERYONE full permissions to the folder in which the file was being written. Normally, ASP.NET runs under the NETWORK SERVICE account, and that already had permissions. However, the OleDb code is unmanaged, so it must run under some other security context. (I am currently too lazy to figure out which account, so I just used EVERYONE.)

Related

Problem with Excel file reading with C# , ACE problem

I have read a lot of information about this issue.
And there are many questions in SO for this , but the problem still remains and it is the following:
I have understand that this connection string is for the older versions of Office :
string oldCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ path + ";" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'";
and I know that there is this connection string for the newer versions of Office:
string nweCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
+ path + ";Extended Properties=Excel 12.0;";
However , when I use the connection string for the newer versions with the ACE , I have this error :
The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
I have also read in other questions that I should install ACE first and the everything will work fine.
I do not have ACE driver installed neither the other computers that should use this Application, is there a way to read the Excel files using the JET for Office 2016 or 365 (everything above 2003).
I can not install the ACE in every of my clients in order to be able to work with my Application , it is not practical at all.
Is there a way to do this?
I had to solve the exact same problem many years ago. I added both connection strings to my configuration. When the application is used for the first time, I check with one ACE driver (since it is newer). If that fails, I will fallback to Jet. Save the working connectiion string in the AppConfig (you can save values to config too). So the next time you run the application, it will check the app config first and use that connection string on that machine.
Here are the steps I followed:
When application is launched/used for the first time on the machine try to get the working connection string from AppConfig.
Since it won't be available, you check with list of possible connection strings.
Start with ACE driver. Is successful, save it in the AppConfig.
If ACE failed, check with next driver (Jet). If this is successful, save this one as working connection string.
Next time when you launch the application, check the working connection string and proceed with it. That way you are not checking for both drivers again and again.
Note: When you update setting to AppConfig file they are not directly updated to original file. A copy of file is created for that user under C:\Users<UserName>.... When you try to load the values from AppConfig, these two are "merged" and used. This is automatically handled in C#.
Based on the above, if you ever have to reset the selection, you have to remove the config file in the user folder above and that should start the process from step 1 again.

Add New Data Source and code in connection with mismatch

I'm doing the project with c # sqlite
I'm starting to connect with the code.
updating, deleting, listing procedures
I'm with the code
string connect = #"Data source=" + System.Windows.Forms.Application.StartupPath + "\\yedek\\DUKKAN.db3; Journal Mode=Off"
this connection good work.
but Add New Data Source connection this map wrong
image
http://i.imgur.com/DSEsGxS.png
If I choose to browse on different computers, this error "unable to open database"
I use the other connection for reporting (for dataset)
consequently
the database is running
reporting does not work
this project screen (work) database insert, select and update work
http://i.imgur.com/kZO2XT8.png
this project report(use microsoft report viewer) not work
http://i.imgur.com/SJdetwG.png
You will need to specify the full path and file name in the Add Connection dialog (http://i.imgur.com/DSEsGxS.png). Instead of "yedek\DUKKAN.db3" it should read something like "c:\Users\yedek\DUKKAN.db3". Use the "Browse..." button to find the db3 file.

read a .db file in C#

string Path = #"c:\Database\Mydatabase.db";
string myConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path + ";Extended Properties=Paradox 5.x;";
// Define the database query
string mySelectQuery = "SELECT id,name FROM people WHERE id < 3;";
// Create a database connection object using the connection string
OleDbConnection myConnection = new OleDbConnection(myConnectionString);
// Create a database command on the connection using query
OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection);
// Open the connection
myCommand.Connection.Open();
// Create a database reader
OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
The Error is at myCommand.Connection.Open(); and it says:
'c:\Database\Mydatabase.db' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.
I am trying to read a .db file in C#. However, I am getting an error, I am sure that file is located there, the error does not make sense for me. Could you please help me ? Or How can I read a .db(paradox) database file in C# ?
EDIT:
string Path = #"c:\Database\";
The Error for this case is "The Microsoft Jet database engine could not find the object 'people'. Make sure the object exists and that you spell its name and the path name correctly."
If I change it like that, How can C# find which database file is gonna be used ? Since, I did not specify file name which is "Mydatabase.db" at anywhere
Confirmed it is an SQLite database, I just downloaded it on my phone and viewed it with an SQLite viewer.
You will need to download an ADO.NET provider for SQLite:
"Official" version (from SQLite, not MS)
http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
Older version
http://sqlite.phxsoftware.com/
if the application cannot see the file than chances are it's a security issue. while "you" can access the file. the application cannot.
is this a web application? if so, then this is the problem. asp.net/IIS cannot see outside of its virtual directory. In which case you either need to elevate/modify privileges of the asp.net user account to access the file, or move the database file within the virtual directory. This is a good candidate for the App_Data directory.
Try one of these connection strings instead.
According to this site, you should only specify the folder name, not the db file.
Please note that you should only specify the folder where the database
resides. Not the database name itself.
The linked MSDN article says that Jet 4.0 Service Pack 5 should be used if you want to update the data, otherwise it may be read-only. In any case I would recommend installing the service pack.

Connecting MS Access while another application using the same MS Acess File

I have a window application which tries to connect a MS Access file which is all ready used by another application.
When I stop that application then I am able to connect with MS Access file.
Otherwise an error occurs as follows:
OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "AccessDb" returned message "Cannot start your application.The workgroup information file is missing or opened exclusively by another user.
Is there any way which I can open a connection in read only mode.
I have to just read data from that file.
Thanks.
Try adding "Mode= Share Deny None" to the connection string of this application that is locking the DB, so that the connection string looks like
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyDb.mdb;Persist Security Info=False;Jet OLEDB:Database Password=My_Password;Mode= Share Deny None
This connection string should be used by the application that is currently opening the DB in exclusive mode.
I was facing similar problem and it's solved now.
In connection String u might have provided
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\serverName\shareName\folder\myDatabase.mdb;User Id=admin;Password=;
Don't provide Password and instead while sharing file click on advanced sharing and remove administrators users and add everyone with full control.
then run your application

C# and SQLite: "no such table error" when using relative path?

I am having issues connecting to my sqlite database. The file is located in the application's folder. Here is the connection string
string path = "Data Source=MY.db";
I can get it to work if I use the absolute path, but it gives me a "table not found" error if I try to use a relative path. Any ideas?
You are opening up a different -- perhaps a new -- database that does not have said table. (Yes, SQLite will happily create a new database with the default connection settings.)
Make sure the correct database is opened. Remember, relative path is relative to the Current Working Directory, which is likely not that which is expected.
(The working directory is influenced from where, and how, the process is loaded. The working directory for a "Debug" session can be set under Project Settings / Debug / Start Options, for instance.)
Happy coding.
See also:
Make SQLite connection fail if database is missing? (deleted/moved)
Defining a working directory for executing a program (C#) (Shows how to set the current working directory to the directory containing the executing assembly.)
How do I get/set a winforms application's working directory?
Getting path relative to the current working directory?
This happened when you haven't saved the database and its table while using GUI Manager for SQLite .
Two solution;
1) Save your database and its table with CTR+S in GUI Manager
2) Or Simply Just close your GUI manager of SQlite and save all .
Important ! I am using GUI manger for SQLITE (DB Browser for SQLITE) and its all about that.
I've had the same problem for both my windows application (C#) and web application (ASP.net). I usually use SQLite because I found it more easier, especially when I worked with connection strings. But the main obstacle for me was to put a relative path in my code, so I can publish it without worrying about being unable to find the database. I've tried many things(using "|Data Directory|", "~/", "./", ...), and none of them works until I found these solutions. It seems the code is working for me, but wonder if I'm using them right?!
Web Application:
SQLiteConnection sql_con = new SQLiteConnection("Data Source =" + Server.MapPath("~/") + "mydb.db; Version = 3; New = false;);
Windows App:
SQLiteConnection sql_con = new SQLiteConnection("Data Source =" + System.IO.Path.GetDirectoryName(Application.ExecutablePath) + "mydb.db; Version = 3; New = false; Read Only = true");
just replace your .database file into \bin\Debug in project folder, because in your case compiler creates DB file with same name but its totally empty 0bytes

Categories

Resources