有关数据库操作的问题,请高手帮忙
NON-FATAL RUN-TIME ERROR: "CreatDbc.c", line 288, col 11, thread id 0x00000CF8: Function DBDeactivateMap: (return value == -89 ). Invalid map handle.我在第一次执行程序的时候:创建数据库后,可以不断的执行插入数据的命令,但是退出程序后,重新执行程序,在执行插入数据时,执行到 DBDeactivateMap (hstat);这个语句就会出现上面的错误,为什啊?请高手帮忙,附件是我的整个工程文件
我的程序
#include "cvi_db.h"
#include <utility.h>
#include <cvirte.h>
#include <userint.h>
#include "CreatDbc.h"
////////////////////////////// 等级1参数 ////////////////////////////////////////////////////////////////
static float DCOVoltvalue;
static float DCUVoltvalue;
static float SysOVoltvalue;
static float SysLVoltvalue;
static float OverLoadvalue;
static float MaxCvalue;
static float CTvalue;
static float IHvalue;
static float PPvalue;
static long DCOVoltstatus;
static long DCUVoltstatus;
static long SysOVoltstatus;
static long SysLVoltstatus;
static long OverLoadstatus;
static long MaxCstatus;
static long CTstatus;
static long IHstatus;
static long PPstatus;
////////////////////////////// 等级0参数 ////////////////////////////////////////////////////////////////
static float Kvalue;
static float Pvalue;
static float K2value;
static float P2value;
static float Qvalue;
static float Nvalue;
static float Freqvalue;
static float Dvalue;
static long Kstatus;
static long Pstatus;
static long K2status;
static long P2status;
static long Qstatus;
static long Nstatus;
static long Freqstatus;
static long Dstatus;
/////////////////////////////////////////////////// 数据库参数 ///////////////////////////
static long idstatus;
static int idvalue;
static long faultstatus;
static char faultvalue; //故障类型
static long startstatus;
static char startvalue; //故障开始时间
static long endstatus;
static char endvalue; //故障结束时间
static long runstatus;
static char runvalue;//故障运行状态
static long excessstatus;
static char excessvalue; //过量比例
static int resultcode;
static int hstat;
static int hmap;
static int total = 0;
static int i = 1;
static int DbcInitial=0;
static int DbcInitialFlag=1;//数值初始化标志位
//table10:等级1缺省数值
//table11:等级1设置后的数值
//table00:等级0缺省数值
//table01:等级0修改后的数值
//table2:故障查询有关数据
////////////////////////////// 其他参数 ////////////////////////////////////////////////////////////////
static int hdbc;
static int globalvalue;
static int panelHandle;//主界面句柄
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "CreatDbc.uir", PANEL)) < 0)
return -1;
hdbc = DBConnect ("DSN=client");//建立数据库联接,并获得联接句柄
// DisableBreakOnLibraryErrors (); //禁止错误中断
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
DBDisconnect (hdbc); //当退出应用程序时,关闭数据库连接
return 0;
}
hstat = DBActivateSQL (hdbc, "SELECT * FROM table2"); //激活SQL查询
// resultcode = DBMapColumnToInt (hmap, "ID", &idvalue, &idstatus);
resultcode =DBBindColInt (hstat, 1, &idvalue,&idstatus );
resultcode = DBBindColChar (hstat, 2, 20, faultvalue, &faultstatus, "");
resultcode = DBBindColChar (hstat, 3, 50, startvalue, &startstatus, "");
resultcode = DBBindColChar (hstat, 4, 50, endvalue, &endstatus, "");
resultcode = DBBindColChar (hstat, 5, 20, runvalue, &runstatus, "");
resultcode = DBBindColChar (hstat, 6, 20, excessvalue, &excessstatus, "");
// resultcode =DBBindColFloat (hstat, 6, &excessvalue,&excessstatus );
// resultcode=DBCreateTableFromMap (hmap, "table2"); //由此映射激活一个数据表
// resultcode=DBActivateMap (hmap, "table2");
while(DBFetchNext(hstat) != DB_EOF)
{}
if (resultcode >= 0)
{
//向数据表中添加数据
for(addi=1;addi<100;addi++)
{
DBImmediateSQL (hdbc, "INSERT INTO table2 VALUES (1,'测试数据库', '成功', '', '','')");
DBImmediateSQL (hdbc, "INSERT INTO table2 VALUES (2,'2', '杨过', '男', 'mm','Am')");
DBImmediateSQL (hdbc, "INSERT INTO table2 VALUES (3,'3', '杨过', '男', 'mm','Am')");
DBImmediateSQL (hdbc, "INSERT INTO table2 VALUES (4,'4', '杨过', '男', 'mm','Am')");
DBImmediateSQL (hdbc, "INSERT INTO table2 VALUES (5,'5', '杨过', '男', 'mm','Am')");
}
}
DBDeactivateMap (hstat); CVI中的错误提示有点误导人!
你的程序本身没有问题。所以第一次能够执行,但只是第二次执行时违反了数据库的数据一致性原则:因为你向一个表中插入已经存在的数据!
作为练习,一个可以采取的措施是在程序每次执行时判断table2表是否存在,如果存在,先删除它,再新建table2表,然后再插入数据,就不会出错;
SQL语句:
if exists
(
select * from information_schema.tables
where table_name='table2'
)
drop table table2
go
create table .....
实际工程中,不能轻易删除一张表,但可以使用Alter Table子句修改其中的内容!
具体代码你可以参照上面的自己修改(注:上面的说明针对MS SQL Server)。
祝好运!
页:
[1]