Click here to Skip to main content
Email Password   helpLost your password?

Sample Image - MSDE-GUI.jpg

Introduction

If you've upgraded to Visual Studio .NET, you may not be aware that you have a database server on your hard drive. If you go to <rootdir>/FrameworkSDK/Samples/Setup/msde, there you will find a file called InstallMSDE.exe, which installs the Microsoft SQL Server Desktop Edition. This is basically SQL Server 2000, but designed to work with no more than 5 concurrent users. As far as I can see, the point of this is to allow you as a developer to write code that utilises SQL Server, and then create a product for which your customer will need to buy SQL Server, without your having to make any changes. This is somewhat similar to Oracle, who give their full product away to developers to encourage use of their product.

There's always a catch

Having a database product is all well and good, but sadly MSDE does not come with any GUI tools. If you're a beginner, it can be somewhat worrying to write code and to have only your code's return values to tell you if your database looks the way you expected. Additionally, when you're learning SQL or writing a query that is not simple, you're likely to want to be able to do it in a test environment first. Enter MSDEGUI. This program was my first using ADO.NET, and was written for exactly this reason - as I develop a product with MSDE as my database during development, it really is untenable that I am not able to check on the state of my data. Along the way I learned some ADO.NET (which was the point, after all), which I will share with you as I explain the program.

OleDb vs. Sql

Throughout I am using items with names like SqlConnection, SqlCommand, etc. If you want to use another database, all these objects have equivelents prefixed with OleDb instead of Sql, but as I wrote this to use with MSDE, I used the versions optimised for it.

Why not plug yourself in?

The first thing we need to do is connect to our database. Not surprisingly, the object to do this is called an SqlConnection, and we do it like this:

m_conn = new SqlConnection(sConnection);

try
{
    m_conn.Open();
}
catch(OleDbException e)
{
    MessageBox.Show(e.Message);
    return;
}

Our GUI accepts the a connection string and a database location, the first is used to connect via ADO.NET, the second to connect via SQLDMO. Note that unless both connections work, the program will report failure. This is also a change from the last version, we no longer build the connection string, although defaults are presented in the login dialog.

Listing databases and tables

With some help from fellow CPians, I was able to make the GUI list all databases on the current server with this query: select * from master.dbo.SysDatabases. Having populated the combo-box for databases, we populate our other combo, which lists tables in the current database, like this:

ComboBox cb = (ComboBox)sender;

m_conn.ChangeDatabase(cb.Items[cb.SelectedIndex].ToString());

SqlDataAdapter dataAdapter = 
   new SqlDataAdapter("select * from INFORMATION_SCHEMA.TABLES", 
                                                        m_conn);

DataSet ds = new DataSet();
dataAdapter.Fill(ds);

comboTable.Items.Clear();

foreach (DataRow r in ds.Tables["Table"].Rows)
    comboTable.Items.Add(r["TABLE_NAME"].ToString());

The most important point here is the need to call ChangeDatabase on our connection object. Until I worked that out, it went nowhere.

Using the main screen

So on the main screen we're able to enter a connection string, choose a database and select a table. Once we've done this, we get a grid view of the table, and we're able to browse it and make changes. Any changes you make can be reverted with the revert button, or saved to the database with the Apply button.

This magic is done by the DataGrid component. To fill a DataGrid, we pass our query to a DataAdapter, and call it's fill method. The DataSet we passed in will be filled with a view of the data requested, and we simply attach that DataSet to the grid. To get the grid to show the table right away without the need to expand anything, we need to use a syntax that tells it what table to use. It looks like this:

ComboBox cb = (ComboBox)sender;
m_sDBName = cb.Items[cb.SelectedIndex].ToString();
m_sDBFilter = "";
SqlDataAdapter dataAdapter = 
   new SqlDataAdapter("select * from " + m_sDBName, m_conn);

m_dsTables.Clear();
            
dataAdapter.Fill(m_dsTables, m_sDBName);

