Can't find App.config file for Windows Console app - c#

I have a Windows console app that has an App.config file. The console app is to be executed from a SQL Agent job. In app.config I store a database connection.
<connectionStrings>
<add name="Northwind" connectionString="Data Source=servername;Initial Catalog=Northwind;User ID=sqlUser;Password=secret" providerName="System.Data.SqlClient"/>
</connectionStrings>
I get the connection string at runtime like so:
var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
My code works fine in debug and can read the connection string from App.config.
When I build for release, there is no app.config in the release folder. When I copy the .exe over to the server, I get "Object reference not set..." when trying
to get the connection string. Tried manually copying app.config, but no joy.
Found this, but it doesn't match since my build doesn't create a file named MyApp.exe.config.
Edit: It doesn't create any file ending in *.exe.config.
Loading app.config file in Release
What am I doing wrong?
Edit: Does the App.config become a part of the .EXE in a Windows console app?

Related

Read configuration from App.config instead of AppName.exe.config

I have developed a small windows service which performs few database operations. I have to give an option to the user to change server name on post-deploy. if user changes in app.config it doesn't affect the service, it is still reading connection strings from AppName.exe.config.
Here what I have tried.
<connectionStrings>
<add name="testString" connectionString="Data Source=ServerAddresss;Initial Catalog=DatabaseName;Integrated Security=True;" />
</connectionStrings>
C# code,
ConfigurationManager.ConnectionStrings["ProjectName.Properties.Settings.testString"].ConnectionString);
This returns a server connection string from AppName.exe.config file but I want to access it from App.config file.
can someone help me out in this?
App.config and AppName.exe.config aren't exactly separate - AppName.exe.config is the build output of app.config.
In other words, once the service is deployed, there shouldn't even be an app.config to change, and if there is, changing it won't do anything. AppName.exe.config is where your application gets "app.config" values.
If you need different configuration values for different environments, take a look at config transformations. They allow you to change or replace sections or individual values for different configurations such as debug, release, or other custom configurations.
This is useful because it means that all of the connection strings are part of the project and are in source control. You can do without this and just edit the config file in place on the server, but then there will be nothing in source control indicating where the connection string came from. And then if you redeploy the service the change will be overwritten unless someone remembers to make the same change every time. Having it in source control is much better.
For some reason that I do not understand, you can right-click a web.config and select "Add Config Transforms", but you can't do that with an app.config. Maybe there's a good reason.
You can install this extension which enables the same behavior for app.config. Then you can right-click on app.config and add a transformation for another configuration, like Release.
In that file (app.Release.config) add this:
<connectionStrings xdt:Transform="Replace">
<add name="testString" connectionString="...your Release connection string..." />
</connectionStrings>
When you build and deploy using the Release configuration it will replace the connectionStrings section with this one, leaving everything else just as it is. You can also right-click app.Release.config and select "Preview Config Transforms" to see the transformed file side-by-side with the original.
You should be able to just pull in an arbitrary file with a ConfigurationFileMap
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
This question is a possible duplicate of: Using ConfigurationManager to load config from an arbitrary location
Also, you'll have to be sure that the service is restarted after updating the config file (either config file).

Connect to same database from c# service and asp.net c# code behind [duplicate]

