1:定义表的结构和名字,我使用以下方法:
public interface Constatnts extends BaseColumns {
public static final String TABLE_NAME = "test";
public static final String TIME = "time";
public static final String TITLE = "title";
}
在这里,我继承BaseColumns的目的,是直接定义"_ID"字段
2:定义SQLiteOpenHelper 的子类,来对应一个数据库,重载必须的onCreate 和 onUpgrade。里面通过execSQL调用适当的SQL 语句。
@Override
// 这个函数会在第一次执行数据库操作的时候被调用到。
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + TIME
+ " INTEGER," + TITLE + " TEXT NOT NULL);"); //注意,最好声明字段类型,以免不必要的麻烦。
} ......
一个网友问我一个关于@@IDENTITY的问题。他的数据库中有一个存储过程,有 insert语句,然后马上就用SELECT @@IDENTITY取刚插入的ID值,通常这是没有问题的,但是问题是ID实际上已经达到了100多万了,而 SELECT @@IDENTITY 返回的只有很小的值(才30多),令人费解。
我开始也不太明白,问他先别管@@IDENTITY,新插入记录,ID是多少。他说ID是100多万那么大的数。不是才几十那么小。我帮他分析可能性,是不是identity到了最大限,且identity最大是2的64次方。他说int 最大值是 2,147,483,647,他的ID离溢出还早呢, 但是 return @@IDENTITY 就是 很小的值(只有几十)。我然后又帮他分析道,是不是ID的值被重置过?他说不是,他说现在新插入的 id 就是 170多万。说到这里,我了解了一点了。我建议他用scope_identity(table_name)函数来取指定表的IDENTITY。我们以前有过经验,@@IDENTITY和IDENTITY_CURRENT()都不是很理想,因为它们会受当前表的范围影响。通常有触发器就会引起@@IDENTITY不能正确地取值,IDENTITY_CURRENT()也是如此。幸好有scope_identity(table_name)函数。在这种情况下就只能用这个。这时他才想起来,他的表有触发器。呵呵,迟了点。我建议他最好 ......
// 判断是否是数值型 By yangxiao 2007.7.21
function isNumeric(strText: WideString): Boolean;
var
s: string;
i, l, p: Integer;
begin
Result := False;
l := Length(strText);
if l = 0 then Exit;
s := '';
for i:=1 to l do
begin
case strText[i] of
'0'..'9':
s := s + strText[i];
'E', 'e', '+', '-', '.':
begin
p := PosEx(strText[i], strText, i+1);
if p = 0 then
begin
case strText[i] of
'E', 'e':
if (i=1) or (i=l) then Exit;
......
开发步骤:
1、创建ActiveX Library工程。
2、创建COM Object。
3、创建Type Library,并创建相应接口。
4、创建接口对应的函数和实现。
具体如下:
1、创建ActiveX Library工程。
new|other|activeX|activeX library
Delphi会自动生成框架代码,直接编译的话就可以得到一个dll文件了;
如果想编译出来的是ocx文件,在export上面独立一行加入 {$E ocx} 声明;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
这四个例程并不是我们编写的,它们都在ComServ单元例实现.例程DllGetClassObject通过CLSID得到支持IClassFactory接口的对象
;例程DllCanUnloadNow判断DLL是否可从内存卸载;DllRegisterServer和DllUnregisterServer负责DLL的注册和解除注册,其具体
的功能由ComServer实现。 ......
开发步骤:
1、创建ActiveX Library工程。
2、创建COM Object。
3、创建Type Library,并创建相应接口。
4、创建接口对应的函数和实现。
具体如下:
1、创建COM Object。
new|other|activeX|com object
在Class Name(本例里类名里填Object,可按自己需要填写) 填写类名.(Instancing:实例创建方式,Threading Model:线程模式.) 其
中Implemented Interface(接口名)自动生成.
uses变成如下:
uses
ComServ,
Project1_TLB in 'Project1_TLB.pas',
Unit1 in 'Unit1.pas' {Ojbect: CoClass};
加入了
{$R *.TLB}
并且生成了单元文件,以后的接口实现在这个单元里完成。 ......
开发步骤:
1、创建ActiveX Library工程。
2、创建COM Object。
3、创建Type Library,并创建相应接口。
4、创建接口对应的函数和实现。
具体如下:
3、创建Type Library,并创建相应接口。
view|type library
找到已经生成的type library,其实和TLB文件是对应的。
我们可以看到上一步生成的对象也含在里面。
我们在里面生成新的方法,并定义好方法的参数。
注意:integer和String在OCX里对应的类型分别为long和BStr或者WideString。目的是为了便于网络上传播时各个系统兼容的需要。
返回值必须为指针类型,Modifier为返回标志,[in]为输入参数,[out,RetVal]为输出加返回值。
在Class Name(本例里类名里填Object,可按自己需要填写) 填写类名.(Instancing:实例创建方式,Threading Model:线程模式.) 其
中Implemented Interface(接口名)自动生成.
点刷新按钮之后,在TLB和实现单元里都有了关于这个接口函数的定义。
剩下的只要在实现单元里完成实现的代码即可。
4、创建接口对应的函数和实现。
具体实现。
type
TOjbect = class(TTypedComObject, IOjbect)
protected
function Method1(Param1, Param2: Integer; ou ......