My fantastic Webdings Logo

Reamped.NET

XML Thingey... It's a Technical Term


Using Database Projects for Visual Studio

Do you use database projects in Visual Studio? If not, then now is a good time to start. It is the best way I have found to source control my databases without actually sticking the database file itself in the repository. It is very simple to add to your solution and creates a default directory structure for your create scripts, change scripts and queries. Best of all the project will be recognized by source control and added to the source code repository. This means you can keep versioned scripts for maintainability. It also gives you the option to do the dreaded rollback!

 

Lets start by creating a database project of our own. To start, we will create a blank Visual Studio solution.

screenshot-2008-05-05_18_56_00

 

Now click File -> Add -> New Project.

screenshot-2008-05-05_18_57_08

 

You should get the dialog below. Now we will look in the node of "Other Project Types", click "Database" then select "Database Project". This will give us the opportunity to name our database project. We will call this one by the database we are going to be using, good ol' Northwind.

screenshot-2008-05-05_18_58_44

 

Next you will be asked to setup a database reference. So here all we have to do is add a new reference to the Northwind database.

screenshot-2008-05-05_18_59_29

 

My database will be in SQL Server, yours can be in any of the choices shown below.

screenshot-2008-05-05_19_01_31

 

Now we just set the server name and choose the Northwind database.

screenshot-2008-05-05_19_02_07

 

You should then test your connection (out of good practice) and see the dialog below upon success.

screenshot-2008-05-05_19_02_15

 

Now we will see our database reference shown in the original list of references. Just double click on your newly added reference.

screenshot-2008-05-05_19_02_31

 

Now your project should look something like the shot below.

screenshot-2008-05-05_19_02_51

 

Once we get this far, we need to start filling our folders with database scripts. You can add new folders if you wish, but I think the default folder structure is good enough. Now then, we can use the database publishing wizard to get our first create script into the "Create Scripts" folder.

 

Double click the reference to your database in the database references and it should bounce you to the server explorer window with your data connection all setup.

screenshot-2008-05-05_19_05_20

 

Right click your data connection and click "Publish to provider..." to start the database publishing wizard.

screenshot-2008-05-05_19_05_31 

 

Now we select the database we would like to publish, so again I will choose Northwind.

screenshot-2008-05-05_19_05_52

 

Now with the "Script to file" option chosen, we will browse to the "Create Scripts" folder in our database project to put the outputted .sql file.

screenshot-2008-05-05_19_06_51

 

Now we get to choose some options. I am going to set the output for SQL Server 2005 and select to script the database schema only.

screenshot-2008-05-05_19_07_18

 

Now we can review the summary of what we have configured and click finish.

screenshot-2008-05-05_19_07_26

 

Upon clicking finish, we will see the progress of the .sql file being scripted to the hard drive.

screenshot-2008-05-05_19_08_07

 

Ok, for some reason I couldn't find a refresh button in the database project to see the file that was created so we will right click the "Create Scripts" folder and click "Add Existing Item..."

screenshot-2008-05-05_19_10_15

 

Then browse to our .sql file and click the "Add" button.

screenshot-2008-05-05_19_10_27

 

Now we should see it in our project and we can also see the contents of the generated script by opening it in the editor.

screenshot-2008-05-05_19_12_20

screenshot-2008-05-05_19_12_31

 

It really is just that simple. I mean if nothing else you have a designated place to put all your SQL scripts for your database. The big plus is that your scripts will be source controlled. Also, anyone who opens the solution will know exactly which databases are used by the project.

 

Hope this helps!

 

kick it on DotNetKicks.com


Related posts

Comments

Kevin Berridge

I have tried using Visual Studio's database projects as well as Management Studio's database projects but have always been disappointed by both.

Your tutorial on how to set up the solution is great. But I start having problems with it when it comes to keeping it up to date. Here are some of the issues I've had, perhaps you'll have some insight.

Do you update the scripts in the project, or update the database objects directly?
Do you simply regenerate the scripts every time the database changes?
How do you handle "shared database objects" which are likely to be used in many different databases?



Ira

