大家好,我一直在互联网上寻找如何将C++代码与SQLEXPRESS数据库连接,我已经阅读了一些关于如何连接的线程,但...我不能跟随他们中的任何一个...他们也不是在为我工作。
我不想对数据库使用 MFC 或任何类型的C++方法,我想通过原始编码来完成。
问题:
-
可通过Visual Studio和Microsoft SQL连接的数据库服务器工作室,我可以随心所欲地添加或删除表格,我相信数据库照原样,工作正常
-
C++代码在这里"我正在连接到本地数据库"
-
我从其中一个线程中获取了此代码,但无法弄清楚如何执行SQLDriverConnect,
-
我在C++很菜鸟...在此基础上添加 SQLEXPRESS...
编辑:
- 我不知道连接代码中的那个 3055 是什么......
提前感谢您的帮助
数据库信息:
UDL: 这是我从UDL得到的
( Provider=SQLOLEDB.1;Integrated Security=SSPI;
Persist Security Info=False;User ID=sa;Initial Catalog=Holpa;Data Source=AMH )
Microsoft服务器:
Server type: Database Engine
Server name: AMH
Authen: SQL server Authen
Login: sa
password : amh999
VisualStudio:
Data Source=AMH;Initial Catalog=Holpa;User ID=sa;Password=***********
.NET Framework Data Provider for SQL Server
Open
Microsoft SQL Server
Owner sa
在本地计算机上运行。
#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
SQLHANDLE sqlenvhandle = SQL_NULL_HANDLE;
SQLHANDLE sqlconnectionhandle = SQL_NULL_HANDLE;
SQLHANDLE sqlstatementhandle = SQL_NULL_HANDLE;
SQLRETURN retcode;
void show_error(RETCODE rc, SQLHENV hEnv, SQLHDBC hDbc,
SQLHSTMT hStmt, const char *action)
{
SQLWCHAR szMessage[256];
SQLWCHAR szState[6];
SDWORD sdwNative;
SWORD swMsgLen;
SQLError(hEnv, hDbc, hStmt, szState, &sdwNative, szMessage,
sizeof(szMessage), &swMsgLen);
wcout << "wcout MESSAGE: " << szMessage << "n SQLSTATE " << szState << endl;
printf("Error %d performing %sn SQLState=%snSQL message=%sn",rc, action, szState, szMessage);
}
void CloseSQL()
{
SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle);
SQLDisconnect(sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);
SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle);
}
int main()
{
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle))
{
printf("huh n");
CloseSQL();
goto END;
}
if (SQL_SUCCESS != SQLSetEnvAttr(sqlenvhandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
{
printf("huh n");
CloseSQL();
goto END;
}
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle))
{
printf("huh n");
CloseSQL();
goto END;
}
printf("Driver Initialisedn");
SQLWCHAR retconstring[1024];
printf("about to Driver Conneectn");
retcode = SQLDriverConnect(sqlconnectionhandle,
NULL,
(SQLWCHAR*)"DRIVER={SQL Server};SERVER=AMH, 3055;DATABASE=Holpa;UID=sa;PWD=amh999;",
SQL_NTS,
retconstring,
1024,
NULL,
SQL_DRIVER_NOPROMPT);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("Connection maden");
}
else
{
show_error(retcode, sqlenvhandle, sqlconnectionhandle, sqlstatmenthandle, "Connecting.");
}
END:
printf("n");
printf("Program End, press enter key to exit!");
getchar(); // waits for input
return 0;
}
错误:错误代码不是常量...他们不断变化...示例我得到了以下内容:消息: 0022E1ECSQLSTATE: 0022e9f4
重新运行程序消息: 009fdc4cSQLSTATE: 009fe454
重新运行代码消息: 00aadd90SQLSTATE: 00aae598
首先,您需要一个有效的诊断函数:
void show_error(RETCODE rc, SQLHENV hEnv, SQLHDBC hDbc,
SQLHSTMT hStmt, const char *action)
{
char szMessage[256];
char szState[6];
SDWORD sdwNative;
SWORD swMsgLen;
SQLError(hEnv, hDbc, hStmt, szState, &sdwNative, szMessage,
sizeof(szMessage), &swMsgLen);
printf("Error %d performing %sn"
"SQLState=%snSQL message=%sn",
rc, action, szState, szMessage);
}
如果出现任何问题,请调用它,例如:
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("Connection maden");
}
else
{
show_error(retcode, sqlenvhandle, sqlconnectionhandle, sqlstatmenthandle, "Connecting.");
}