问题总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

最近问题处理方法总结:

1.    ADOQuery 控件加锁机制

对于多线程程序中,会涉及到可能对某张表同时执行数据库的基本操作,此时便要加锁。

具体实现:

Handle select_mutex;

select_mutex = CreateMutex(NULL,false,"selectMutex");

//上锁

            if(WaitForSingleObject(select_mutex,2000)!=WAIT_TIMEOUT)

                     {

                            Try() catch ()…

}

//解锁

ReleaseMutex(select_mutex);

2.    关于多线程使用ADOQuery控件的处理

在不同线程里,建议只使用同一个ADOQuery,并且使用同一个数据库连接对象

3.    EXE执行程序实现不依赖CB安装环境

   CB中,Project -> Options -> Packages -> Build with runtime packages 前面的勾去掉

   附加DLL文件cc3260mt.dll

   附加DLL问价borlndmm.dll

4.    关于代码格式的处理

   注意源码的对齐

   注意源码的缩进

这样既规范,又可以方便大括号的对应

5.    注意判断SQL语句的执行结果

在程序使用ADO控件执行SQL语句时,首先要先判断执行结果,才能进行后面的处理

例如:

If(dm->execSelect(dm->qrySelect, sql)  &&  !dm->qrySelect->Eof )

{….}

Else

{…}

6.    灵活使用try … catch中的异常,通过捕捉异常来进行需要的处理

7.    程序中的SQL语句注意,

如果某字段的值不为字符型,要使用IntToStr或者AnsiString进行转换

8 Select语句和Insert语句的执行方法,

open来执行,返回结果集;  Insert, Update, Delete这些没有返回结果集的SQL语句,使用ExecSQL执行

9.    关于ORA数据库与SQLSERVER数据库重连的方法

判断ORA数据库的连接数据库失败的几种类型:

//分离并判断异常类型,确定异常处理方式

                        AnsiString subexcp = "";

                        subexcp = e.Message.SubString(0,9);

                        if((subexcp == "ORA-03114") ||

                           (subexcp == "ORA-12560") ||

                           (subexcp == "ORA-12170") ||

                           (subexcp == "ORA-12152") ||

                           (subexcp == "ORA-01012") ||

                           (subexcp == "ORA-00028") ||

                                            (subexcp == "ORA-12571")    //增加:包程序写入错误

                          )

判断SQL SERVER数据库连接失败的方法:

sql = "use master; select top 1 * from sysobjects;";

    qry1->Close();

    qry1->SQL->Text = sql;

    try

    {

      qry1->Open();

    }

    catch(...)

    {

      ShowMessage("必须重连!");

      return;

}

 

    对于ORASQL数据库重连:

TADOConnection* newConSendGPS = GetNewConnection(dm->conSendGPS, dm->qrySelect)

        if(newConSendGPS != NULL)

        {

          dm->conSendGPS = newConSendGPS;

          dm->qrySelect->Connection = newConSendGPS;

        }

        else return false;

       //具体处理函数

TADOConnection * __fastcall Tdm::GetNewConnection(TADOConnection* BadDBConnection, TADOQuery *query)

{

        //TADOConnection * newConn = NULL;

TADOConnection* newConn = new TADOConnection(NULL);    //20090227修改,这里产生数据库重连失败的原因

        int times = 0;

 

        //AnsiString sql = "use master; select top 1 * from sysobjects;";

        AnsiString sql = "select * from dual";

        bool  flag = false;

        //while(true){

        while(!flag){

          try

          {

//            if(++times > 10)

//            {

//              return NULL;

//            }

            if(newConn == NULL) newConn = BadDBConnection;

            newConn->Close();

            newConn->ConnectionString = BadDBConnection->ConnectionString;

            newConn->Connected = true;

            newConn->KeepConnection = true;

            query->Connection = newConn;

            query->Close();

            query->SQL->Clear();

            query->SQL->Add(sql);

            //query->ExecSQL();

            query->Open();

            dm->logInfo("/n重连数据库成功!");

            //delete BadDBConnection;

            flag = true;

            break;

          }

          catch(Exception &e)

          {

            dm->logInfo("/n重连数据库失败:%s", e.Message.c_str());

            dm->logInfo("/n数据库重连...");

            Sleep(3000);

            //flag = false;

            //return true;

          }

        }       

        return newConn;

}

 

   只针对SQL数据库重连

// 重连数据库,只针对SQLSERVER数据库

bool __fastcall Tdm::ResetDBConnection(TADOConnection *BadDBConnection)