dgTables.DataSource = m_dsTables.Tables[m_sDBName].DefaultView;

But wait, there's more

The tool also offers an SQL window, filtering (just type your SQL 'where' clause into the bottom edit box and press 'filter'), and saving of data as XML, and also as text in the SQL window. You can press 'view' in the SQL window to alternate between a text window, and a dataGrid. The grid is nicer, and causes the save button to save as XML, but it does not show things like records affected, or the results of multiple queries.

Visual Studio .NET

After writing this article, several people have posted to present alternative tools, or point to the IDE itself as an alternative. I guess it's inevitable that others would have done what I am doing here, but the fact that so many do would seem to indicate the need for a tool on top of what the IDE offers (although the IDE is quite impressive as well). I'm not claiming to be the best, but I am hosted on the best developer site, so that will have to do.

SQLDMO

The other big request was for SQLDMO support. I had no idea what this means, so thanks to all who asked. The tool now uses SQLDMO to offer adding/removing of databases and of logins. I will shortly add manipulation of triggers and of stored procedures as well. In the meantime, the added items are as follows:

In the SQL dialog we have a button called 'Run File'. It causes a file dialog to allow browsing to an SQL file, then it attempts to execute it. I do not see a way to associate an SQLDMO connection with a database, so if your SQL assumes connection to a specific database, the results are likely not going to be what you're looking for, so beware. The code looks like this:

System.IO.StreamReader filSqlScript;
filSqlScript = System.IO.File.OpenText(dlg.FileName);
m_SQLServerDMO.ExecuteImmediate(filSqlScript.ReadToEnd(),
    SQLDMO.SQLDMO_EXEC_TYPE.SQLDMOExec_Default,    null);
filSqlScript.Close();

The main page also has a new button, labelled 'Admin'. This brings up a dialog with two combo-boxes, one labelled databases, the other users. In both cases they have a button to their right, and this will show 'Add' if a string is entered which does not correspond to an existing value in the database, and 'Remove' if the item entered does exist. The SQLDMO connection has a number of collections in it, including Databases and Logins. To remove a Database, we pass in it's name, but for some reason to remove a login we pass it's index. We therefore step through them all (they are 1 indexed, asking for item 0 results in an error), until we find the one that matches and remove it. To add an item we create an instance of the item, fill it's members with the required data, and append it to the collection. Here is the code we use for logins. Note that the password is set by calling a method designed for changing passwords. I will add the ability to change passwords shortly.

private void CreateLogin(string sLogin, string sPassword, string sDefault)
{
    SQLDMO.Login login = new SQLDMO.Login();

        login.Name = sLogin;
    login.Database = sDefault;
    login.SetPassword("", sPassword);

    m_SQLServerDMO.Logins.Add(login);
}

