In this article, we are going to see, step by step, how we can connect to SQL Server from a Visual C++ program using an ODBC connection.
Prior to start reading, if you are really interested in learning Programming, then you should definitely check my 6-hour online course, “Introduction to Computer Programming for Beginners“. My course can help to easily get started with the basics of Programming, as well as with the following 6 interesting Programming/Scripting Languages: C, C++, C#, Java, Python and SQL.
Great! Let’s begin this interesting tutorial!
Creating an Empty Visual C++ Win32 Console Application
We start this journey, by first creating an empty Visual C++ Win32 Console Application in Visual Studio, by following the below steps:
Step 1: Let’s start a new project in Visual Studio:
Step 2: Create a new Visual C++ – Win32 Console Application.
Step 3: Click on the “Finish” button to start the project.
Including the Proper Libraries in your Visual C++ Project
Now it’s the time to include the proper libraries to your new C++ project in visual studio. Here’s how:
Step 4: Add the following code before the int main() function:
#include "stdafx.h" //include the below additional libraries #include <iostream> #include <windows.h> #include <sqlext.h> #include <sqltypes.h> #include <sql.h> //use the std namespace using namespace std;
Note that #include “stdafx.h” is automatically added by the project wizard.
Learn how you can efficiently work with SQL Server databases, via the Python Programming Language!
Enroll to our online course: Working with Python on Windows and SQL Server Databases.
This helps you learn how to access and work with SQL Server databases, directly from your Python programs, by teaching you how to perform all the major database development operations from within your Python code.
Writing the Main Logic of your Visual C++ Program
Now, let’s implement the proper logic, by including the below code in the “main” function:
Step 5: Replace your int main() function with the below code, modify the connection string, T-SQL query, variables, etc. accordingly and then build the solution (press F6 or click on Build–Build solution).
int main() { #define SQL_RESULT_LEN 240 #define SQL_RETURN_CODE_LEN 1000 //define handles and variables SQLHANDLE sqlConnHandle; SQLHANDLE sqlStmtHandle; SQLHANDLE sqlEnvHandle; SQLWCHAR retconstring[SQL_RETURN_CODE_LEN]; //initializations sqlConnHandle = NULL; sqlStmtHandle = NULL; //allocations if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlEnvHandle)) goto COMPLETED; if (SQL_SUCCESS != SQLSetEnvAttr(sqlEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) goto COMPLETED; if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, sqlEnvHandle, &sqlConnHandle)) goto COMPLETED; //output cout << "Attempting connection to SQL Server..."; cout << "\n"; //connect to SQL Server //I am using a trusted connection and port 14808 //it does not matter if you are using default or named instance //just make sure you define the server name and the port //You have the option to use a username/password instead of a trusted connection //but is more secure to use a trusted connection switch (SQLDriverConnect(sqlConnHandle, NULL, //(SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=master;UID=username;PWD=password;", (SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=master;Trusted=true;", SQL_NTS, retconstring, 1024, NULL, SQL_DRIVER_NOPROMPT)) { case SQL_SUCCESS: cout << "Successfully connected to SQL Server"; cout << "\n"; break; case SQL_SUCCESS_WITH_INFO: cout << "Successfully connected to SQL Server"; cout << "\n"; break; case SQL_INVALID_HANDLE: cout << "Could not connect to SQL Server"; cout << "\n"; goto COMPLETED; case SQL_ERROR: cout << "Could not connect to SQL Server"; cout << "\n"; goto COMPLETED; default: break; } //if there is a problem connecting then exit application if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, sqlConnHandle, &sqlStmtHandle)) goto COMPLETED; //output cout << "\n"; cout << "Executing T-SQL query..."; cout << "\n"; //if there is a problem executing the query then exit application //else display query result if (SQL_SUCCESS != SQLExecDirect(sqlStmtHandle, (SQLWCHAR*)L"SELECT @@VERSION", SQL_NTS)) { cout << "Error querying SQL Server"; cout << "\n"; goto COMPLETED; } else { //declare output variable and pointer SQLCHAR sqlVersion[SQL_RESULT_LEN]; SQLINTEGER ptrSqlVersion; while (SQLFetch(sqlStmtHandle) == SQL_SUCCESS) { SQLGetData(sqlStmtHandle, 1, SQL_CHAR, sqlVersion, SQL_RESULT_LEN, &ptrSqlVersion); //display query result cout << "\nQuery Result:\n\n"; cout << sqlVersion << endl; } } //close connection and free resources COMPLETED: SQLFreeHandle(SQL_HANDLE_STMT, sqlStmtHandle); SQLDisconnect(sqlConnHandle); SQLFreeHandle(SQL_HANDLE_DBC, sqlConnHandle); SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle); //pause the console window - exit when key is pressed cout << "\nPress any key to exit..."; getchar(); }
About the Connection Strings
As you can see, in the above code, I have specified the connection string as below:
(SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=master;Trusted=true;",
With the above connection string, I’m attempting a trusted connection to SQL Server on localhost, port 1433. Also, note that by the time I am using SQLWCHAR I need to insert an L prior to the connection string value.
Furthermore, note that it doesn’t matter if you are trying to connect to a default or named instance of SQL Server. Just make sure you define the server name and the port number.
Also, if you want to connect to SQL Server using a username/password instead of a trusted connection, you can use a connection string like the below:
(SQLWCHAR*)L"DRIVER={SQL Server};SERVER=localhost, 1433;DATABASE=master;UID=username;PWD=password;",
*Note: It is recommended to prefer trusted connections to SQL Server for better security.
Program Output – Successful Connection to SQL Server
The last screenshot illustrates the output when running the application. As you can see in the code, I’m executing the query:
SELECT @@VERSION
Here’s the output:
Watch the Video Lecture!
Enroll to the Online Course
Concluding Remarks
This was a simple example on how you can connect to SQL Server from Visual C++ and run a simple query.
You can easily modify this code in order to suit your needs.
If you want to see an example of retrieving more than one column using queries against SQL Server, you can find more information in this MS Docs article.
Learn Programming From Scratch – Enroll to our Online Course!
Check our online course “Introduction to Computer Programming for Beginners”
Throughout the course, you will learn everything you need to get started with Computer Programming!
The course is being constantly updated with new educational material.
Featured Online Courses:
- AI Essentials: A Beginner’s Guide to Artificial Intelligence [New]
- SQL Server 2022: What’s New – New and Enhanced Features
- Data Management for Beginners – Main Principles
- Introduction to Azure Database for MySQL
- Working with Python on Windows and SQL Server Databases
- Boost SQL Server Database Performance with In-Memory OLTP
- Introduction to Azure SQL Database for Beginners
- Essential SQL Server Administration Tips
- SQL Server Fundamentals – SQL Database for Beginners
- Essential SQL Server Development Tips for SQL Developers
- Introduction to Computer Programming for Beginners
- .NET Programming for Beginners – Windows Forms with C#
- SQL Server 2019: What’s New – New and Enhanced Features
- Entity Framework: Getting Started – Complete Beginners Guide
- A Guide on How to Start and Monetize a Successful Blog
- Data Management for Beginners – Main Principles
Read Also:
- Announcing the Arrival of “AI Essentials: A Beginner’s Guide to Artificial Intelligence”
- Working with Python on Windows and SQL Server Databases (Course Preview)
- What is Abstraction in Object Oriented Programming?
- How to Write to a Text File from a C++ Program
- How to Establish a Simple Connection from a C# Program to SQL Server
- The timeout period elapsed prior to obtaining a connection from the pool
- Closing a C# Application (including hidden forms)
- Changing the startup form in a C# project
- Using the C# SqlParameter Object for Writing More Secure Code
- Cannot implicitly convert type ‘string’ to ‘System.Windows.Forms.DataGridViewTextBoxColumn
- Using the C# SqlParameter Object for Writing More Secure Code
- How to Build a Simple Image Viewer with .NET WinForms and C# in Visual Studio
Subscribe to our newsletter and stay up to date!
Subscribe to our YouTube channel (SQLNetHub TV)
Easily generate snippets with Snippets Generator!
Secure your databases using DBA Security Advisor!
Generate dynamic T-SQL scripts with Dynamic SQL Generator!
Check our latest software releases!
Check our eBooks!
Rate this article:
Reference: SQLNetHub.com (https://www.sqlnethub.com)
© SQLNetHub
Artemakis Artemiou, a distinguished Senior Database and Software Architect, brings over 20 years of expertise to the IT industry. A Certified Database, Cloud, and AI professional, he earned the Microsoft Data Platform MVP title for nine consecutive years (2009-2018). As the founder of SQLNetHub and GnoelixiAI Hub, Artemakis is dedicated to sharing his knowledge and democratizing education on various fields such as: Databases, Cloud, AI, and Software Development. His commitment to simplicity and knowledge sharing defines his impactful presence in the tech community.