{

        //打印到log信息

        dm->logInfo("/n数据库连接出现异常,程序暂停,等待重连...");

        //AnsiString connStr = BadDBConnection->ConnectionString;

        //连接数据库

        BadDBConnection->Close();

BadDBConnection->Connected = false;  //一定要加这行代码,否则ADO查询控件无法使用

        while(!BadDBConnection->Connected)

        {

                try

                {

                  //BadDBConnection->Close();

                  //BadDBConnection->ConnectionString = connStr;

                  BadDBConnection->Connected = true;

                  //BadDBConnection->KeepConnection = true;

                }

                catch(...)

                {

                        BadDBConnection->Connected = false;

                        dm->logInfo("重新连接数据库异常...");

                        Sleep(3000);

                }

 

        }

        //打印log信息

        dm->logInfo("/n重连数据库成功");

        return true;

}

 

 

10.sysdate - 1/8640含义

表示当前时间的1秒, 1/24/60/60

11. 当出现ORA-12514:无法识别的数据库连接字符串时

是因为程序所在的文件夹带有括号,请特别注意。

强烈建议:程序文件夹最好不要用括号或者中文字体之类,应该使用规范的英文命名。

 

12. 数据库连接字符串

1. 对于SQL SERVER数据库

       conDB->Close();

        conDB->ConnectionString ="Provider=SQLOLEDB.1;Password=" +

        (WideString)lpPass + ";Persist Security Info=True;User ID=" + lpUserID +

        ";Initial Catalog=" + lpDataBase + ";Data Source="+lpSqlServer;

 

"Provider=SQLOLEDB.1;Password=sasa1234;Persist Security Info=True;User ID=sa;Initial Catalog=fyc;Data Source=192.168.32.6"

 

 

 

 

 

 

2. 对于ORACLE数据库

       conDB->Close();

        conDB->ConnectionString ="Provider=OraOLEDB.Oracle.1;Password=" +

        (WideString)lpPass + ";Persist Security Info=True;User ID=" + lpUserID +

        ";Data Source=" + lpDataBase + ";Extended Properties=''";

 

"Provider=OraOLEDB.Oracle.1;Password=watermon;Persist Security Info=True;User ID=watermon;Data Source=Dev;Extended Properties=''"

 

13. oracle怎样修改表名、列名、字段类型、添加表列、删除表列

ALTER TABLE 表名 RENAME TO  新表名 --修改表名

ALTER TABLE 表名 RENAME COLUMNNAME TO NAME1 --修改表列名

ALTER TABLE 表名 MODIFY NAME1 NUMBER(20)  --修改字段类型

ALTER TABLE 表名 ADD    列名 VARCHAR2(40) --添加表列

ALTER TABLE 表名 DROP   COLUMN COLUMNNAME --删除表列

 

复制表: create table new_table as select * from knowed_table

 

14.  关于使用logInfo

a.         包含 logdll.dll,  logdll.lib logdllapi.h

b.         在头文件定义Hlog logHandle

c.         cpp文件添加logInfo函数

 

15.  关于使用memcpy的一个例子

memcpy(++msg, FilePathName.c_str(), FilePathNameLength);

msg += FilePathNameLength - 1;

16.  如何生成文件

//定义文件指针(需要包含头文件#include <stdio.h>)

FILE *fp;

//打开文件

fp = fopen(FilePathName.c_str(), "a+");

//输出到文件

fprintf(fp, Msg.c_str());

//关闭文件

fclose(fp);

17.  如何定义全局变量指针

main函数的前面定义int *pointer = (int *)malloc(5);或者 int *pointer = new int;

在要使用全局变量的类的头文件中定义extern int *pointer;     //引用全局变量

 

18TerminateThread()的使用

A thread cannot protect itself against TerminateThread, other than by controlling access to its handles.

不能在一个线程里面执行TerminateThread().

       if(rHandle)

        {

          DWORD lpExitCode;

          if(::GetExitCodeThread(rHandle, &lpExitCode))

          {

            if(lpExitCode == STILL_ACTIVE)

            {

              printf("/nlpExitCode = %d", lpExitCode);

              //线程还在运行

              printf("/n线程还在运行");

              //SetEvent(m_hEventClose);

              //WaitForMultipleObjects(1, &m_hEventCloseEd, TRUE, INFINITE);

            }

            else

            {

              printf("/n线程已经结束");

            }

          }

        }

       if(rHandle)

        {

                 TerminateThread(rHandle, 0);

                 CloseHandle(rHandle);

                 rHandle = NULL;

                 ComDataModule->logInfo("/n关闭线程成功");

        }

19.数据库连接字符串