Well, I can only speak for myself but the answers to your questions are as follows:

Do you update the scripts in the project, or update the database objects directly?
I update the scripts in my database project and use those scripts to update my database. Then commit the scripts to version control.

Do you simply regenerate the scripts every time the database changes?
Not EVERY time, but in a timely fashion as the database evolves. You should also be using backup tools in SQL as well so you can recover without the scripts. However if you are using a deployable packaged project, your create scripts should be updated by the end of your changes.

How do you handle "shared database objects" which are likely to be used in many different databases?
Shared objects can get tricky. I add a reference to all databases that my project involves. I also create some documentation files in the database project outlining the shared objects and how they are used.

Hope this helps.



Jeff Garoutte

It is worth noting that you can also right click on a table, view, stored proedure or function and select "Generate Create Script to Project" from the server explorer in visual studio once you have a database project in the solution.

The script will be named <database>.<owner>.<objectname>.sql in the create scripts folder (for example Northwind.dbo.Employess.sql).

You can select multipule objects and it will generate them in a file called script<number>,sql.

I often generate a script for each object, this allows me to edit it without wading in 10,000 lines of SQL looking for a view that I need to add a column too. It also gives me a clear view of what changed and when in source control.

It takes longer to step up an exisiting database this way, but when starting a new database there is not much difference in speed.

Often I find myself creating a "generate all" script for an exisitng database and the smaller "one object" file as needed.

The fact that you can change the projects database reference or right click a script and select "run on" makes setting up a "temp" testing database a breeze



Will Asrari

<3 DB projects

@Ira: Right-click a stored procedure > 'Run On' > Select instance of SQL.



Ira

@Will: Thanks for the tip!



VB

Better use Microsoft SQL Server Management Studio. It has the same level of Source Control support but gives you much more tools to work with your database. There is also a very handy script - "Script table data" in the CodeSmith. I use it very often when I need to script lookup table data.



Simone

Did you ever try rikmigration or any other "rake:db" style DB versioning tool?



Ira

Did you ever try rikmigration or any other "rake:db" style DB versioning tool?
No, I have only tried the tools available to me within Visual Studio and Management Studio. I will have a look into it though.



pingback

Pingback from alvinashcraft.com

Dew Drop - May 8, 2008 | Alvin Ashcraft's Morning Dew



Mattias Andersson

I have spent some time reading all posts and I still don't see how I get a changed script or stored procedure in the project to get stored in the actual database. Is there a way of doing this from within the IDE?



J. P. Piesco

Re: Mattias Andersson | 7/2/2008 3:32:15 AM
To get a changed script processed on the actual database you can use an SQL interface tool which will give you a user interface to run changed script on the actual database. myLittleAdmin for SQL 2005 is a free SQL interface application( www.mylittleadmin.com).
Maybe Helpful?



Richard

Nice overview of Database Projects, one of the few out there.

I'm trying to create and then query from a temp table. Visual Studio seems to use a connection that drops with each round trip. the create statement works, but the second select statement fails because the temp table no longer exists.

Have you run into this? Any confirmation or suggestions?

Thanks again, Richard



Ira

Thanks for the compliments Richard.

I have not run into that problem myself, but the connection re-setting and the scope being dropped would be a probable cause to your problem. I run into little things here or there with DB projects that make me pop over to Management Studio. But anything you do in Management Studio can easily be saved into the DB project for source control storage.

Sorry about not having a better solution, but it is what I use to get around it.



Kay

Useful post, thanks.

Anyone know how to go the other way with multiple scripts? i.e. I have a folder in source control with all the objects scripted to separate files and would like to execute them against the same database without having to do each one seperately



Mehdi Anis

I am using Visual Studio 2005 in my Win XP Pro development PC. Development PC has MS SQL EXPRESS and SQL Server Management Studio Express. I have MS SQL 2005 (Not free express) Server running in different location.

I followed your steps, but I do not see that 'Publish To Provider..." option in that pop-up-menu. Is that only for VS2K8? How to do the same thing in VS2K5?



Add comment


(Will show your Gravatar icon)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]