#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename( "EOF", "adoEOF" )//必需自帶dll庫函數
#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "string.h"
#include <malloc.h>
#include <stdlib.h>
#include <windows.h>
struct MYDATE{//自定義時間結構體。
int YEAR;
int MONTH;
int DAY;
};
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ItemX(int select);//數據庫操作
BOOL saveFile(char* bookID,char *time,float price);//保存文件
BOOL DeleteFile(char* bookID,MYDATE data,float price);//刪除文件記錄,再保存
void PrintProviderError(_ConnectionPtr pConnection);//數據庫出錯處理
void PrintComError(_com_error &e);//數據庫出錯處理
void Begin(int &select);//起點
char* left(char *pch,int len);//字符串取左位
char* right(char *pch,int len);
int findString(char *pch,char *temp);//字符串取相同字符首地址。
int main(int argc, char* argv[])
{
if(FAILED(::CoInitialize(NULL)))
return 0;
int select=-1;
Begin(select);
//Wait here for the user to see the output
printf("謝謝使用.\n本軟件只提供學習參考,不得用於其它商業軟件.\nEmail:worldk@163.com\n"
"Press any key to continue...\n");
getch();
::CoUninitialize();
return 0;
}
BOOL saveFile(char* bookID,char *time,float price)/*int x,int y,MYDATA data)*/
{
char buff[100];FILE *file;char* strfile="\0";
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile("borrow.dat", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf ("未找到文件 %d\n", GetLastError ());
} else {
FindClose(hFind);
memset(buff,0,100);
file=fopen("borrow.dat","rb");
fseek(file,0,SEEK_END);
int len=ftell(file);
strfile=new char[len];
rewind(file);
fread(strfile,1,len+1,file); strfile[len]='\0';
fclose(file);
}
file=fopen("borrow.dat","wb");
//編號、租借日期、押金。略……x,y,data運算自加
fseek(file,0,SEEK_END);
sprintf(buff,"%s,%s,%.2f\n",bookID,time,price*3);
fwrite(buff,1,strlen(buff),file);
fwrite(strfile,1,strlen(strfile),file);
fclose(file);
printf("寫入文件成功\n");
return TRUE;
}
int findString(char *pch,char *temp)
{
int len=strlen(pch);
int templen=strlen(temp);
printf("%d\t",len);
int pos=0;
char* pch1=pch;
char *pch2=temp;
while(*pch1)
{
for(int i=0;i<templen;i++)
{
if(*(pch1+i)!=temp[i])
break;
}
if(i==templen)
return pos;
pch1++;
pos++;
}
return -1;
};
char* left(char *pch,int len)
{
char* pch1=(char *)malloc( _MAX_PATH );
strcpy(pch1,pch);
pch1[len]='\0';
return pch1;
}
char* right(char *pch,int len)
{
char* pch1=(char *)malloc( _MAX_PATH );
strcpy(pch1,pch);
pch1+=len;
return pch1;
}
BOOL DeleteFile(char* bookID,MYDATE data,float price)/*int x,int y,MYDATA data)*/
{
char buff[100];FILE *file;char* strfile="\0";
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile("borrow.dat", &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) {
printf ("未找到文件 %d\n", GetLastError ());//未找到文件
return FALSE;
} else {
FindClose(hFind);
memset(buff,0,100);
file=fopen("borrow.dat","rb");
fseek(file,0,SEEK_END);
int len=ftell(file);
strfile=new char[len];
rewind(file);
fread(strfile,1,len+1,file); strfile[len]='\0';
fclose(file);
}
sprintf(buff,"%s,%d-%d-%d",bookID,data.YEAR,data.MONTH,data.DAY);
int pos=findString(strfile,buff);
if(pos==-1)
{
printf("文件中沒有這條記錄\n");
return FALSE;
}
char choose;
int pos2=0;
printf("%s ,單價%.2f 找到\n",buff,price);
//編號、租借日期、押金。略……x,y,data運算自加
switch(*bookID)
{
case 'b':printf("資費1元\/日\n");break;
case 'v':printf("資費2元\/日\n");break;
case 'r':printf("資費3元\/日\n");break;
default:printf("不詳\/日\n");break;
}
do
{
fflush(stdin);
printf("是否刪除(Y/N)\n");
scanf("%c",&choose);
}while(!(choose=='Y' || choose=='y' ||choose=='n' || choose=='N'));
if(choose=='n' || choose=='N')
return FALSE;
char *strlef=(char *)malloc( _MAX_PATH );;
char *pch1=NULL;
if(pos==0) strlef="\0";
else
{
strlef=left(strfile,pos);
strlef[pos-1]='\0';
}
char *strright=right(strfile,pos);
pch1=strchr(strright,'\n');
if(pch1==NULL)
{
printf("找字符串錯誤,文件操作\n");
return FALSE;
}
char * temp;
temp=strlef;
if(pos!=0) strcat(temp,pch1);
else temp=pch1+1;
file=fopen("borrow.dat","wb");
/* fwrite(temp,1,strlen(temp),file);
// fwrite(strfile,1,strlen(strfile),file);
*/
fwrite(temp,1,strlen(temp),file);
fclose(file);
printf("文件刪除記錄成功\n");
return TRUE;
}
void Begin(int &select)
{
select=-1;
do{ printf( "|----------------------------------------------| \n"
"| 請輸入選項編號(0——5): |\n"
"|----------------------------------------------| \n"
"| 1——創建音像圖書庫 | \n"
"| 2——租借音像圖書 | \n"
"| 3——歸還時音像圖書 | \n"
"| 4——購進音像圖書 | \n"
"| 5——報廢音像圖書 | \n"
"| 0——退出系統 | \n"
"|----------------------------------------------| \n");
fflush(stdin);
printf("請選擇:(0-5)");
scanf("%d",&select);
}while(!(select==1 ||select==2 || select==3 || select==4 ||select==5 ||select==0));
if(select==0)
return;
ItemX(select);
}
void ItemX(int select)
{
fflush(stdin);
HRESULT hr = S_OK;
_ConnectionPtr pConnection = NULL;
_RecordsetPtr pRst = NULL;
_CommandPtr pCmd = NULL;
_ParameterPtr pPrm = NULL;
FieldPtr pFld = NULL;
SYSTEMTIME recvtime,currenttime;//最好用其它方法,這裏節省時間
_bstr_t strCnn("DRIVER=Driver do Microsoft Access (*.mdb);DBQ=myBook"); //本程序目錄下的myBook.mdb數據庫
char *filename="myBook.mdb";//文件名
char *tabname="BOOK"; //文件表名
_variant_t Column[5];
_variant_t vIndex;
Column[0]="BIANHAO";//字段1,字符型,編號
Column[1]="NAME"; //字段2,字符型,名稱
Column[2]="PRICE"; //字段3,小數型,價格
Column[3]="TOTAL"; //字段4,整型, 總數
Column[4]="NOWCOUNT";//字段5,整型,庫存
MYDATE data;
try
{
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
TESTHR(pRst.CreateInstance(__uuidof(Recordset)));
TESTHR(pCmd.CreateInstance(__uuidof(Command)));
_bstr_t strText;
char temp[100]={"SELECT * FROM BOOK"};
char bookID[100];
switch(select)
{
case 1:
printf("這個用源碼實現非常困難,最好用專門的數據庫程序工具(如Access,SQL,MYSQL等)...\n"
"顯示建好的數據庫每條記錄\n這裏用的是微軟的mdb數據庫\n");
strText=("SELECT * FROM BOOK ");//SQL語句……
break;
case 2:
printf("請妳輸入編號:\t");
gets(bookID);
strcat(temp ," where BIANHAO='" );
strcat(temp,bookID);
strcat(temp, "'");
strText=temp;
printf("自動取的當前時間.(年-月-日)\n");//個人方法可不同,略……
memset(¤ttime,0,sizeof(currenttime));
GetSystemTime(¤ttime);//取系統時間,如果系統有時區差,這裏也會有時差。為節省時間,略……
break;
case 3:
printf("請輸入編號:\t");
gets(bookID);
strcat(temp ," where BIANHAO='" );
strcat(temp,bookID);
strcat(temp, "'");
strText=temp;
do{
printf("請輸入借出的日期(年-月-日)");//同上略
scanf("%d-%d-%d",&data.YEAR,&data.MONTH,&data.DAY);
}while(data.MONTH<1 || data.MONTH>12 || data.DAY<1 || data.DAY>31);
break;
case 4:
printf("請妳輸入編號:\t");
gets(bookID);
strcat(temp ," where BIANHAO='" );
strcat(temp,bookID);
strcat(temp, "'");
strText=temp;
break;
case 5:
printf("請妳輸入編號:\t");
gets(bookID);
strcat(temp ," where BIANHAO='" );
strcat(temp,bookID);
strcat(temp, "'");
strText=temp;
break;
default:
strText=("SELECT * FROM BOOK ");
break;
}
pCmd->CommandText = strText;
//////數據庫連接
pConnection->Open(strCnn, "", "", adConnectUnspecified);
pCmd->ActiveConnection = pConnection;
_variant_t Conn;
Conn.vt = VT_ERROR;
Conn.scode = DISP_E_PARAMNOTFOUND;
pRst->Open((_variant_t((IDispatch *) pCmd)),Conn,adOpenStatic,
adLockReadOnly, -1);
////////////
long count=pRst->GetRecordCount();
if(count<=0 && select!=4)
{
pRst->Close();
pConnection->Close();
printf("沒有條記錄\n");
printf("按任意鍵回主菜單....\n");
getch();
Begin(select);
return;
}
else if(count<=0 && select==4)
{
char temp[100];
char bookName[100];
float price;
printf("請妳輸入名稱:(DOS下不支持中文輸入)");scanf("%s",&bookName);
printf("請妳輸入價格:");scanf("%f",&price);
sprintf(temp,"INSERT into BOOK VALUES ('%s','%s',%f,1,1)",bookID,bookName,price);
pRst->Close();
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("添加記錄成功\n");
}
else if(count>0)
{
char temp[100];
strcpy(temp,pCmd->CommandText);
pRst->MoveFirst();
long limit = 0;
limit = ((pRst->Fields->Count) - 1);
int intLineCnt = 0; printf("\t");
for(int i=0;i<5;i++)
{
if(i==2) printf("\t");
printf("%s\t",(LPCSTR)(_bstr_t)Column[i]);
}
printf("\n");
while(!pRst->adoEOF)
{
printf("\t");
for (short iIndex = 0; iIndex <= limit; iIndex++)
{
vIndex = iIndex;
pFld = pRst->Fields->GetItem(&vIndex);
_variant_t FldVal = pFld->GetValue();
// Because Value is the default property of a
// Property object,the use of the actual keyword
// here is optional.
switch(FldVal.vt)
{
case (VT_DECIMAL):
printf("%.2f",//"Value = '%s'",
(float)(FldVal.iVal)/100);
printf("\t");
break;
case (VT_BOOL):
if(FldVal.boolVal)
{
printf("Value = 'True'");
}
else
{
printf("Value = 'False'");
}
printf("\t");
break;
case (VT_BSTR):
printf("%s",//"Value = '%s'",
(LPCSTR)(_bstr_t)FldVal.bstrVal);
printf("\t");
break;
case (VT_I4):
printf("%d",//"Value = '%d'",
(LPCSTR)FldVal.iVal);
printf("\t");
break;
case (VT_EMPTY):
printf("%d",//"Value = '%s'",
(LPCSTR)FldVal.lVal);
printf("\t");
break;
case VT_DATE:
VariantChangeType(&FldVal,&FldVal,VARIANT_NOVALUEPROP,VT_BSTR);
printf("%s",//"Value = '%s'",
(LPCSTR)(_bstr_t)FldVal.bstrVal);
printf("\t");
break;
default:
break;
}
}
intLineCnt++;
printf("\n");
pRst->MoveNext();
}
pRst->MoveFirst();
_variant_t FldVal=pRst->Fields->GetItem(Column[3])->GetValue();
int total=FldVal.iVal;
FldVal=pRst->Fields->GetItem(Column[4])->GetValue();
int nowcount=FldVal.iVal;
FldVal=pRst->Fields->GetItem(Column[2])->GetValue();
float m_price=(float)FldVal.iVal/100;
switch(select)
{
case 2:
char buff[100];
char choose;
sprintf(temp,"UPDATE BOOK SET NOWCOUNT=%d WHERE BIANHAO='%s'",nowcount-1,bookID);
pRst->Close();
if(nowcount-1<0)
{
printf("對不起,庫存已經為空,請以後再來\n",total);
break;
}
sprintf(buff,"%d-%d-%d",currenttime.wYear,currenttime.wMonth,currenttime.wDay);
do
{
printf("出借時間""%s""是否確定(Y/N)",buff);
scanf("%c",&choose);
}while(!(choose=='Y' || choose=='y' ||choose=='n' || choose=='N'));
if(choose=='n' || choose=='N')
break;
saveFile(bookID,buff,m_price);//參數自己加,略……
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("出借成功,現庫存為%d\n",nowcount-1);
break;
case 3:
if(!DeleteFile(bookID,data,m_price))//參數自己加,略……
break;
else
sprintf(temp,"UPDATE BOOK SET NOWCOUNT=%d WHERE BIANHAO='%s'",
nowcount+1,bookID);
pRst->Close();
pRst.CreateInstance(__uuidof(Recordset));
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("成功修改了庫存,現記錄為%d\n",nowcount+1);
break;
case 4:
sprintf(temp,"UPDATE BOOK SET TOTAL=%d,NOWCOUNT=%d WHERE BIANHAO='%s'",
total+1,nowcount+1,bookID);
pRst->Close();
pRst.CreateInstance(__uuidof(Recordset));
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("成功修改了總數,現記錄為%d\n",total+1);
printf("成功修改了庫存,現記錄為%d\n",nowcount+1);
sprintf(temp,"Select * FROM BOOK where BIANHAO='%s'",bookID);
break;
case 5:
sprintf(temp,"UPDATE BOOK SET TOTAL=%d,NOWCOUNT=%d WHERE BIANHAO='%s'",
total-1,nowcount-1,bookID);
pRst->Close();
if(nowcount-1<0)
{
printf("對不起,庫存已經為空,總數量為%d\n",total);
if(total==0)
{
sprintf(temp,"DELETE * FROM BOOK where BIANHAO='%s'",bookID);
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("由於總數量為0,該記錄將被徹底清除\n");
}
break;
}
pRst.CreateInstance(__uuidof(Recordset));
pRst->Open(temp,pConnection.GetInterfacePtr(),
adOpenStatic,adLockReadOnly, -1);
printf("成功修改總數記錄,現記錄為%d\n",total-1);
printf("成功修改庫存記錄,現記錄為%d\n",nowcount-1);
break;
}
}
pCmd.Release();
pRst.Release();
pConnection.Release();
printf("按任意鍵回主菜單....\n");
getch();
Begin(select);
}
catch(_com_error &e)
{
PrintProviderError(pConnection);
PrintComError(e);
}
}
void PrintProviderError(_ConnectionPtr pConnection)
{
ErrorPtr pErr = NULL;
if( (pConnection->Errors->Count) > 0)
{
long nCount = pConnection->Errors->Count;
// Collection ranges from 0 to nCount -1.
for(long i = 0; i < nCount; i++)
{
pErr = pConnection->Errors->GetItem(i);
printf("\t Error number: %x\t%s", pErr->Number,
pErr->Description);
}
}
}
void PrintComError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
// Print Com errors.
printf("數據庫操作錯誤.先創建數據庫文件.由於數據指針操作復雜,詳細說明略\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s\n", e.ErrorMessage());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}