1. 对于SQL SERVER数据库

       conDB->Close();

    conDB->ConnectionString ="Provider=SQLOLEDB.1;Password=" +

        (WideString)lpPass + ";Persist Security Info=True;User ID=" + lpUserID +

        ";Initial Catalog=" + lpDataBase + ";Data Source="+lpSqlServer;

 

"Provider=SQLOLEDB.1;Password=sasa1234;Persist Security Info=True;User ID=sa;Initial Catalog=fyc;Data Source=192.168.32.6"

 

 

2. 对于ORACLE数据库

       conDB->Close();

        conDB->ConnectionString ="Provider=OraOLEDB.Oracle.1;Password=" +

        (WideString)lpPass + ";Persist Security Info=True;User ID=" + lpUserID +

        ";Data Source=" + lpDataBase + ";Extended Properties=''";

 

"Provider=OraOLEDB.Oracle.1;Password=watermon;Persist Security Info=True;User ID=watermon;Data Source=Dev;Extended Properties=''"

 

20. 安装SQLSERVER数据库出现的问题导致无法安装

问题描述:

     SQL Server 2005 卸载之后重新安装,在执行检查时报:对性能监视器计数器注册表值执行系统配置检查失败。有关详细信息,请参阅自述文件或 SQL Server 联机丛书中的“如何在 SQL Server 2005 中为安装程序增加计数器注册表项值”。

解决方案:

在开始==>运行==>regedit.exe ,在注册表里找 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Perflib 里面有 Last Counter  Last Help 选项查看其相应的值之后。如果你安装中文版HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Perflib/004里面找到  Counter Help  查看它们的最大值 ,在它们的最大值基础上加2赋给Last CounterLast Help 确定即可,无需重启。 如果你安装的是英文版,在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows

NT/CurrentVersion/Perflib/009里找到 Counter Help  查看它们的最大值,执行上面的操作即可

21   如何写SQL SERVER数据库的update触发器

1update触发器中可以用两个系统表 分别是 inserted deleted

2inserted表中存这更新后的所有数据

3deleted 存着更新前的所有数据

4update(列名字)可以测试一个列是否被更新了

有了上面的知识,写update触发器就一切ok了。

22   如何写SQL SERVER数据库里创建表的SQL语句

创建新表的同时复制数据:             

select * into gpsinfo_20090506  from alarmstatus

只创建新表,没有复制数据:

select * into gpsinfo_20090502 from alarmstatus where 1 = 0

创建新表的同时有条件地复制数据

select * into gpsinfo_20090502 from alarmstatus where uniqueid > 1

如果表存在,复制表数据(源表和目标表不能有自增变量)

insert into alarmstatus_1 (terminalcode, status) select terminalcode, status from alarmstatus_2

或者insert into insert into alarmstatus_1 select * from alarmstatus_2

23   如何在SQL SERVER数据库里判断某表是否存在

select count(*) as qty from dbo.sysobjects where name = 'gpsinfo_20090501'

select count(*)  qty from dbo.sysobjects where name = 'gpsinfo_20090501';

qty=0 不存在

qty=1 存在

注意:不能使用select * from gpsinfo_20090501方式来查询,否则会造成对象名无效的错误

 

24.  gettickcount()的用法

用于计算时间,相当于计时器。当达到计时效果时,要注意重置计时为当前时间,开始重新计时。

25.  移位

Int value = 1899932 -----1CFD9C

使用三个字节表示

Char cvalue[0] = 0x1c;

Char cvalue[1] = 0xfd;

Char cvalue[2] = 0x9c;

 

1

(value >>16)  &  0xff

>>16:右移16位,即2个字节占用的位置,去掉低16位的数值,即得到0x1c

& 0xff 0x001c

              &0x00ff

        _________

                     0x1c

2

(value >>8)  &  0xff

>>8:右移8位,即1个字节占用的位置,去掉低8位的数值,即得到0xfd

& 0xff 0x00fd

              &0x00ff

        _________

                     0xfd

3

Value & 0xff

& 0xff  0x009c

              &0x00ff

        _________

                     0x9c

26.  int,long int, unsigned int,unsigned long int,long long的表示范围问题

intlong int二者的范围是一致的,都是-2^31---2^31-1,能表示的最大值是0x7FFFFFFF;

unsigned intunsigned long int二者的范围也是一致的,都是0---2^32-1,能表示的最大值是0xFFFFFFFF;

long long 使用的意义:

long long a;

 a = atoi(inputdata);

 if(a<0x1 || a>0xFFFFFFFF)

 return BOOL_FALSE;

在这里,当用户恰好输入0xFFFFFFFF这个值时,程序就不会认为它是非法的。但是当使用int a或者unsigned int a时程序将会认为非法输入。

