Sql Express SQL 驱动程序连接C++

Sql express SQL driver connect C++

本文关键字:连接 C++ 驱动程序 SQL Express Sql      更新时间:2023-10-16

大家好,我一直在互联网上寻找如何将C++代码与SQLEXPRESS数据库连接,我已经阅读了一些关于如何连接的线程,但...我不能跟随他们中的任何一个...他们也不是在为我工作。

我不想对数据库使用 MFC 或任何类型的C++方法,我想通过原始编码来完成。

问题:

  1. 可通过Visual Studio和Microsoft SQL连接的数据库服务器工作室,我可以随心所欲地添加或删除表格,我相信数据库照原样,工作正常

  2. C++代码在这里"我正在连接到本地数据库"

  3. 我从其中一个线程中获取了此代码,但无法弄清楚如何执行SQLDriverConnect,

  4. 我在C++很菜鸟...在此基础上添加 SQLEXPRESS...

编辑:

  1. 我不知道连接代码中的那个 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.");
}