附源码 C语言期末设计:仓储管理系统
在此提醒:本系统为作者的大学期末课程设计,仅用于学术参考,无法商用,违者后果自负
前言
该仓储管理系统运用了C语言和SQL server2019数据库联合编写,需要同步建立对应的SQL server数据库来存放管理数据,数据库的连接方式采用ODBC数据源连接,该系统分为4大模块,拥有简易的储位查询、物料上下架处理、和报错日志管理,实现最基础的仓储管理
一、C语言连接SQL server2019
1、ODBC连接
ODBC简介:开放数据库连接(Open Database Connectivity,ODBC),主要的功能是提供了一组用于数据库访问的编程接口,其主要的特点是,如果应用程序使用ODBC做数据源,那么这个应用程序与所使用的数据库或数据库引擎是无关的,为应用程序的跨平台和可移植奠定了基础。
创建ODBC数据源:控制面板——管理工具——ODBC数据源(32位)
可以看到,这里存在三种类型的DSN(数据源名),其中:
用户DSN:只允创建该DSN的用户使用该数据源;
系统DSN:所有登陆该服务器的用户都能使用该数据源;
文件DSN:配置信息保存在文件中,所有登陆的用户均可使用;
在本实验中,采用系统DSN:
点击添加,然后选择SQL Server
然后输入数据源的名称和所在服务器,我们的数据库是安装在本机上的。
选择以sql server用户的方式进行验证,下图所示:
这里可以设置默认连接的数据库,保持不变,使用master作为默认的数据库。
然后点击下一步,然后完成。
2、进行数据库的代码处理
1、头文件书写
代码如下(示例):
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<math.h>
#include<conio.h>
#include <iostream>
#include <locale>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#define sno_length 11
#define sname_length 10
#define sdepart_length 30
#define ssex_length 5
2、字符转为宽字符
#pragma region 字符转为宽字符
wchar_t* trstring2wchar(const char* str)
{
int mystringsize = (int)(strlen(str) + 1);
WCHAR* wchart = new wchar_t[mystringsize];
MultiByteToWideChar(CP_ACP, 0, str, -1, wchart, mystringsize);
return wchart;
}
#pragma endregion
3、宽字符转换为字符串
#pragma region 宽字符转换为字符串
void wchar2strstring(string& szDst, WCHAR* wchart)
{
wchar_t* wtext = wchart;
DWORD dwNmu = WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, NULL, 0, NULL, FALSE);
char* psTest;
psTest = new char[dwNmu];
WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, psTest, dwNmu, NULL, FALSE);
szDst = psTest;
delete[]psTest;
}
#pragma endregion
4、错误处理
#pragma region 错误处理
void handleResult(SQLHANDLE hHandle, SQLSMALLINT hType, RETCODE RetCode)
{
SQLSMALLINT iRec = 0;
SQLINTEGER iError;
WCHAR wszMessage[1000];
WCHAR wszState[SQL_SQLSTATE_SIZE + 1];
//处理无效
if (RetCode == SQL_INVALID_HANDLE)
{
fwprintf(stderr, L"Invalid handle!\n");
return;
}
}
#pragma endregion
5、输出错误
#pragma region 输出错误
void error(SQLRETURN err)
{
printf("相关信息输出: ");
switch (err) {
case SQL_SUCCESS:puts("****sql server数据库成功运行*****\n"); break;
case SQL_SUCCESS_WITH_INFO:puts("SQL_SUCCESS_WITH_INFO"); break;
case SQL_ERROR:puts("SQL_ERROR"); break;
case SQL_INVALID_HANDLE:puts("SQL_INVALID_HANDLE"); break;
case SQL_NO_DATA_FOUND:puts("SQL_NO_DATA_FOUND"); break;
case SQL_NEED_DATA:puts("SQL_NEED_DATA"); break;
default:puts("err");
}
}
#pragma endregion
3、进行数据库的创建
1、建立一个名为TEXT的数据库
2、创建4张表来记录数据
二、C语言代码部分书写
1.主函数的写入
代码如下(示例):
#pragma region 主函数
int main()
{
Start();
system("cls");
system("color F");
Passwords();
system("cls");
Sleep(1500);
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境句柄
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄
retcode = SQLConnect(hdbc, (SQLCHAR*)"mytest", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"123456", SQL_NTS);
if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO))
{
printf("连接数据库失败! 程序中止运行!\n");
return -1;
}
else
{
printf("集团数据库连接成功! 欢迎您的使用!\n");
}
system("cls");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄
while (1)
{
int choice;
menu();
printf("请选择功能菜单(0-4): \n");
scanf_s("%d", &choice);
switch (choice)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
StorageTableSelect();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Material();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Error();
break;
}
case 4:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Help();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 您即将退出存储管理系统,感谢您的使用!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
exit(0);
break;
}
}
}
return 0;
}
#pragma endregion
主函数进行了多层次子函数嵌套
2.欢迎界面
代码如下(示例):
#pragma region 欢迎界面
int Start()
{
system(" color 0c");
printf(" 欢迎使用集团仓储管理系统!!!\n");
float x, y, a;//定义变量x,y,a
for (y = 1.5f; y > -1; y -= 0.1f)
{
for (x = -1.5f; x < 1.5f; x += .05f) {
a = x * x + y * y - 1;
putchar(a * a * a - x * x * y * y * y < 0.0f ? 'x' : ' ');
}
Sleep(150);
putchar('\n');
}
return 0;
}
#pragma endregion
3.密码设计界面
代码如下(示例):
#pragma region 密码设计界面
int Passwords()
{
char pwd[10] = { 0 };
int i = 0;
printf("请输入您的密钥:\n");
for (i = 0; i < 3; i++)
{
scanf_s("%s", pwd,10);
if (strcmp(pwd, "123456") == 0)
{
printf("密钥输入正确,登录成功!\n");
break;
}
else
{
printf("密钥输入错误,请重新输入:\n");
}
}
if (3 == i)
{
printf("登录失败,程序退出。\n");
exit(0);
}
system("pause");
return 0;
}
#pragma endregion
4.储位查询界面
代码如下(示例):
#pragma region 储位查询界面
void StorageTableSelect()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char LocNo[101] = { 0 };
printf("请输入您需要查询的LocNo:\n");
scanf_s("%s", LocNo, 101);
char str2[1001] = "select[PPID],[MaterialNo],[ProductionBatch],[Number],[DataOfManufacture],[Supplier],[CreateUser],[CreateTime],[Lncon]from [Bas_Loc]inner join [dbo].[BindBatchSchedule] on [Bas_Loc].ID = [dbo].[BindBatchSchedule].ID where [Lncon] = '";
char str3[50] = "'";
strcat(LocNo, str3);
strcat(str2, LocNo);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50], str7[50], str8[50], str9[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6, sqlLen7, sqlLen8, sqlLen9;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
SQLGetData(hstmt, 7, SQL_C_CHAR, str7, 50, &sqlLen7);
SQLGetData(hstmt, 8, SQL_C_CHAR, str8, 50, &sqlLen8);
SQLGetData(hstmt, 9, SQL_C_CHAR, str9, 50, &sqlLen9);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf("PPID 物料编号 生产批次 数量 生产日期 供应商 收料人 收料时间 储位位置\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4, str5, str6, str7, str8, str9);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
5.物料查询界面
代码如下(示例):
#pragma region 物料查询界面
void Base_Select()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入您需要查询的PPID:\n");
scanf_s("%s", PPID, 101);
char str2[101] = "select * from [BindBatchSchedule] where [PPID] = '";
char str3[50] = "'";
strcat(PPID, str3);
strcat(str2, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50],str5[50],str6[50], str7[50], str8[50], str9[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6, sqlLen7, sqlLen8, sqlLen9;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
SQLGetData(hstmt, 7, SQL_C_CHAR, str7, 50, &sqlLen7);
SQLGetData(hstmt, 8, SQL_C_CHAR, str8, 50, &sqlLen8);
SQLGetData(hstmt, 9, SQL_C_CHAR, str9, 50, &sqlLen9);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf(" PPID 物料编号 生产批次 数量 生产日期 供应商 收料人 收料时间\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4,str5,str6,str7,str8,str9);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
6.物料上架界面
代码如下(示例):
#pragma region 物料上架界面
void MaterialOnShelf()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char LocNo[101] = { 0 };
printf("请输入对应储位号:\n");
scanf_s("%s", LocNo, 101);
char CreateUser[101] = { 0 };
printf("请输入上架人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入上架时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[101] = "insert into [TEXT].[dbo].[Material_in]values ('";
char str3[50] = "','";
char str5[50] = "','";
char str7[50] = "','";
char str9[50] = "','";
char str10[50] = "上架";
char str11[50] = "')";
strcat(str10, str11);
strcat(str9, str10);
strcat(CreateTime, str9);
strcat(str7, CreateTime);
strcat(CreateUser, str7);
strcat(str5, CreateUser);
strcat(LocNo, str5);
strcat(str3, LocNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("物料上架成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("物料上架失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
7.物料下架界面
代码如下(示例):
#pragma region 物料下架界面
void MaterialRemoval()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char LocNo[101] = { 0 };
printf("请输入对应储位号:\n");
scanf_s("%s", LocNo, 101);
char CreateUser[101] = { 0 };
printf("请输入下架人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入下架时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[101] = "insert into [TEXT].[dbo].[Material_in]values ('";
char str3[50] = "','";
char str5[50] = "','";
char str7[50] = "','";
char str9[50] = "','";
char str10[50] = "下架";
char str11[50] = "')";
strcat(str10, str11);
strcat(str9, str10);
strcat(CreateTime, str9);
strcat(str7, CreateTime);
strcat(CreateUser, str7);
strcat(str5, CreateUser);
strcat(LocNo, str5);
strcat(str3, LocNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("物料下架成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("物料下架失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
8.物料收料界面
代码如下(示例):
#pragma region 物料收料界面
void Base_operaMtl()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char MaterialNo[101] = { 0 };
printf("请输入MaterialNo:\n");
scanf_s("%s", MaterialNo, 101);
char ProductionBatch[101] = { 0 };
printf("请输入ProductionBatch:\n");
scanf_s("%s", ProductionBatch, 101);
char Number[101] = { 0 };
printf("请输入Number:\n");
scanf_s("%s", Number, 101);
char DataOfManufacture[101] = { 0 };
printf("请输入DataOfManufacture:\n");
scanf_s("%s", DataOfManufacture, 101);
char Supplier[101] = { 0 };
printf("请输入Supplier:\n");
scanf_s("%s", Supplier, 101);
char CreateUser[101] = { 0 };
printf("请输入收料人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入收料时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[500] = "insert into [BindBatchSchedule] values('";
char str3[500] = "','";
char str5[500] = "','";
char str7[500] = "','";
char str9[500] = "','";
char str11[500] = "','";
char str13[500] = "','";
char str15[500] = "','";
char str17[500] = "')";
strcat(CreateTime, str17);
strcat(str15, CreateTime);
strcat(CreateUser, str15);
strcat(str13, CreateUser);
strcat(Supplier, str13);
strcat(str11, Supplier);
strcat(DataOfManufacture, str11);
strcat(str9, DataOfManufacture);
strcat(Number, str9);
strcat(str7, Number);
strcat(ProductionBatch, str7);
strcat(str5, ProductionBatch);
strcat(MaterialNo, str5);
strcat(str3, MaterialNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("收料成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("收料失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
9.收料主界面
代码如下(示例):
#pragma region 收料主界面
void MaterialFeeding()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【物料处理】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.物料投料 ||\n");
printf("\t\t||* 2.物料查询 ||\n");
printf("\t\t||* 0.返回上一级菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-2): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Base_operaMtl();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Base_Select();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回上一界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
10.物料上下架查询
代码如下(示例):
#pragma region 物料上下架查询
void QueryOfMaterial()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入您需要查询的PPID:\n");
scanf_s("%s", PPID, 101);
char str2[101] = "select * from [TEXT].[dbo].[Material_in] where [PPID] = '";
char str3[50] = "'";
strcat(PPID, str3);
strcat(str2, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf(" PPID 储位号 操作人 操作时间 目前状态\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4, str5, str6);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
11.物料处理主界面
代码如下(示例):
#pragma region 物料处理主界面
void Material()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【物料处理】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.物料收料 ||\n");
printf("\t\t||* 2.物料上架 ||\n");
printf("\t\t||* 3.物料下架 ||\n");
printf("\t\t||* 4.物料上下架查询 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-4): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialFeeding();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialOnShelf();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialRemoval();
break;
}
case 4:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
QueryOfMaterial();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
12.程序主菜单
代码如下(示例):
#pragma region 程序主菜单
void menu(void)
{
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【仓储管理系统】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.储位查询 ||\n");
printf("\t\t||* 2.物料处理 ||\n");
printf("\t\t||* 3.报错日志 ||\n");
printf("\t\t||* 4.程序帮助 ||\n");
printf("\t\t||* 0.退出程序 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
}
#pragma endregion
13.报错日志删除
代码如下(示例):
#pragma region 报错日志删除
void ErrorDelete()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char ErrorId[10] = { 0 };
printf("请输入您需要删除的ErrorId(1-N):\n");
scanf_s("%s", ErrorId, 10);
char str2[101] = "delete from [ErrorLog] where [ErrorID] = '";
char str3[50] = "'";
strcat(ErrorId, str3);
strcat(str2, ErrorId);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("删除成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("删除失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
14.报错日志插入
代码如下(示例):
#pragma region 报错日志插入
void ErrorInsert()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char ErrorBackThings[101] = { 0 };
char ErrorBackName[101] = { 0 };
printf("请输入报错人姓名:\n");
scanf_s("%s", ErrorBackName, 101);
printf("请输入报错事件:\n");
scanf_s("%s", ErrorBackThings, 101);
char str1[101] = "insert into [ErrorLog] values (GETDATE(),'";
char str3[50] = "','";
char str5[50] = "')";
strcat(ErrorBackThings, str5);
strcat(str3, ErrorBackThings);
strcat(ErrorBackName, str3);
strcat(str1, ErrorBackName);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("插入成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("插入失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
15.报错日志查询
代码如下(示例):
#pragma region 报错日志查询
void ErrorSelect()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";//使用名为"TEXT"数据库
SQLCHAR sql2[] = "select * from [dbo].[ErrorLog]";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);//SQLExecDirect,此函数用于执行SQL语句,执行sql1语句
retcode = SQLExecDirect(hstmt, sql2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4;
// SQLLEN len_str1, len_str2, len_str3;
/*SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;*/
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
/*SQLGetData函数的功能是提取结果集中当前记录的某个字段值*/
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
// retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sCustID, 100, &cbCustID);
printf("\n%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
16.报错日志主界面
代码如下(示例):
#pragma region 报错日志主界面
void Error()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【报错日志】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.查询日志 ||\n");
printf("\t\t||* 2.增加日志 ||\n");
printf("\t\t||* 3.删除日志 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-3): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在查询日志中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
printf("-----------------【查询日志】----------------------\n");
printf("序号 报错时间 报错人 报错事件\n");
ErrorSelect();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
ErrorInsert();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
ErrorDelete();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
17.程序运行帮助
代码如下(示例):
#pragma region 程序运行帮助
void Helpprogamme()
{
printf("重启SQL server全部服务\n");
printf("重新确认PPID的输入\n");
printf("重新确认操作界面数字的输入\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
18. 代码调试帮助
代码如下(示例):
#pragma region 代码调试帮助
void Helpcode()
{
printf("常见的中文编码 GB2312(国标简体中文字符集)和 GBK(国标扩展)使用 2 个字节编码来表示一个汉字,不常用的 GB18030 使用 4 个字节编码来表示一个汉字,更通用的 UTF-8 编码使用 3 个字节编码来表示一个汉字。\n");
printf("服务器在正常运行的情况下突然断电,导致数据库文件严重损坏。附加或还原数据库无果,在附加数据库过程中出现823字样的错误\n");
printf("停止SQL Server服务,将损坏的数据库文件 data_db.mdf 替换掉刚刚新建好的数据库文件,并删除该数据库的日志文件 data_db.mdf _log.ldf\n");
printf("ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄\n");
printf("ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄\n");
printf("/*SQLGetData函数的功能是提取结果集中当前记录的某个字段值*/\n");
printf("/*SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;*/\n");
printf("temp中name数组的长度,在scanf_s中需要添加,在scanf中不需要\n");
printf("无论是sql语句连接,sqlprepare还是sqlexecute顺序基本一致,同样采用了动态sql的方式。\n");
printf("查询功能分为精确查询和模糊查询,精确查询可以采用动态sql的方式,但是由于动态sql的?传进去后将被直接识别为一个元素,因此模糊查询只能用字符串连接的方式来完成。\n");
printf("sqlbindcol函数,是用于查询完后绑定c语言中定义的变量当中,嵌入式sql也是这样的原理,只不过操作更为的直接一些。同样的,绑定的顺序也需要与数据库中你所查询的列相匹配。\n");
printf("在错误代码地方加入断点,发现变量已经为空\n");
printf("查看发现是已经将StdioFile 变量已经关闭,继续写入导致报错\n");
printf("将StdioFile 变量close 放置在完成写入动作之后,程序运行正常。\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
19.查询制作人员
代码如下(示例):
#pragma region 查询制作人员
void Number()
{
printf("制作地址:广州航海学院\n");
printf("总制作人:浩『』皓\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
20.帮助主界面
代码如下(示例):
#pragma region 帮助主界面
void Help()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【帮助界面】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.程序运行帮助 ||\n");
printf("\t\t||* 2.代码调试帮助 ||\n");
printf("\t\t||* 3.查询制作人员 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-3): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在查询日志中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Helpprogamme();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Helpcode();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Number();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
三、附上源码
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <odbcss.h>
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include<math.h>
#include<conio.h>
#include <iostream>
#include <locale>
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable : 4996)
#define sno_length 11
#define sname_length 10
#define sdepart_length 30
#define ssex_length 5
using namespace std;
SQLHENV henv;//环境句柄
SQLHDBC hdbc;//连接句柄
SQLHSTMT hstmt;//语句句柄
SQLRETURN retcode;//返回值
#pragma region 字符转为宽字符
wchar_t* trstring2wchar(const char* str)
{
int mystringsize = (int)(strlen(str) + 1);
WCHAR* wchart = new wchar_t[mystringsize];
MultiByteToWideChar(CP_ACP, 0, str, -1, wchart, mystringsize);
return wchart;
}
#pragma endregion
#pragma region 宽字符转换为字符串
void wchar2strstring(string& szDst, WCHAR* wchart)
{
wchar_t* wtext = wchart;
DWORD dwNmu = WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, NULL, 0, NULL, FALSE);
char* psTest;
psTest = new char[dwNmu];
WideCharToMultiByte(CP_OEMCP, NULL, wtext, -1, psTest, dwNmu, NULL, FALSE);
szDst = psTest;
delete[]psTest;
}
#pragma endregion
#pragma region 错误处理
void handleResult(SQLHANDLE hHandle, SQLSMALLINT hType, RETCODE RetCode)
{
SQLSMALLINT iRec = 0;
SQLINTEGER iError;
WCHAR wszMessage[1000];
WCHAR wszState[SQL_SQLSTATE_SIZE + 1];
//处理无效
if (RetCode == SQL_INVALID_HANDLE)
{
fwprintf(stderr, L"Invalid handle!\n");
return;
}
}
#pragma endregion
#pragma region 输出错误
void error(SQLRETURN err)
{
printf("相关信息输出: ");
switch (err) {
case SQL_SUCCESS:puts("****sql server数据库成功运行*****\n"); break;
case SQL_SUCCESS_WITH_INFO:puts("SQL_SUCCESS_WITH_INFO"); break;
case SQL_ERROR:puts("SQL_ERROR"); break;
case SQL_INVALID_HANDLE:puts("SQL_INVALID_HANDLE"); break;
case SQL_NO_DATA_FOUND:puts("SQL_NO_DATA_FOUND"); break;
case SQL_NEED_DATA:puts("SQL_NEED_DATA"); break;
default:puts("err");
}
}
#pragma endregion
#pragma region 爱心欢迎界面
int Start()
{
system(" color 0c");
printf(" 欢迎使用集团仓储管理系统!!!\n");
float x, y, a;//定义变量x,y,a
for (y = 1.5f; y > -1; y -= 0.1f)
{
for (x = -1.5f; x < 1.5f; x += .05f) {
a = x * x + y * y - 1;
putchar(a * a * a - x * x * y * y * y < 0.0f ? 'x' : ' ');
}
Sleep(150);
putchar('\n');
}
return 0;
}
#pragma endregion
#pragma region 密码设计界面
int Passwords()
{
char pwd[10] = { 0 };
int i = 0;
printf("请输入您的密钥:\n");
for (i = 0; i < 3; i++)
{
scanf_s("%s", pwd,10);
if (strcmp(pwd, "123456") == 0)
{
printf("密钥输入正确,登录成功!\n");
break;
}
else
{
printf("密钥输入错误,请重新输入:\n");
}
}
if (3 == i)
{
printf("登录失败,程序退出。\n");
exit(0);
}
system("pause");
return 0;
}
#pragma endregion
#pragma region 储位查询界面
void StorageTableSelect()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char LocNo[101] = { 0 };
printf("请输入您需要查询的LocNo:\n");
scanf_s("%s", LocNo, 101);
char str2[1001] = "select[PPID],[MaterialNo],[ProductionBatch],[Number],[DataOfManufacture],[Supplier],[CreateUser],[CreateTime],[Lncon]from [Bas_Loc]inner join [dbo].[BindBatchSchedule] on [Bas_Loc].ID = [dbo].[BindBatchSchedule].ID where [Lncon] = '";
char str3[50] = "'";
strcat(LocNo, str3);
strcat(str2, LocNo);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50], str7[50], str8[50], str9[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6, sqlLen7, sqlLen8, sqlLen9;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
SQLGetData(hstmt, 7, SQL_C_CHAR, str7, 50, &sqlLen7);
SQLGetData(hstmt, 8, SQL_C_CHAR, str8, 50, &sqlLen8);
SQLGetData(hstmt, 9, SQL_C_CHAR, str9, 50, &sqlLen9);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf("PPID 物料编号 生产批次 数量 生产日期 供应商 收料人 收料时间 储位位置\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4, str5, str6, str7, str8, str9);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 物料查询界面
void Base_Select()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入您需要查询的PPID:\n");
scanf_s("%s", PPID, 101);
char str2[101] = "select * from [BindBatchSchedule] where [PPID] = '";
char str3[50] = "'";
strcat(PPID, str3);
strcat(str2, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50],str5[50],str6[50], str7[50], str8[50], str9[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6, sqlLen7, sqlLen8, sqlLen9;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
SQLGetData(hstmt, 7, SQL_C_CHAR, str7, 50, &sqlLen7);
SQLGetData(hstmt, 8, SQL_C_CHAR, str8, 50, &sqlLen8);
SQLGetData(hstmt, 9, SQL_C_CHAR, str9, 50, &sqlLen9);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf(" PPID 物料编号 生产批次 数量 生产日期 供应商 收料人 收料时间\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4,str5,str6,str7,str8,str9);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 物料上架界面
void MaterialOnShelf()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char LocNo[101] = { 0 };
printf("请输入对应储位号:\n");
scanf_s("%s", LocNo, 101);
char CreateUser[101] = { 0 };
printf("请输入上架人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入上架时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[101] = "insert into [TEXT].[dbo].[Material_in]values ('";
char str3[50] = "','";
char str5[50] = "','";
char str7[50] = "','";
char str9[50] = "','";
char str10[50] = "上架";
char str11[50] = "')";
strcat(str10, str11);
strcat(str9, str10);
strcat(CreateTime, str9);
strcat(str7, CreateTime);
strcat(CreateUser, str7);
strcat(str5, CreateUser);
strcat(LocNo, str5);
strcat(str3, LocNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("物料上架成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("物料上架失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
#pragma region 物料下架界面
void MaterialRemoval()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char LocNo[101] = { 0 };
printf("请输入对应储位号:\n");
scanf_s("%s", LocNo, 101);
char CreateUser[101] = { 0 };
printf("请输入下架人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入下架时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[101] = "insert into [TEXT].[dbo].[Material_in]values ('";
char str3[50] = "','";
char str5[50] = "','";
char str7[50] = "','";
char str9[50] = "','";
char str10[50] = "下架";
char str11[50] = "')";
strcat(str10, str11);
strcat(str9, str10);
strcat(CreateTime, str9);
strcat(str7, CreateTime);
strcat(CreateUser, str7);
strcat(str5, CreateUser);
strcat(LocNo, str5);
strcat(str3, LocNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("物料下架成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("物料下架失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
#pragma region 物料收料界面
void Base_operaMtl()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入PPID:\n");
scanf_s("%s", PPID, 101);
char MaterialNo[101] = { 0 };
printf("请输入MaterialNo:\n");
scanf_s("%s", MaterialNo, 101);
char ProductionBatch[101] = { 0 };
printf("请输入ProductionBatch:\n");
scanf_s("%s", ProductionBatch, 101);
char Number[101] = { 0 };
printf("请输入Number:\n");
scanf_s("%s", Number, 101);
char DataOfManufacture[101] = { 0 };
printf("请输入DataOfManufacture:\n");
scanf_s("%s", DataOfManufacture, 101);
char Supplier[101] = { 0 };
printf("请输入Supplier:\n");
scanf_s("%s", Supplier, 101);
char CreateUser[101] = { 0 };
printf("请输入收料人:\n");
scanf_s("%s", CreateUser, 101);
char CreateTime[101] = { 0 };
printf("请输入收料时间:\n");
scanf_s("%s", CreateTime, 101);
char str1[500] = "insert into [BindBatchSchedule] values('";
char str3[500] = "','";
char str5[500] = "','";
char str7[500] = "','";
char str9[500] = "','";
char str11[500] = "','";
char str13[500] = "','";
char str15[500] = "','";
char str17[500] = "')";
strcat(CreateTime, str17);
strcat(str15, CreateTime);
strcat(CreateUser, str15);
strcat(str13, CreateUser);
strcat(Supplier, str13);
strcat(str11, Supplier);
strcat(DataOfManufacture, str11);
strcat(str9, DataOfManufacture);
strcat(Number, str9);
strcat(str7, Number);
strcat(ProductionBatch, str7);
strcat(str5, ProductionBatch);
strcat(MaterialNo, str5);
strcat(str3, MaterialNo);
strcat(PPID, str3);
strcat(str1, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("收料成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("收料失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
#pragma region 收料主界面
void MaterialFeeding()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【物料处理】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.物料投料 ||\n");
printf("\t\t||* 2.物料查询 ||\n");
printf("\t\t||* 0.返回上一级菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-2): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Base_operaMtl();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Base_Select();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回上一界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
#pragma region 物料上下架查询
void QueryOfMaterial()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char PPID[101] = { 0 };
printf("请输入您需要查询的PPID:\n");
scanf_s("%s", PPID, 101);
char str2[101] = "select * from [TEXT].[dbo].[Material_in] where [PPID] = '";
char str3[50] = "'";
strcat(PPID, str3);
strcat(str2, PPID);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4, sqlLen5, sqlLen6;
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &sqlLen5);
SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &sqlLen6);
system("cls");
printf("-----------------【物料查询】----------------------\n");
printf(" PPID 储位号 操作人 操作时间 目前状态\n");
printf("\n%s\t%s\t%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4, str5, str6);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 物料处理主界面
void Material()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【物料处理】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.物料收料 ||\n");
printf("\t\t||* 2.物料上架 ||\n");
printf("\t\t||* 3.物料下架 ||\n");
printf("\t\t||* 4.物料上下架查询 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-4): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialFeeding();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialOnShelf();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
MaterialRemoval();
break;
}
case 4:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
QueryOfMaterial();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
#pragma region 程序主菜单
void menu(void)
{
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【仓储管理系统】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.储位查询 ||\n");
printf("\t\t||* 2.物料处理 ||\n");
printf("\t\t||* 3.报错日志 ||\n");
printf("\t\t||* 4.程序帮助 ||\n");
printf("\t\t||* 0.退出程序 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
}
#pragma endregion
#pragma region 报错日志删除
void ErrorDelete()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char ErrorId[10] = { 0 };
printf("请输入您需要删除的ErrorId(1-N):\n");
scanf_s("%s", ErrorId, 10);
char str2[101] = "delete from [ErrorLog] where [ErrorID] = '";
char str3[50] = "'";
strcat(ErrorId, str3);
strcat(str2, ErrorId);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("删除成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("删除失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
#pragma region 报错日志插入
void ErrorInsert()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);
char ErrorBackThings[101] = { 0 };
char ErrorBackName[101] = { 0 };
printf("请输入报错人姓名:\n");
scanf_s("%s", ErrorBackName, 101);
printf("请输入报错事件:\n");
scanf_s("%s", ErrorBackThings, 101);
char str1[101] = "insert into [ErrorLog] values (GETDATE(),'";
char str3[50] = "','";
char str5[50] = "')";
strcat(ErrorBackThings, str5);
strcat(str3, ErrorBackThings);
strcat(ErrorBackName, str3);
strcat(str1, ErrorBackName);
retcode = SQLExecDirect(hstmt, (SQLCHAR*)str1, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
printf("插入成功\n");
}
else
{
handleResult(hstmt, SQL_HANDLE_STMT, retcode);
printf("插入失败\n");
}
error(retcode);
system("pause");
system("cls");
}
#pragma endregion
#pragma region 报错日志查询
void ErrorSelect()
{
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLCHAR sql1[] = "use TEXT";//使用名为"TEXT"数据库
SQLCHAR sql2[] = "select * from [dbo].[ErrorLog]";
retcode = SQLExecDirect(hstmt, sql1, SQL_NTS);//SQLExecDirect,此函数用于执行SQL语句,执行sql1语句
retcode = SQLExecDirect(hstmt, sql2, SQL_NTS);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
{
SQLCHAR str1[50], str2[50], str3[50], str4[50];
SQLLEN sqlLen1, sqlLen2, sqlLen3, sqlLen4;
// SQLLEN len_str1, len_str2, len_str3;
/*SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;*/
while (SQLFetch(hstmt) != SQL_NO_DATA)
{
/*SQLGetData函数的功能是提取结果集中当前记录的某个字段值*/
SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &sqlLen1);//获取第一列数据
SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &sqlLen2);
SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &sqlLen3);
SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &sqlLen4);
// retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sCustID, 100, &cbCustID);
printf("\n%s\t%s\t%s\t%s\n\n", str1, str2, str3, str4);
}
}
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 报错日志主界面
void Error()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【报错日志】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.查询日志 ||\n");
printf("\t\t||* 2.增加日志 ||\n");
printf("\t\t||* 3.删除日志 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-3): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在查询日志中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
printf("-----------------【查询日志】----------------------\n");
printf("序号 报错时间 报错人 报错事件\n");
ErrorSelect();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
ErrorInsert();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
ErrorDelete();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
#pragma region 程序运行帮助
void Helpprogamme()
{
printf("重启SQL server全部服务\n");
printf("重新确认PPID的输入\n");
printf("重新确认操作界面数字的输入\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 代码调试帮助
void Helpcode()
{
printf("常见的中文编码 GB2312(国标简体中文字符集)和 GBK(国标扩展)使用 2 个字节编码来表示一个汉字,不常用的 GB18030 使用 4 个字节编码来表示一个汉字,更通用的 UTF-8 编码使用 3 个字节编码来表示一个汉字。\n");
printf("服务器在正常运行的情况下突然断电,导致数据库文件严重损坏。附加或还原数据库无果,在附加数据库过程中出现823字样的错误\n");
printf("停止SQL Server服务,将损坏的数据库文件 data_db.mdf 替换掉刚刚新建好的数据库文件,并删除该数据库的日志文件 data_db.mdf _log.ldf\n");
printf("ret = SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄\n");
printf("ret = SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄\n");
printf("/*SQLGetData函数的功能是提取结果集中当前记录的某个字段值*/\n");
printf("/*SQLFetch函数的功能是将结果集的当前记录指针移至下一个记录;*/\n");
printf("temp中name数组的长度,在scanf_s中需要添加,在scanf中不需要\n");
printf("无论是sql语句连接,sqlprepare还是sqlexecute顺序基本一致,同样采用了动态sql的方式。\n");
printf("查询功能分为精确查询和模糊查询,精确查询可以采用动态sql的方式,但是由于动态sql的?传进去后将被直接识别为一个元素,因此模糊查询只能用字符串连接的方式来完成。\n");
printf("sqlbindcol函数,是用于查询完后绑定c语言中定义的变量当中,嵌入式sql也是这样的原理,只不过操作更为的直接一些。同样的,绑定的顺序也需要与数据库中你所查询的列相匹配。\n");
printf("在错误代码地方加入断点,发现变量已经为空\n");
printf("查看发现是已经将StdioFile 变量已经关闭,继续写入导致报错\n");
printf("将StdioFile 变量close 放置在完成写入动作之后,程序运行正常。\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 查询制作人员
void Number()
{
printf("制作地址:广州航海学院\n");
printf("总制作人:浩『』皓\n");
printf("查询完毕!!!\n");
system("pause");
system("cls");
}
#pragma endregion
#pragma region 帮助主界面
void Help()
{
while (1)
{
int choose;
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t|| ****************【帮助界面】*************** ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("\t\t||* 1.程序运行帮助 ||\n");
printf("\t\t||* 2.代码调试帮助 ||\n");
printf("\t\t||* 3.查询制作人员 ||\n");
printf("\t\t||* 0.返回主菜单 ||\n");
printf("\t\t||--------------------------------------------------------------------------------||\n");
printf("请选择功能菜单(0-3): ");
scanf_s("%d", &choose);
switch (choose)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在查询日志中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Helpprogamme();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Helpcode();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在加载页面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Number();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在返回主界面,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
return;
}
}
}
}
#pragma endregion
#pragma region 主函数
int main()
{
Start();
system("cls");
system("color F");
Passwords();
system("cls");
Sleep(1500);
retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);//申请环境句柄
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄
retcode = SQLConnect(hdbc, (SQLCHAR*)"mytest", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"123456", SQL_NTS);
if (!(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO))
{
printf("连接数据库失败! 程序中止运行!\n");
return -1;
}
else
{
printf("集团数据库连接成功! 欢迎您的使用!\n");
}
system("cls");
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);//释放连接句柄
SQLFreeHandle(SQL_HANDLE_ENV, henv);//释放环境句柄
while (1)
{
int choice;
menu();
printf("请选择功能菜单(0-4): \n");
scanf_s("%d", &choice);
switch (choice)
{
case 1:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
StorageTableSelect();
break;
}
case 2:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Material();
break;
}
case 3:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Error();
break;
}
case 4:
{
system("cls");
printf("===========================================================================================\n");
printf(" 正在跳转界面中,请等候!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
Help();
break;
}
default:
{
system("cls");
printf("===========================================================================================\n");
printf(" 您即将退出存储管理系统,感谢您的使用!\n");
printf("===========================================================================================\n");
Sleep(1000);
system("cls");
exit(0);
break;
}
}
}
return 0;
}
#pragma endregion
总结
以上就是该仓储管理系统的全部内容,由于是博主三天内赶完的东西,做工相对比较粗糙,还望各位海涵
参考文献
本文参考了以下作者的文章,在此特别鸣谢,望各位熟知
1、掺杂躁动的选手
C语言连接SQL Server数据库并且完成一次简易操纵
掺杂躁动的选手
————————————————
版权声明:本文为CSDN博主「掺杂躁动的选手」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a1174792073/article/details/115211195
2、yeee你啊啦
使用c语言对sql server进行增删改查操作
yeee你啊啦
————————————————
版权声明:本文为CSDN博主「yeee你啊啦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45029615/article/details/112870791
3、史迪奇奇龙
语言最全爱心代码大全
史迪奇奇龙
已于 2022-12-27 14:
————————————————
版权声明:本文为CSDN博主「史迪奇奇龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_58045538/article/details/127415337