27.  关键字static 的作用是什么?

这个简单的问题很少有人能回答完全。在C 语言中,关键字static 有三个明显的作用:

在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

28. 几种变量的定义

a)    int a;

b)    int *a;

c)    int **a;

d)    int a[10];

e)    int *a[10];

f)     int (*a)[10];

g)    int (*a)(int);

h)    int (*a[10])(int);

Delphi多线程下的ADO编程  Delphi多线程下的ADO编程  前言:几个月前接到一个任务:将一后台程序访问数据库的方式从BDE改为ADO,原因是由于业务量的增加,通过BDE不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受,大家都知道ADO在数据库访问速度方面比BDE要快的多了(我写了一个测试程序使用ADO比使用BDE快了近100倍!)。这个任务还不简单嘛,只要将BDE的控件更换成ADO 阅读详情

相关推荐

P问题,NP问题,NPC问题,NPH问题概念。’0/1背包判定问题是NPC问题‘和‘0/1背包问题是NPH问题但不是NPC问题’以及碰撞集是NPC问题‘证明。

(2)b个点的vertex cover 集 对应规模大小为b的碰撞集 :对于每一条边,至少有一个端点在b个点的vertex cover集 中,所以这个集合和。(1)构建图G为碰撞集的映射:其中图G的每一个点对应碰撞集的每个元素,每条边对应。(3)规模大小为b的碰撞集对应b个点的vertex cover集:任意的。但0/1背包判定问题是NPC问题,0/1背包问题不比其更容易,所以,它是NPH问题。综上所述,顶点覆盖问题可以归约到碰撞集,因此碰撞集也是NPC问题。,在多项式时间内可以完成,故碰撞集是NP问题

2301_79707017的博客 1816

如何解决没有找到borlndmm.dll或cc3260mt.dll的错误

http://peng-jun.blog.163.com/blog/static/2156281420093159319722/

彭军的专栏 4888

P问题,NP问题,NPC问题,以及三者之间的关系

一、以下是从百度知道上转载来的关于P问题,NP问题,NPC问题的解释 1、P问题 P是一个判定问题类,这些问题可以用一个确定性算法在多项式时间内判定或解出。如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则我们说这种可以在多项式时间内解决的判定性问题属于P类问题。P类问题就是所有复杂度为多项式时间的问题的集合。 NP是一个判定问题类,这些问题可以用一个确定算法在多项

chenchao's blog 7528

delphi ADOQuery多线程查询

多线程查询 //============================================================================== // 多线程查询 cxg 2008-09-26 14:29:42 //=========================================================================

dwzjs的专栏 1583

BDE与ADO的比较

BDE与ADO的比较 BDE简介.  要开发数据库应用程序首先要解决数据源的问题,那么什么是数据源呢?简单来讲数据源就是实实在在的数据,通常是各种数据表。  有了数据源我们就有了开发程序的依据,然而一般情况下应用程序并不能直

*咏雪*的博客 1990

P问题、NP问题、NPC问题、NP hard问题

图论算法摘要 1. 图的概念 图 一个图(graph) G=(V,E)G=(V,E)G=(V,E) 由顶点(vertex)集 VVV 和边(edge)集 EEE 组成。 每一条边就是一个点对 (a,b),a,b∈V(a,b),a,b∈V(a,b),a,b∈V。有时候也把边叫做弧(arc)。 有向图 如果点对(a,b),a,b∈V(a,b),a,b∈V(a,b),a,b∈V是有序的,那么图就是有向的...

LittleBee的博客 4万+

P问题、NP问题、NP完全问题和NP难问题

转载出处。 https://blog.csdn.net/qq_21768483/article/details/80430590 在讲P类问题之前先介绍两个个概念:多项式,时间复杂度。(知道这两概念的可以自动跳过这部分) 1、多项式:axn-bxn-1+c 恩....就是长这个样子的,叫x最高次为n的多项式.... 咳咳,别嫌我啰嗦。。有些人说不定还真忘了啥是多项式了。。例如第...

u014044032的博客 7万+

[总结]算法中的P问题、NP问题、NP完全问题和NP难问题

啊啊

databatman的工厂 6万+

算法4类问题:P问题、NP问题、NP完全问题、NP难问题

算法4类问题:P问题、NP问题、NP完全问题、NP难问题

m0_65207522的博客 5692

到底什么是NP问题,NP hard问题,NP完全问题

