views:

217

answers:

2
+2  Q: 

LINQ Database

I have a system that supports multiple products. Each product has its own database with the same exact schema.

When I pass in the connection string as a parameter to my Data Context constructor it always uses the default database listed in the connection string, or the default database of the user connecting if I do not provide an Initial Catalog in the connection string.

I would like to be able to have the system utilize a database without having to change the connection string and by passing in the database name as a parameter.

Here is an example of the code I am using:

class Program
    {
        static void Main(string[] args)
        {
            var d = new Data("Data Source=(LOCAL);Initial Catalog=Database1;Integrated Security=true;");

            var d1 = new Data("Data Source=(LOCAL);Initial Catalog=Database2;Integrated Security=true;");

            Console.ReadLine();
        }
    }

    internal class Data
    {
        public Data(string connection)
        {

            using (var ctx = new DataClassDataContext(connection))
            {
                var query = from c in ctx.MyTable select c;
                try
                {
                    Console.WriteLine(query.Count());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }



            }
        }
    }

If this code gets executed, then the first result will pull from Database1 and the second result will pull from Database2. I would like it to have the ability to pull from a database that is not provided in the connection string. The reason for this is because the database could change based on a specific scenario but the connection string will remain the same.

Here is an example of what I am using to "fake" it, but I don't really think this is the best solution for this:

class oConnection
    {
        public string Server { get; set; }
        public string Database { get; set; }
        public bool IntegratedSecurity { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var d = new Data(new oConnection
                                 {
                                     Database = "Database1",
                                     Server = "(Local)",
                                     IntegratedSecurity = true
                                 });

            var d1 = new Data(new oConnection
                                  {
                                      Database = "Database2",
                                      Server = "(Local)",
                                      IntegratedSecurity = true
                                  });
            Console.ReadLine();
        }
    }

    internal class Data
    {
        private static string BuildConnection(oConnection connection)
        {
            var sb = new StringBuilder();
            sb.Append("Data Source=" + connection.Server + ";Initial Catalog=" + connection.Database + ";");
            if(connection.IntegratedSecurity)
            {
                sb.Append("Integrated Security=true;");
            }
            else
            {
                sb.Append("user id=" + connection.UserName + ";password=" + connection.Password);
            }
            return sb.ToString();
        }

        public Data(oConnection connection)
        {

            using (var ctx = new DataClassDataContext(BuildConnection(connection)))
            {
                var query = from c in ctx.MyTable select c;
                try
                {
                    Console.WriteLine(query.Count());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

Another note: the goal of this is really to be able to support not having multiple different connection strings when running queries that will span across multiple databases. For example: If I want to query the account records from a database and then query some sort of lookup data from another database, I would have to create a new connection string for the context.

Any help would be appreciated. Thanks

A: 

you can use the SqlConnectionStringBuilder class

Oscar Cabrero
Isn't this kind of what I am doing in my second example of code?
Jason Heine
No, you're not using SqlConnectionStringBuilder, you're building it yourself. Reuse what the framework gives you.
Mystere Man
Ahh okay, I see what you are talking about. Thanks!
Jason Heine
+3  A: 

Use the constructor that receives System.Data.IDbConnection connection. You can use the same connection string, and call connection.ChangeDatabase("mydb") before passing it to the constructor. Alternatively you can add a new constructor on the partial class, so the calling call doesn't has to deal with that.

eglasius
Ahh, this is also what I was looking for. Thanks a million!
Jason Heine