[求助]数据库只能读不能向其中写入数据
我现在正试开始做毕业设计了,我的毕业设计题目是研究生入学管理信息系统中的学生信息管理模块。具体的需求分析及概念结构设计和逻辑结构设计也差不多完成了,现在在正准备进入编程阶段。在正试编程这前,我想到虽然我的VC方面的知识还过得去,可在同数据库通信方面还是一个薄弱环节,所以我特意做了一个测试,就是用基于Win32 application环境来完成数据库中数据的读出和录入。可是却在这里出现了一个问题,让我无法继续下去:下面是我做的那个示例程序:
// testArray.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "afxdisp.h"
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
//#include <adoid.h>
//#include <adoint.h>
#include "icrsint.h"
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
::CoInitialize(NULL);
try
{
_RecordsetPtr pRs("ADODB.Recordset");
pRs->Open("MasterInfo","dsn=MISDB",adOpenUnspecified,adLockOptimistic,adCmdTable);
pRs->MoveFirst();
printf("%s",(char*)_bstr_t(pRs->GetCollect("NO")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("NAME")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("SEX")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("ENTER_YEAR")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("TEACHER_NO")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("BORN_YEAR")));
printf("%s",(char*)_bstr_t(pRs->GetCollect("BORN_PLACE")));
}
catch (_com_error &e )
{
AfxMessageBox("Error: Code = " + e.Error());
printf("Error:\n");
printf("Code = %08lx\n", e.Error());//为什么用c库阿?
printf("Meaning = %s\n", e.ErrorMessage());
printf("Source = %s\n", (LPCSTR) e.Source());
printf("Description = %s\n", (LPCSTR) e.Description());
}
::CoUninitialize();
return 0;
}
这里我要说明的是,这个程序完全是数据库中数据的读出,并且事先我在SQL Server 2000(我用的是个人版)中已经生成了程序中要用的数据库及表,而且也已经相应的创建了一个名为MISDB的数据源。然后我编译运行一点错也没有,最后我把程序移植到Win32 Console application环境下,数据成功地被读到控制台上。
但是单单能读出数据还不行,我还要验证能不能录入数据,因此我又加下了以下几段代码,可现在问题就出来了。我用了不同的方法来向数据库中写入数据,可都不能完成我的要求,不是编译通不过就是链接的时候报错,查了很多资料可也弄不懂到底是什么原因,请老师帮我看一下,下面是我用的来向数据库中写入数据的几个不同的方法:
向数据库中添加一条新的记录
<方法一:>
//创建一个记录字段数据的数组
COleSafeArray vaFieldlist;
vaFieldlist.CreateOneDim(VT_VARIANT,7);
long lArrayIndex[1];
lArrayIndex[0]=0;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("NO")));
lArrayIndex[0]=1;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("NAME")));
lArrayIndex[0]=2;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("SEX")));
lArrayIndex[0]=3;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("ENTER_YEAR")));
lArrayIndex[0]=4;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("TEACHER_NO")));
lArrayIndex[0]=5;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("BORN_YEAR")));
lArrayIndex[0]=6;
vaFieldlist.PutElement(lArrayIndex,&(_variant_t("BORN_PLACE")));
//创建一个记录字段值的数组
COleSafeArray vaValuelist;
vaValuelist.CreateOneDim(VT_VARIANT,7);
lArrayIndex[0]=0;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=1;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=2;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=3;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=4;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=5;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
lArrayIndex[0]=6;
vaValuelist.PutElement(lArrayIndex,&(_variant_t("wer")));
pRs->AddNew(vaFieldlist,vaValuelist);
pRs->Close();
<方法二:>同样是向数据库中添加一条新的记录
pRs->AddNew();
pRs->Fields->GetItem("NO")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("NAME")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("SEX")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("ENTER_YEAR")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("TEACHER_NO")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("BORN_YEAR")->PutValue(_variant_t("2000"));
pRs->Fields->GetItem("BORN_PLACE")->PutValue(_variant_t("2000"));
pRs->Close();
这两种方法目的都是一样的,都是要向数据库中添加一条新的记录。可不管是把哪段代码加上去后,编译和链接都能顺利通过,运行可执行文件,此时都会出现错误提示框,
第一种方法产生的错误提示是:"0x77e06673"指令引用的"0x8057ae91"内存,该内存不能为"read"
第二种方法产生的错误提示是:"0x77e06673"指令引用的"0x80556e91"内存,该内存不能为"read"
很显然两种方法产生的错误是一个类型的,可能还是编程经验少的原因,以前还没碰到过类似的问题,找了很多资料也找不到可以解决的办法。因为我做的模块是既能读又能向数据库中写入数据的,比如说查询是要读取数据的而修改则要向数据库中写入数据,因此现在这个问题如不能解决就使我的设计处于停止不前的状况。
希望有哪位高人指定一下。谢谢先