网上胡写的太多了。 时间复杂度 时间复杂度并不是表示一个程序解决问题需要花多少时间,而是当问题规模扩大后,程序需要的时间长度增长得有多快。也就是说,对于高速处理数据的计算机来说,处理某一个特定数据的效率不能衡量一个程序的好坏,而应该看当这个数据的规模变大到数百倍后,程序运行时间是否还是一样,或者也跟着慢了数百倍,或者变慢了数万倍。 不管数据有多大,程序处理花的时间始终是那么多的,我们就说这个程序很好,具有O(1)O(1)O(1)的时间复杂度,也称常数级复杂度;数据规模变得有多大,花的时间也跟着变得有多长,这

勤奋的懒猫的博客 3万+

P问题、NP问题、NPC问题、NPH问题详解

P: Polynomial NP:Pon-deterministic Polynomial NP-Hard(NPH) NP-Complete(NPC) P 问题, 可以理解为:常数增长、线性增长问题 NP问题, 可以理解为:指数增长问题 要理解P问题、NP问题、NPC问题、NP-hard问题,需要先弄懂几个概念: 什么是多项式时间? 什么是确定性算法?什么是非确定性算法? 什么是规约/约化? 文章目录多项式时间(Polynomial time)确定性算法与非确定性算法确定性算法:非确定性算法:规.

学习日常记录 1万+

什么是NP问题,什么是NP hard问题,什么是NP完全问题

http://www.cs.pitt.edu/~ztliu/wordpress/2011/05/np-problem/ 首先解释一下什么是NP问题,什么是NP hard问题,什么是NP完全问题。 看下面的图,他们之间的关系表示的比较清楚。 P Problem:这个应该最易理解,就是一个问题可以在Polynominal的时间的得到解决,当然,是对于任意input size。 NP

百川汇海 6万+

什么是P问题、NP问题和NPC问题

    这或许是众多OIer最大的误区之一。    你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你要知道,大多数人此时所说的NP问题其实都是指的NPC问题。他们没有搞清楚NP问题和NPC问题的概念。NP问题并不是那种“只有搜才行”的问题,NPC问题才是。好,行了,基本上这个误解已经被澄清了。下面的内容都是在讲什么是P问题,什

matrix67的专栏 3237

P问题、NP问题、NPC问题、NP-hard问题详解

本文摘要:时间复杂度衡量算法随问题规模扩大的性能变化,分为常数级O(1)、线性O(n)、平方O(n²)及指数级复杂度。P类问题可在多项式时间内求解,NP类问题可在多项式时间内验证解。NPC问题是NP中最难的问题,所有NP问题可规约到它。NP-Hard问题范围更广,可能不属于NP类。P⊆NP,而NPC=NP∩NP-Hard。理解这些概念对区分高效算法(多项式时间)与不实用算法(指数时间)至关重要,其中NPC问题的解决意味着所有NP问题的解决。

人无远虑,必有近忧 6012

P问题、NP问题、NPC问题和NPH问题

P问题 理解P问题需要了解的知识:多项式、时间复杂度。 多项式:ax^n-bx^n-1+c,就是在数学上经常见到的式子。 时间复杂度:指执行算法所需要的计算工作量,它定性描述该算法的运行时间。时间复杂度常用大O表述,例如O(n^2),代表其时间复杂度为n^2。 P问题:存在多项式时间算法的问题。(P:polynominal,多项式)。通俗来讲,如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题。例如,给定一个数组需...

qq_37164897的博客 2321

【算法】P问题 NP问题 NPC问题 NPH问题的定义与理解

一.前言 二.多项式 三.时间复杂度 四.P问题 五.NP问题 六.NPH问题,NPC问题 七.已经被证明的NPC问题 八.一些具体问题的总结 九.总结 一.前言        在讨论算法的时候,常常会说到这个问题的求解是个P类问题,或者是NP难问题等等,同时最近上课正在做算法分析与设计关于NP完全问题这一章的作业的时候,发现有很多概念理解的不是很透彻,然后就反复看老师的讲义,...

qq_36193984的博客 9613

NP问题,不可解问题

NP问题概要:NP问题集中研究 P?=NP。现在普遍认为P!=NP。 P问题(polynomial):多项式时间内可以求出解的问题,polynomial中文意思是多项式。信息学竞赛出的问题都是P类问题,因为让你用指数级的时间来搜索答案的问题毫无意义。 NP问题:在多项式时间内可以验证一个解是否正确的问题。这里假设有一台非确定性图灵机,什么是非确定性图灵机呢?通俗点说就是一台可以猜出一个问题的解的机器

#include 3412
上一篇: sql sever数据库与oracle数据库的一些常用操作
下一篇: 详谈ROM和RAM的异同
lennyf
博客等级 码龄20年 16粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值