private void OnLoginClick(object sender, System.EventArgs e)
{
    try
    {
        switch(btnLogin.Text)
        {
            case "Delete":

                for(int n = 1; n <= m_SQLServerDMO.Logins.Count; ++n)
                    if (m_SQLServerDMO.Logins.Item(n).Name == comboLogin.Text)
                    {
                        m_SQLServerDMO.Logins.Remove(n);
                        break;
                    }
                comboLogin.Items.Remove(comboLogin.Text);
                comboLogin.Text = "";
                btnLogin.Text = "";
                break;
            case "Add":
                CreateDialog dlg = new CreateDialog(m_SQLServerDMO);

                dlg.ShowDialog();

                if (dlg.bOK)
                {
                    CreateLogin(comboLogin.Text, dlg.m_sPassword, dlg.m_sDefault);
                    comboLogin.Items.Add(comboLogin.Text);
                    btnLogin.Text = "";
                }
                break;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

What's next?

Well, first of all I'm going to check CP, and if no-one has offered articles on the other stuff I use in the SQL window particularly, I'l expand the article to cover that. Otherwise I want to add menu options to speed up creating and dropping tables and databases, and a stored procedure window to make dealing with stored procedures easier. Any other suggestions, let me know.

Disclaimer

Thanks to Jason Henderson for the cool article helper tool, it really helped. No animals were harmed in the making of this article, except the cat, and she deserved it.

History

Version 1.2

Added SQLDMO support, including the ability to execute SQL files from disk, and adding and removing tables and logins.

Version 1.1

Fixed the problem with the hard coded string. You should still change the string to one that suits you, but if it fails it will now bring up the connection dialog.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
Questionmsdegui
dt2929
5:08 17 Aug '07  
great development app!! Can this also be used with non-MSDE databases on servers on a network for example>
GeneralHow to install
JKD_81
4:50 19 Jul '05  
In case anyone asks again, here's what I did. On default, the connection field shows:

Data Source="";Trusted_Connection=true;

Now, assuming you've installed MSDE, right-click on the server icon in your taskbar and select "Open SQL Service Manager." Copy the contents of the Server field; for example "RIG1-76480D0FA." Paste that in between the quotation marks of the string in the connection field like so:

Data Source="RIG1-76480D0FA";Trusted_Connection=true;

Leave the other field as it is "(local)\" and click Test. You should be rewarded with a window that says "Connection Successful."
GeneralProblems Connecting to MSDE
str_test
19:45 28 Jun '05  
Whenever I execute the pre-compiled program that comes in the demo, I have no problems connecting to my MSDE database. Whenever I attempt to compile and use the source - either C# or VB - I get an error message stating "SQL server does not exist or access is denied." Even when I attempt to "lift" a portion of the code for connecting and use the default strings that are used in the demo, I have receive the same error message stated earlier (see sample below). I know a connection is being attempted because my firewall notifies me. I am using SharpDevelop for my IDE. Any inforamtion you can provide will be appreciated. Thanks.

This code below prodeces a message stating "does not exist or access is denied."

private void conn() {
try
{

string conn = "Data Source=\"\";Trusted_Connection=true;";
string datasource = "(local)\\";
SqlConnection sqlConn = new SqlConnection(conn);
sqlConn.Open();
sqlConn.Close();
SQLDMO.SQLServer SQLServerDMO = new SQLDMO.SQLServer();
SQLServerDMO.LoginSecure = true;
SQLServerDMO.Connect(datasource, null, null);
SQLServerDMO.DisConnect();
}
catch(Exception ex)
{
MessageBox.Show("Problem connecting: " + ex.Message);
return;
}

MessageBox.Show("Connection Successful");
}
GeneralRe: Problems Connecting to MSDE
Christian Graus
19:51 28 Jun '05  
str_test wrote: "Data Source=\"\";
Surely you need a machine name here, or a machine name AND a database name ?


Christian Graus - Microsoft MVP - C++
GeneralRe: Problems Connecting to MSDE
str_test
5:46 29 Jun '05  
Even when I attempt to use a string such as this:
string c = @"server=localhost;user id=sa;password=sa;trusted_connection=true;database=MatrixOrders";
for my connection string, I receive the same err message.
GeneralRe: Problems Connecting to MSDE
Christian Graus
12:47 29 Jun '05  
weird. I know that the code as I posted it contains my connection string, which worked. Try modelling yours on that, otherwise, there must be something wrong somewhere else.


Christian Graus - Microsoft MVP - C++
GeneralServer Explorer
Ryan Schreiber
4:31 24 Nov '04  
Nice code demonstration, but could you not have achieved all of this using the Server Explorer -> Data Connections in the VS IDE?
GeneralRe: Server Explorer
Christian Graus
8:57 24 Nov '04  
Apparently Smile


Christian

I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
GeneralThat's all well and good...
Clay McKinney
17:44 24 May '05  
But some of us poor web developers can't afford the VB IDE. So thank you, Christian, for providing this alternative to the "Server Explorer."
GeneralEnterprise manager from Trial
ToAoM
1:52 20 Jan '04  
Another great option for maintaining MSDE databases is installign the SQL Server client tools which come with the SQL Server Enterprise Trial version.

Just download the SQL Server trial from the Microsoft website and choose the option to only install the client tools. These do not expire like the server itself does. Cool
GeneralRe: Enterprise manager from Trial
Brian Delahunty
23:16 28 Jun '04  
ToAoM wrote: These do not expire like the server itself does.
Does the trial EULA allow you to use it after the trial period?

Regards,
Brian Dela Smile

http://www.briandela.com IE 6 required.
http://www.briandela.com/pictures Now with a pictures section Big Grin
http://www.briandela.com/rss/newsrss.xml RSS Feed
GeneralRe: Enterprise manager from Trial
ToAoM
16:31 29 Jun '04  
Never checked, but EULA's aren't legal under Dutch law anyways. You need to accept and sign a EULA before delivery in Holland, or else they are void.

Jesse
Generalhelp
hjain5
23:39 4 Nov '03  
hi all
can u tell me what i need to insert into the 2 text field at the start.
i mean "enter the conn string:" and "enter the data source:"
it says access denied
pls help

GeneralRe: help
Syska
13:03 17 Dec '03  
I have the same problem, in C# when I make the conn myself i write:
SqlConnection myConnection = new SqlConnection("data source=BIGBIB\\MSDE;connection timeout=5;Integrated Security=SSPI;Database=maskinreg");

and it works great, but not when I post it into these 2 fields...

any help????

// ouT
GeneralRe: help
Christian Graus
13:05 17 Dec '03  
From memory, the code actually puts some of the more common bits in for you. Check the source to see, would be my advice.

Christian

I have drunk the cool-aid and found it wan and bitter. - Chris Maunder
GeneralRe: help
Alex Evans
23:03 28 Jul '04  
Did you find the answer? I too, have the same problem and will be glad to get an answer if you have one

Thanks
Alex
Generalhow to install
webber123456
17:16 7 Oct '03  
how is this installed ?Confused

any examples of connection string for newbies ??
GeneralRe: how to install
Guillermo Rivero
20:01 7 Oct '03  
data source=MINE;initial catalog=CopyColor;Persist Security Info='false';Integrated Security='true';

Free your mind...
GeneralWhy not use MS Access Adp file?
Osrald
21:55 1 Oct '03  
I'm just curius why you creaded this tool when access provides anything from modifying table structures to creating stored procedures.........
GeneralRe: Why not use MS Access Adp file?
webber123456
17:18 7 Oct '03  
I have found ADP does not work with MSDE

I cannot get it to view or add stored procedures
GeneralRe: Why not use MS Access Adp file?
Osrald
1:49 8 Oct '03  
Try Searching "Developing Client/Server Solutions with Microsoft Access 2000 Projects" in GOOGLE........Smile
GeneralRe: Why not use MS Access Adp file?
wakewakeup
2:25 6 May '05  
Have you can do it?


Rap
GeneralRe: Why not use MS Access Adp file?
Osrald
16:43 8 May '05  
Ok, I have tested it on MS Access 2002 version SP3. Let me assume that you have already configured MSDE on your machine.

Try this:
By opening MS Access, click on File->New wizard then comes out for creating a new database. Just follow the step by step instructions and you're done.

or

If you have already created a database from another tool, you can also open it on MS Access by clicking File-New and then select Project(Existing Data), from there MS Access gives you an .adp file. You can rename it if you want then click create and Data Link Properties comes out for setting-up connection properties.
GeneralViolates the license agreement.
Anonymous
11:38 22 Sep '03  
The last time I looked at the license Microsoft ships MSDE with it specifically prohibits this type of administration tool.


GeneralRe: Violates the license agreement.
Christian Graus
11:42 22 Sep '03  
Look again - the agreement does not allow the writing of tools that would compete with Access, but does not forbid what I have done here.

Christian

I have drunk the cool-aid and found it wan and bitter. - Chris Maunder


Last Updated 28 Nov 2002 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2010