Determine whether I have a valid connection to a SQL database

I have the following code which attempts to create a query and recordset to determine whether the parameters in a form for ServerName and dbName are valid:

strDriver = "SQL Server Native Client 11.0"
cnn = "ODBC;DRIVER=" & strDriver & ";SERVER=" & ServerName _
    & ";Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=" & ServerName _
    & ";DATABASE=" & DBName & "; "
Set db = CurrentDb
Set qdf = db.CreateQueryDef("")
qdf.Connect = cnn
qdf.ReturnsRecords = True
qdf.SQL = "SELECT top 1 dbo.SomeTableName. * from dbo.SomeTableName"
Set rs = qdf.OpenRecordset()

Open in new window

This code bombs out on the line that starts: SET rs =

With an error that reads:

 3151         ODBC--connection to 'SQL Server Native Client 11.0ServerName' failed.

But if I copy the connection string generated above:
ODBC;DRIVER=SQL Server Native Client 11.0;SERVER=ServerName;Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=ServerName;DATABASE=dbName;

Open in new window

and create a new pass-through query with identical SQL string, it returns the 1 record I'm looking for, so the connection is valid, but I keep getting this error message.

Any ideas what I might be doing wrong?
LVL 54
Dale FyeOwner, Dev-Soln LLCAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Scott McDaniel (Microsoft Access MVP - EE MVE )Infotrakker SoftwareCommented:
What's the reasoning for creating a QueryDef and then opening the Recordset? In other words - why not just open the Recordset directly:

strDriver = "SQL Server Native Client 11.0"
cnn = "ODBC;DRIVER=" & strDriver & ";SERVER=" & ServerName _
    & ";Trusted_Connection=Yes;APP=Microsoft Office 2003;WSID=" & ServerName _
    & ";DATABASE=" & DBName & "; "
Dim rs As New ADODB.Recordset
rs.Open "Your SQL", cnn
Dale FyeOwner, Dev-Soln LLCAuthor Commented:

Guess I'm just used to working with DAO, and rarely use ADO.  I'll give that a try.

Dale FyeOwner, Dev-Soln LLCAuthor Commented:

I'm getting an error:

-2147467259   [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

But with the exact same SQL string with is assigned to the linked tables
CompTIA Network+

Prepare for the CompTIA Network+ exam by learning how to troubleshoot, configure, and manage both wired and wireless networks.

Scott McDaniel (Microsoft Access MVP - EE MVE )Infotrakker SoftwareCommented:
Try a different connection string:


REfer to here for more info on strings:
Éric MoreauSenior .Net ConsultantCommented:
what do you have in your ServerName  and DBName variable? what if you do Msgbox(cnn)? Do you see a valid connection string?
I tried your code with DSN like following and worked. (A2003)

Olaf DoschkeSoftware DeveloperCommented:
qdf is created in CurrentDb, and then you set a connstring? To the same database? Another? Forget this, if it is normal, I don't work much with Access, but it seems odd to root a querydefinition in some database and then impose a new connection on it.

Bye, Olaf.
Dale FyeOwner, Dev-Soln LLCAuthor Commented:
OK, so this is really strange.  Assume:

ServerName = "XXX"
DBName = "YYY"

I found that if I construct my connection string dynamically at runtime (lines 1&2) below, I get an error message on the rs.Open line below.  But if I define the connection string as depicted in lines 3&4, the recordset opens properly.  Anybody have any ideas?
'   strConn = "DRIVER={SQL Server Native Client 11.0};" _
            & "SERVER=" & ServerName & ";DATABASE=" & DBName & ";Trusted_Connection=Yes;"
    strConn = "DRIVER={SQL Server Native Client 11.0};" _
            & "SERVER=XXX;DATABASE=YYY;Trusted_Connection=Yes;"

    Dim rs As New ADODB.Recordset
    rs.Open "SELECT COUNT(*) as RecCount FROM SomeTable", strConn

Open in new window

Prior to running this segment of code, I get the ServerName and dbName from the registry, use the NZ() function to give them a default value and then TRIM() the values to make certain that the strings don't contain any extraneous characters.  

When I print the connection strings, they are identical but the first returns the error:

-2147217843   [Microsoft][SQL Server Native Client 11.0][SQL Server]Cannot open database "YYY" requested by the login. The login failed.
Dale FyeOwner, Dev-Soln LLCAuthor Commented:
I'm an idiot, or I need better glasses.

The dbName variable contained an underscore instead of a hyphen in one character and I kept missing it when I looked at the error message and the connection strings when printed, one above the other.

Thanks all, for you help and recommendations.  I actually prefer the ADO method you show above Scott, over the querydef method I've used in the past.

Éric MoreauSenior .Net ConsultantCommented:
so my comments in ID 41730391 were on the spot!

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Scott McDaniel (Microsoft Access MVP - EE MVE )Infotrakker SoftwareCommented:
I'm an idiot, or I need better glasses.
I always blame it on the glasses!!

Glad you got it sorted. I much prefer to use the ADO method when working with SQL Server (or any other server database, for that matter).
Olaf DoschkeSoftware DeveloperCommented:
Indeed. But it shows you better compare good vs bad connection string programmatically...

Bye, Olaf.
Dale FyeOwner, Dev-Soln LLCAuthor Commented:
Thanks, guys
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Microsoft Access

From novice to tech pro — start learning today.