ODBC连接Sql Server和VS2019的图书管理系统

应用工具:ODBC数据源、Sql Server、VS2019

关于ODBC的配置和介绍不再赘述,网上教程很多。

好! 直接上源代码。

连接.h
#pragma once
#include<stdio.h>
#include<windows.h>
#include<sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<string.h>
char Account[50], Password[50], a[50], p[50];
SQLRETURN   ret;
SQLHENV    henv;
SQLHDBC    hdbc;
SQLHSTMT  hstmt;
void lianjie()
{
   
	ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境句柄
	ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
	ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄

	ret = SQLConnect(hdbc, (SQLCHAR*)"wb", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"123456", SQL_NTS);
	/*data_test为配置的ODBC数据源名称*/
	if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
	{
   
		printf("连接数据库失败!\n");
	}
	else {
   
		printf("连接数据库成功!\n");
	}                                      /*到这是用odbc连接到数据库,可以用到我们建立的study数据库里的数据了*/
	ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
}
断开连接.h
#pragma once
#include"连接.h"
void duankai() {
   
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄
	SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄
}
main.c
#include"连接.h"
#include"断开连接.h"
#include<stdlib.h>
int main()
{
   
	system("color 70");
	int s;
	printf("*************************************************************\n");
	printf("*************************************************************\n");
	printf("******************欢迎使用图书馆操作软件!********************\n");
	printf("*************************************************************\n");
	printf("*************************************************************\n");
	printf("请输入:\n1:管理员登录\n2:工作人员登录\n3:学生登录\n");
	scanf("%d", &s);
	switch (s)
	{
   
	case 1://系统管理员登录系统模块
	{
   
		lianjie();
		printf("请输入登录账号:\n");
		scanf("%s", Account);
		printf("请输入登录密码:\n");
		scanf("%s", Password);
		SQLCHAR sql3[] = "use study";
		SQLCHAR sql4[] = "select * from admin";
		ret = SQLExecDirect(hstmt, sql3, SQL_NTS);
		ret = SQLExecDirect(hstmt, sql4, SQL_NTS);
		if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
		{
   
			SQLCHAR str1[50], str2[50];
			SQLINTEGER len_str1, len_str2;
			while (SQLFetch(hstmt) != SQL_NO_DATA)
			{
   
				SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &len_str1);   //获取第一列数据
				SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &len_str2);

				for (int i = 0; i < 8; i++)
				{
   
					a[i] = str1[i];
				}
				for (int i = 0; i < 6; i++)
				{
   
					p[i] = str2[i];
				}
				if (strcmp(Account, a) == 0 && strcmp(Password, p) == 0 || strcmp(Account, a) == 0 && strcmp(Password, p) == 0)
				{
   
					printf("登录成功\n");
					int x;
					duankai();
					printf("请输入:\n1:查询图书信息\n2:查询学生信息\n3:查询工作人员信息\n4:增加一条信息\n5:修改一条信息\n6:删除一条信息\n");
					scanf("%d", &x);
					switch (x)
					{
   
					case 1:
					{
    lianjie();
					SQLCHAR sql1[] = {
    "use study" };
					SQLCHAR sql2[] = {
    "select * from book" };

					ret = SQLExecDirect(hstmt, sql1, SQL_NTS);
					ret = SQLExecDirect(hstmt, sql2, SQL_NTS);
					if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
					{
   
						SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50];
						SQLINTEGER len_str1, len_str2, len_str3, len_str4, len_str5;
						while (SQLFetch(hstmt) != SQL_NO_DATA)
						{
   
							SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &len_str1);   //获取第一列数据
							SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &len_str2);
							SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &len_str3);
							SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &len_str4);
							SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &len_str5);
							printf("%s\t%s\t%s\t%s\t%s\t\n", str1, str2, str3, str4, str5);
						}
					}
					}
					duankai(); break;
					case 2:
					{
   
						lianjie();
						SQLCHAR sql1[] = {
    "use study" };
						SQLCHAR sql2[] = {
    "select * from reader" };

						ret = SQLExecDirect(hstmt, sql1, SQL_NTS);
						ret = SQLExecDirect(hstmt, sql2, SQL_NTS);
						if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
						{
   
							SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50];
							SQLINTEGER len_str1, len_str2, len_str3, len_str4, len_str5;
							while (SQLFetch(hstmt) != SQL_NO_DATA)
							{
   
								SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &len_str1);   //获取第一列数据
								SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &len_str2);
								SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &len_str3);
								SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &len_str4);
								SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &len_str5);
								printf("%s\t%s\t%s\t%s\t%s\t\n", str1, str2, str3, str4, str5);
							}
						}
					}duankai(); break;
					case 3:
					{
   
						lianjie();
						SQLCHAR sql1[] = {
    "use study" };
						SQLCHAR sql2[] = {
    "select * from workman" };

						ret = SQLExecDirect(hstmt, sql1, SQL_NTS)
自己写的数据库大作业,用MFC ODBC +access 写的 内含完整工程,解压后就能用 // MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include "ODBCdemo.h" #include "MainFrm.h" #include "BrwMessagedlg.h" #include "ReaderAdmindlg.h" #include "BookUpdatedlg.h" #include "LogIndlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_COMMAND(ID_BCG, OnBcg) ON_COMMAND(IDD_ReaderUpdate, OnReaderUpdate) ON_COMMAND(IDBK_UPDATE, OnBookUpdate) //}}AFX_MSG_MAP END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here m_bAutoMenuEnable=FALSE; } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } if (!m_wndDlgBar.Create(this, IDD_DIALOGBAR, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_DIALOGBAR)) { TRACE0("Failed to create dialogbar\n"); return -1; // fail to create } m_wndDlgBar.EnableDocking(CBRS_ORIENT_HORZ); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndDlgBar); CLogIndlg cdlg; if( cdlg.DoModal()==IDOK) { if(cdlg.role=="读者") { for(int i=0;iGetSubMenu(i)->EnableMenuItem(1,MF_BYPOSITION|MF_GRAYED); } } else Destroy
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T h a t

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值