I am getting the following error while debugging my visual studio 2010 website:
An attempt to attach an auto-named database for file C:\Users...\Desktop\Dpp2012New\App_Data\dppdatabase.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: An attempt to attach an auto-named database for file C:\Users...\Desktop\Dpp2012New\App_Data\dppdatabase.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
Here is my connection string from my web.config:
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
providerName="System.Data.SqlClient"/>
<add name="ConnectionString"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\dppdatabase.mdf;Integrated Security=SSPI"
providerName="System.Data.SqlClient"/>
</connectionStrings>
And I access it from my website as:
Dim connectionString As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
The stacktrace shows the error line as:
Dim conn As New SqlConnection(connectionString)
Dim dr As SqlDataReader
conn.Open() 'This is the error line as per stacktrace
I have given the needed permissions to the above folder so it can not be the " or specified file cannot be opened" issue. If we look at all the posts related to the same error in this forum, clearly the profoundness of this error can be found out. However, none of the solutions solves my issue.
Some of the resources which I have tried are:
http://weblogs.asp.net/scottgu/archive/2005/08/25/423703.aspx
http://blogs.msdn.com/b/webdevelopertips/archive/2010/05/06/tip-106-did-you-know-how-to-create-the-aspnetdb-mdf-file.aspx
http://forums.asp.net/t/1033225.aspx
I eagerly await a solution.
I had this problem also and it was a pain. I configured my connection string and managed to solve the problem. In the connection string I replaced the value |DataDirectory|\dbfilename.mdf for AttachDbFilename property, with the path to the file. |DataDirectory| can only be used if the database file is in the App_Data folder inside same project.
So changing the AttachDbFilename property to the direct path of the mdf file, fixed my issue.
AttachDbFilename=C:\MyApp\App\DAL\db.mdf
I hope this works for you.
Try to create your connection string as below:
<add name="ECommerce" connectionString="Data Source=(localdb)\v11.0;Initial Catalog=C:\USERS\dL\DESKTOP\DATABASE\MYSHOP.MDF;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False" providerName="System.Data.SqlClient"/>
It's working for me.
<add name="Connections" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
I had a similar error, but using a connection configured in code, rather than a config file. The solution for me was simply to add the "Initial Catalog=MyDatabase" part. My code now looks like...
DbConnection connection = new SqlConnection(String.Format(#"Data Source=.\SQLEXPRESS; Integrated Security=SSPI; AttachDbFilename={0}; User Instance=True; Initial Catalog=IPDatabase;", Location));
Location is a full path to an mdb file, that does not have to exist yet.
One of the most annoying errors when developing web apps in .Net. I had this issue on a project I was doing a year ago.
This is what worked for me: I've logged in with sa account to SQL Management Studio and attached the database to the object explorer (Databases -> Right Click -> Attach).
Then I've opened Security->Logins->[myWindowsUsername] and edited User Mappings tab, giving dbowner rights to the attached database.
I'm sure you can do those things without Management Studio, with console commands, but I'm not that good with T-SQL and can't give you advice on that.
Mine was an EF code-first project and it comes up when the file has been deleted. Running Update-Database from the Package Manager Console makes the DB and its fine.
The error occurred because the AttachDbFilename parameter is set to an absolute path, which points to the wrong file location.
It's important to know, that the database .mdf file itself will be copied to the build target folder on every build by default or, if configured to Copy if newer using the file Property Explorer, only if the file version has changed (it is recommended to use Copy if newer to prevent the database from being overwritten on every build).
To fix the issue, the AttachDbFilename parameter should point to the current execution folder. It's best to use the Visual Studio environment variable |DataDirectory| to define the relative path.
A fixed connection string could look as follows:
"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MyDatabase.mdf;Integrated Security=True;Asynchronous Processing=True;User Instance=False;Context Connection=False"
check your web-config file, there may be more than one connection string having same name
Please check the path for your database on the connection string. I have the same error message and I later found out that the problem is a misspelled path.
I've been trying mdf portability in my application, so I've been using
public DbContext IoDatabase()
{
var directory = System.IO.Directory.GetCurrentDirectory();
var connectionString = #"Data Source=(localdb)\mssqllocaldb;AttachDbFilename=" + directory + "\\App_Data\\ITIS.mdf;Integrated Security=True;Connect Timeout=30;";
return new NerdDinners(connectionString);
}
with nerdDinners, I can't remember where I found it, being
public class NerdDinners : DbContext
{
public NerdDinners(string connString)
{
Database.Connection.ConnectionString = connString;
}
}
Then I can use the return type as a DbContext.
The main thing I ran into was that GetCurrentDirectory() gets the compiled file path, not the project file path, so deployment should be set to GetCurrentDirectory and the mdf should be copied on compile, not reference the actual App_Data. Include your mdf in your project and go properties on it. Set the copy to output directory.
I had the same problem with EF. The absolute path solution worked. But it is not a nice solution if you want to move your program to a new location. For me this was the problem.
VS searches the mdf file in the debug folder
There is an .mdf file in the project folder, sometime VS sync the two
files
For some reason the .mdf file was not synced into Debug
My workaround:
Copy the .mdf and .ldf file to a temp folder
Make a connection for it in vs/server explorer
When you add the ADO.NET use the new connection
VS offers to copy the .mdf file into the project folder, accept it
Now the .mdf file will appear in the debug folder as well
Delete the connection for the temp folder, create a new one to the project
folder
Just change your path with a new location.
How you will get a path?
Go to database >right click > go to the property > on right-side panel data source is there, copy that data source location and update into a web.config file (the only path has to take care and to look for in the AttachDbFilename in the database).
Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\manish_data\project_practice\sqlbasedprojects\sqlbasedproject\realease\mainproject\App_Data\cruddatabase.mdf;
I also got the same error and I fixed the following (I use Visual Studio 2019):
Click to Debug > [project name] debug properties, select the build item in the left sidebar. On the right sidebar, navigate to the output path entry and change bin\debug to .\
Error was fixed for me after I changed this
ConfigurationManager.ConnectionStrings[0].ConnectionString
to this
ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString
I have changed the installation folder from program files to C directory while I am installing the app. then my problem is solved
well I think reason is that in your database directory, contains a .mdf file which has the same name. So best thing is to give the full path you can just replace the AttachDbFilename. just simply get the fullpath of the database file and assign it into the AttachDbFilename which is in app.config file.
In most cases, the unit test project is separated from the main project.
This causes the generated connection string to be invalid as it fails to find an app_data folder, if your db is local to the solution.
You can just replace the |DataDirectory| with a relative path to your db in your main project if you need to connect to it from your unit test project.
what I've found so far to solve the problem, if you create mdf file in the below way, it would work just fine for visual studio.
Right-click on the data connection in the server Explorar->add connection->Select Microsoft SQL Server Database File and choose database name and select okay. Then this prob doesn't arise.
Follow the video:
youtube link
Looks like there are lots of causes for this...Here was mine.
The clue was on the last line of the error message...
System.Data.SqlClient.SqlException: 'An attempt to attach an
auto-named database for file Q:\Folder\FileName.mdf failed. A database
with the same name exists, or specified file cannot be opened, or it
is located on UNC share.'
...or it is located on UNC share.
In trying to replicate a production environment...
I originally had physical drive Q:. After my dev machine tanked..I rebuilt and just created a mapped drive.
Started getting this error...and then went back and just created another Q: partition and the problem was solved.
I had a similar problem after i moved my db to a folder within the same project.
All i had to do finally was to to properties of the database, copy the path listed under 'identity' and replaced the path at 'AttachDbFilename='.
Worked just fine.
Try this, it works for me
try {
String ConnectionString = #"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\App_Data\Test.mdf;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True";
SqlConnection connection = new SqlConnection(ConnectionString);
connection.Open();
MessageBox.Show("Connection is opened.!!");
connection.Close();
} catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
TLDR: May need to make the change as mentioned by HasanG in multiple files, such as App.config and Settings.Designer in my case.
To add on to HasanG's answer, there may be multiple locations that you need to change the path for your ConnectionString. In my case, I wasn't getting data persistence between two runs of the debugger and changing the ConnectionString defined in my Settings.Designer file fixed this. However, after closing and re-opening Visual Studio and running the debugger again I found that I wasn't getting persistence after Visual Studio was closing. I would either end up with an empty DataGridView or would get an error at build-time stating the following:
*An attempt to attach an auto-named database for file <database file path in debug folder> failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.*
I then searched my entire project solution for instances of that file path and found that it was also being used in the App.config file. Once I changed the path in that file as well as in the Settings.Designer file I was able to have data persistence in my DataGridView between multiple runs of the debugger, and across multiple runs of Visual Studio itself. Hope this helps someone! I pulled out a lot of hair over this one.
EDIT: Make that three files, the Settings.Settings file had to be updated as well.
In .net core 5 for create Db.mdf file in Data folder :
connection string in appsettings.json :
"DefaultConnection": "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=projectPath\\Data\\Db.mdf;Integrated Security=True;Connect Timeout=30"
options.UseSqlServer in startup.cs :
var projectPath = Directory.GetCurrentDirectory();
services.AddDbContext(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection").Replace("projectPath", projectPath)));
I had the same problem,and i think i figured it out.in the connection string make sure that the connection string looks like this:
<connectionStrings>
<add name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|\aspnetdb.mdf;
User Instance=true"
providerName="System.Data.SqlClient" />
<add
name="NorthwindConnectionString1"
connectionString="Data Source=localhost;
Initial Catalog=Northwind;
Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
Now, the first
<add
name="ApplicationServices"
connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|\aspnetdb.mdf;
User Instance=true"
providerName="System.Data.SqlClient" />
is what appears by default in the web.config. Leave it unchanged,and add another connectionstring
<add
name="NorthwindConnectionString1"
connectionString="Data Source=localhost;
Initial Catalog=Northwind;
Integrated Security=True"
providerName="System.Data.SqlClient" />
with your parameters. This is working for me. Hope it helps.

Windows form project is not showing any data from my embedded MS Access DB after installation

I am a beginner and I want to use MS Access DB inside my Windows form Project. My mdb file is showing data when I run it in debug mode. Once I create an exe and install it, it is not showing any data. The database is not password protected.
In App.config this is the connection string
<connectionStrings>
<add name="dbConnectionString"
connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\mydb.mdb" providerName="System.Data.OleDb" />
</connectionStrings>
I assume that when you use "Data Source=|DataDirectory|" install & run the application,for example it looks for DB in C:\MyApp\Data\ folder. It should be C:\MyApp without additional \Data folder.
You need to call the AppDomain.SetData method to specify where the |DataDirectory| points to
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
string relative = #"..\..\App_Data\";
string absolute = Path.GetFullPath(Path.Combine(baseDirectory, relative));
AppDomain.CurrentDomain.SetData("DataDirectory", absolute);
I had to add the .mdb file in my setup project.

C# ConfigurationManager retrieves wrong connection string from app.config

I have a simple WinForms app that will eventually be a game. Right now, I'm just working on the data access layer of it and I've run into a snag. I created a separate project called DataAccess and inside of that, I created a local .mdf SQL Server database file. I also created an app.config file to store the connections string.
Here's that config file:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="TBG_Master"
connectionString="Data Source=(localdb)\MSSQLLocalDb;Integrated Security=true;AttachDbFileName=|DataDirectory|\TBG_Master.mdf"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
To retrieve the connection string from the app.config file I am using code pulled from this question.
Assembly service = Assembly.GetExecutingAssembly();
ConnectionStringsSection css = ConfigurationManager.OpenExeConfiguration(service.Location).ConnectionStrings;
string cs = css.ConnectionStrings["TBG_Master"].ConnectionString;
return cs;
When it gets to the line where it pulls the connection string using the string as the key, it gives me a null reference exception. After examining the css.ConnectionString collection, the only connection string it has in it looks like this:
data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true
This is clearly not what it is in my app.config file, and I know there is no other app.config file in my DataAccess project. Also after debugging, I know for a fact that it is looking in the right assembly.
Why is it giving me this connection string and not the correct one?
As #Amy pointed out, the reason this was not working was because the connection string was not stored in the executing assemblies app.config file. After moving it, it now works as it should. Thank you for the quick help :)
You can also use the machine.config file to hold connection strings that are independent of any application for a given machine. That way they don't have to be in any app.config file, because all applications automatically read the machine.config file on the machine they are executing on.

Where to put EF Connection String?

I am working on a project with plugin architecture in VB.NET. I have two projects: PublicInterfaces which includes my IPlugin interface and some other codes which will be shared on other projects, and DemoApp which has a reference to PublicInterfaces's assembly.
My Data model is and edmx file is located in PublicInterfaces, but in run-time, it gives me an error like this:
No connection string named 'HRMSApplicationEntities' could be found in the application config file.
while my App.config File of PublicInterfaces contains it!
<connectionStrings>
<add name="HRMSApplicationEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=HRMSApplication;user id=sa;password=Hamckerma;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
But the strange thing is when I put this into DemoApp's App.config file, IT WORKS WITH NO ERRORS!
Where should I put the connection string?
When you build DemoApp, you will have DemoApp.exe.config in debug/release folder, which is the application's configuration file.
DemoApp and every referenced dll (including PublicInterfaces.dll) will look in this configuration file. So you only need to add connection string in DemoApp's App.config file and it should work fine.

Categories

Resources