亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sqlitetable3u.pas

?? 定時(shí)器for timer for ic chip
?? PAS
?? 第 1 頁 / 共 2 頁
字號(hào):
Unit SQLiteTable3U;

{
  Simple classes for using SQLite's exec and get_table.

  TSQLiteDatabase wraps the calls to open and close an SQLite database.
  It also wraps SQLite_exec for queries that do not return a result set

  TSQLiteTable wraps sqlite_get_table.
  It allows accessing fields by name as well as index and can step through a
  result set with the Next procedure.

  Adapted by Tim Anderson (tim@itwriting.com)
  Originally created by Pablo Pissanetzky (pablo@myhtpc.net)
  Modified and enhanced by Lukas Gebauer
}
{$I Sqlite.inc}
Interface

Uses
  Windows, SQLite3Lib, Sqlite3Types, TntClasses, Classes, SysUtils;

Type
  ESQLiteException = Class(Exception)
  End;

  TSQLiteTable = Class;

  TSQLiteDatabase = Class
  Private
    fPassWord, fOldPassWord: WideString;
    fDB: TSQLiteDB;
    fInTrans: boolean;
    Procedure RaiseError(s: WideString; SQL: WideString);
  Public
    Constructor Create(Const FileName: WideString; Const PassWord: WideString = '');
    Destructor Destroy; Override;
    Function GetTable(Const SQL: WideString): TSQLiteTable;
    Procedure ExecSQL(Const SQL: WideString);
    Function GetTableValue(Const SQL: WideString): int64;
    Function GetTableString(Const SQL: WideString): WideString;
    Procedure UpdateBlob(Const SQL: WideString; BlobData: TStream);
    Procedure BeginTransaction;
    Procedure Commit;
    Procedure Rollback;
    Function TableExists(TableName: WideString): boolean;
    Function GetLastInsertRowID: int64;
    Procedure SetTimeout(Value: integer);
    Function version: WideString;
    Property DB: TSQLiteDB Read fDB;
  Published
    Property isTransactionOpen: boolean Read fInTrans;
    Property PassWord: WideString Read fPassWord Write fPassWord;
  End;

  TSQLiteTable = Class
  Private
    fResults: TList;
    fRowCount: cardinal;
    fColCount: cardinal;
    fCols: TTntStrings;
    fColTypes: TList;
    fRow: cardinal;
    Function GetFields(I: cardinal): WideString;
    Function GetEOF: boolean;
    Function GetBOF: boolean;
    Function GetColumns(I: integer): WideString;
    Function GetFieldByName(FieldName: WideString): WideString;
    Function GetFieldIndex(FieldName: WideString): integer;
    Function GetCount: integer;
    Function GetCountResult: integer;
  Public
    Constructor Create(DB: TSQLiteDatabase; Const SQL: WideString);
    Destructor Destroy; Override;
    Function FieldAsInteger(I: cardinal): int64;
    Function FieldAsBlob(I: cardinal): TMemoryStream;
    Function FieldAsBlobText(I: cardinal): WideString;
    Function FieldIsNull(I: cardinal): boolean;
    Function FieldAsString(I: cardinal): WideString;
    Function FieldAsDouble(I: cardinal): double;
    Function Next: boolean;
    Function Previous: boolean;
    Property Eof: boolean Read GetEOF;
    Property BOF: boolean Read GetBOF;
    Property Fields[I: cardinal]: WideString Read GetFields;
    Property FieldByName[FieldName: WideString]: WideString Read GetFieldByName;
    Property FieldIndex[FieldName: WideString]: integer Read GetFieldIndex;
    Property Columns[I: integer]: WideString Read GetColumns;
    Property ColCount: cardinal Read fColCount;
    Property RowCount: cardinal Read fRowCount;
    Property Row: cardinal Read fRow;
    Function MoveFirst: boolean;
    Function MoveLast: boolean;
    Property Count: integer Read GetCount;
    // The property CountResult is used when you execute count(*) queries.
    // It returns 0 if the result set is empty or the value of the
    // first field as an integer.
    Property CountResult: integer Read GetCountResult;
  End;

Procedure DisposePointer(ptr: pointer); cdecl;
Function UTF8(Const ASQL: WideString): PAnsiChar;
Function UnUTF8(Const AUTF: String): WideString;

Implementation

Procedure DisposePointer(ptr: pointer); Cdecl;
Begin
  If Assigned(ptr) Then
    FreeMem(ptr);
End;

Function UTF8(Const ASQL: WideString): PAnsiChar;
Begin
  Result := PAnsiChar(UTF8Encode(ASQL));
End;

Function UnUTF8(Const AUTF: String): WideString;
Begin
  Result := UTF8DeCode(AUTF);
End;

//------------------------------------------------------------------------------
// TSQLiteDatabase
//------------------------------------------------------------------------------

Constructor TSQLiteDatabase.Create(Const FileName: WideString; Const PassWord: WideString = '');
Var
  Msg: PAnsiChar;
  iResult: integer;
Begin
  Inherited Create;
  SQLite3LoadLibrary;
  self.fInTrans := False;

  Msg := Nil;
  Try
    iResult := SQLite3_Open(UTF8(FileName), fDB);

    If iResult <> SQLITE_OK Then
      If Assigned(fDB) Then
      Begin
        Msg := Sqlite3_ErrMsg(fDB);
        Raise ESQLiteException.CreateFmt('Failed to open database "%s" : %s',
          [FileName, Msg]);
      End
      Else
        Raise ESQLiteException.CreateFmt('Failed to open database "%s" : unknown error',
          [FileName]);
    If PassWord <> '' Then
    Begin
      fPassWord := PassWord;
      fOldPassWord := fPassWord;
      {$IFDEF UseSQLiteCrypt}
      If Assigned(SqLite3_Key) Then
        SqLite3_Key(fDB, UTF8(fPassWord), Length(fPassWord) * 2);
      {$ENDIF}
    End;
    //set a few configs
    self.ExecSQL('PRAGMA SYNCHRONOUS=NORMAL;');
    //    self.ExecSQL('PRAGMA full_column_names = 1;');
    self.ExecSQL('PRAGMA temp_store = MEMORY;');

  Finally
    If Assigned(Msg) Then
      SQLite3_Free(Msg);
  End;

End;

//..............................................................................

Destructor TSQLiteDatabase.Destroy;
Begin

  If self.fInTrans Then
    self.ExecSQL('ROLLBACK;');          //assume rollback

  If WideCompareStr(FPassWord, FOldPassWord) <> 0 Then
  Begin
    {$IFDEF UseSQLiteCrypt}
    If Assigned(SqLite3_Rekey) Then
      SqLite3_Rekey(fDB, UTF8(fPassWord), Length(fPassWord) * 2);
    {$ENDIF}
  End;

  If Assigned(fDB) Then
    SQLite3_Close(fDB);
  SQLite3FreeLibrary;
  Inherited;
End;

Function TSQLiteDatabase.GetLastInsertRowID: int64;
Begin
  Result := SQLite3_Last_Insert_RowID(self.fDB);
End;

//..............................................................................

Procedure TSQLiteDatabase.RaiseError(s: WideString; SQL: WideString);
//look up last error and raise an exception with an appropriate message
Var
  Msg: PAnsiChar;
Begin

  Msg := Nil;

  If SQLite3_ErrCode(self.fDB) <> SQLITE_OK Then
    Msg := Sqlite3_ErrMsg(self.fDB);

  If Msg <> Nil Then
    Raise ESQLiteException.CreateFmt(s + ' "%s" : %s', [SQL, Msg])
  Else
    Raise ESQLiteException.CreateFmt(s, [SQL, 'No message']);

End;

Procedure TSQLiteDatabase.ExecSQL(Const SQL: WideString);
Var
  Stmt: TSQLiteStmt;
  NextSQLStatement: PAnsiChar;
  iStepResult: integer;
Begin
  Try

    If Sqlite3_Prepare(self.fDB, UTF8(SQL), -1, Stmt, NextSQLStatement) <>
      SQLITE_OK Then
      RaiseError('Error executing SQL', SQL);

    If (Stmt = Nil) Then
      RaiseError('Could not prepare SQL statement', SQL);

    iStepResult := Sqlite3_step(Stmt);

    If (iStepResult <> SQLITE_DONE) Then
      RaiseError('Error executing SQL statement', SQL);

  Finally

    If Assigned(Stmt) Then
      Sqlite3_Finalize(Stmt);

  End;
End;

Procedure TSQLiteDatabase.UpdateBlob(Const SQL: WideString; BlobData: TStream);
Var
  iSize: integer;
  ptr: pointer;
  Stmt: TSQLiteStmt;
  Msg: PAnsiChar;
  NextSQLStatement: PAnsiChar;
  iStepResult: integer;
  iBindResult: integer;
Begin
  //expects SQL of the form 'UPDATE MYTABLE SET MYFIELD = ? WHERE MYKEY = 1'

  If Pos('?', SQL) = 0 Then
    RaiseError('SQL must include a ? parameter', SQL);

  Msg := Nil;
  Try

    If Sqlite3_Prepare(self.fDB, UTF8(SQL), -1, Stmt, NextSQLStatement) <>
      SQLITE_OK Then
      RaiseError('Could not prepare SQL statement', SQL);

    If (Stmt = Nil) Then
      RaiseError('Could not prepare SQL statement', SQL);

    //now bind the blob data
    iSize := BlobData.size;

    GetMem(ptr, iSize);

    If (ptr = Nil) Then
      Raise ESQLiteException.CreateFmt('Error getting memory to save blob',
        [SQL, 'Error']);

    BlobData.position := 0;
    BlobData.Read(ptr^, iSize);

    iBindResult := SQLite3_Bind_Blob(Stmt, 1, ptr, iSize, @DisposePointer);

    If iBindResult <> SQLITE_OK Then
      RaiseError('Error binding blob to database', SQL);

    iStepResult := Sqlite3_step(Stmt);

    If (iStepResult <> SQLITE_DONE) Then
      RaiseError('Error executing SQL statement', SQL);

  Finally

    If Assigned(Stmt) Then
      Sqlite3_Finalize(Stmt);

    If Assigned(Msg) Then
      SQLite3_Free(Msg);
  End;

End;

//..............................................................................

Function TSQLiteDatabase.GetTable(Const SQL: WideString): TSQLiteTable;
Begin
  Result := TSQLiteTable.Create(self, SQL);
End;

Function TSQLiteDatabase.GetTableValue(Const SQL: WideString): int64;
Var
  Table: TSQLiteTable;
Begin
  Result := 0;
  Table := self.GetTable(SQL);
  Try
    If Table.RowCount > 0 Then
      Result := Table.FieldAsInteger(0);
  Finally
    Table.Free;
  End;
End;

Function TSQLiteDatabase.GetTableString(Const SQL: WideString): WideString;
Var
  Table: TSQLiteTable;
Begin
  Result := '';
  Table := self.GetTable(SQL);
  Try
    If Table.RowCount > 0 Then
      Result := Table.FieldAsString(0);
  Finally
    Table.Free;
  End;
End;

Procedure TSQLiteDatabase.BeginTransaction;
Begin
  If Not self.fInTrans Then
  Begin
    self.ExecSQL('BEGIN TRANSACTION;');
    self.fInTrans := True;
  End
  Else
    Raise ESQLiteException.Create('Transaction already open');
End;

Procedure TSQLiteDatabase.Commit;
Begin
  self.ExecSQL('COMMIT;');
  self.fInTrans := False;
End;

Procedure TSQLiteDatabase.Rollback;
Begin
  self.ExecSQL('ROLLBACK;');
  self.fInTrans := False;
End;

Function TSQLiteDatabase.TableExists(TableName: WideString): boolean;
Var
  SQL: WideString;
  ds: TSQLiteTable;
Begin
  //returns true if table exists in the database
  SQL := 'select [sql] from sqlite_master where [type] = ''table'' and lower(name) = ''' +
    LowerCase(TableName) + ''' ';
  ds := self.GetTable(SQL);
  Try
    Result := (ds.Count > 0);
  Finally
    ds.Free;
  End;
End;

Procedure TSQLiteDatabase.SetTimeout(Value: integer);
Begin
  SQLite3_Busy_Timeout(self.fDB, Value);
End;

Function TSQLiteDatabase.version: WideString;
Begin
  Result := SQLite3_LibVersion;
End;

//------------------------------------------------------------------------------
// TSQLiteTable
//------------------------------------------------------------------------------

Constructor TSQLiteTable.Create(DB: TSQLiteDatabase; Const SQL: WideString);
Var

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国精品在线观看| 蜜桃av一区二区三区电影| 国产乱子伦视频一区二区三区 | 国产精品免费免费| 成人午夜又粗又硬又大| 1区2区3区欧美| 欧美性色黄大片手机版| 日本sm残虐另类| 中文字幕成人av| 欧美三级蜜桃2在线观看| 国产主播一区二区三区| 麻豆91在线观看| 激情综合网av| 亚洲免费毛片网站| 久久亚洲综合色| 色婷婷亚洲综合| 国产综合色视频| 国内成人免费视频| 国产成人综合网站| 美女www一区二区| 免费在线看成人av| 精品午夜久久福利影院| 韩日av一区二区| 国产成人福利片| 99久久久精品免费观看国产蜜| 日韩高清不卡一区二区三区| 亚洲日本在线a| 精品三级在线看| 欧美三级中文字| 91精品在线免费观看| 91在线免费看| 欧美日韩视频在线一区二区| 日韩欧美激情一区| 欧美日韩免费高清一区色橹橹 | 在线观看中文字幕不卡| 国产高清在线精品| 97se亚洲国产综合在线| 欧美精品一二三四| 色婷婷精品久久二区二区蜜臂av| 欧美色视频在线| 欧美一级高清片| 91精品国产免费| 欧美日韩国产大片| 久久毛片高清国产| 欧美精品一区二区三区在线播放| 欧美一区二视频| 欧美国产亚洲另类动漫| 亚洲在线视频一区| 亚洲一区二区三区中文字幕在线| 免费在线观看精品| 99国产精品国产精品久久| 欧美日韩视频一区二区| 中国色在线观看另类| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲欧美日韩综合aⅴ视频| 日韩国产精品久久| 色综合色狠狠天天综合色| 这里只有精品免费| 亚洲欧美另类小说视频| 国产一区 二区| 欧美精品在线观看播放| 亚洲欧美aⅴ...| 国产一区二区三区四区五区美女| 91片黄在线观看| 欧美人狂配大交3d怪物一区| 国产精品看片你懂得| 亚洲黄色性网站| 免费日韩伦理电影| 日本高清不卡视频| 日韩亚洲电影在线| 亚洲国产日韩在线一区模特 | 亚洲国产精品激情在线观看| 日韩国产在线一| 精品一区二区三区在线观看国产 | 亚洲欧美日韩久久精品| 国产成人免费9x9x人网站视频| 欧美一区三区二区| 午夜不卡av在线| 国产成a人亚洲精品| 欧美性色欧美a在线播放| 亚洲欧洲另类国产综合| 成人天堂资源www在线| 国产丝袜在线精品| 亚洲成人在线网站| 国内精品视频一区二区三区八戒| 欧美久久高跟鞋激| 日韩影院精彩在线| 欧美日韩夫妻久久| 日韩国产成人精品| 精品日韩欧美在线| 久久99精品网久久| 久久精品视频免费观看| 国产精品一二三四五| 中文字幕永久在线不卡| 91在线视频官网| 亚洲444eee在线观看| 欧美老年两性高潮| 久久国产夜色精品鲁鲁99| 91年精品国产| 亚洲国产一区二区视频| 91精品国产综合久久久久| 日本aⅴ亚洲精品中文乱码| www日韩大片| 成人a区在线观看| 精品不卡在线视频| 成人精品在线视频观看| 亚洲欧美日韩在线| 日韩丝袜情趣美女图片| 国产馆精品极品| 一区二区三区国产精华| 成人av动漫网站| 亚洲一区免费观看| 欧美v亚洲v综合ⅴ国产v| 国产91对白在线观看九色| 亚洲另类中文字| 日韩欧美国产一二三区| 粉嫩av一区二区三区在线播放| 一区二区在线观看视频在线观看| 欧美日韩国产天堂| 国产99精品国产| 亚洲二区在线视频| 久久免费看少妇高潮| 欧美色欧美亚洲另类二区| 国产在线不卡一区| 亚洲福利视频导航| 国产欧美一区二区在线观看| 国产精品一区二区免费不卡| 一区二区理论电影在线观看| 久久色在线观看| 欧美网站大全在线观看| 国产精品66部| 日韩av中文字幕一区二区| 中文字幕一区在线| 国产视频一区二区在线观看| 欧美日韩视频专区在线播放| 成人午夜大片免费观看| 免费精品视频在线| 亚洲综合一区在线| 国产精品乱子久久久久| 精品免费一区二区三区| 欧美日免费三级在线| 91原创在线视频| 国产69精品一区二区亚洲孕妇| 久久丁香综合五月国产三级网站| 亚洲国产日韩综合久久精品| 国产精品伦理在线| 国产日韩精品一区二区三区| 日韩视频在线永久播放| 欧美日韩国产首页| 91福利在线导航| 色国产精品一区在线观看| 高清shemale亚洲人妖| 国产一区二区精品久久91| 日韩 欧美一区二区三区| 亚洲18色成人| 午夜电影网一区| 午夜精品久久久久久久久| 亚洲国产中文字幕| 亚洲bt欧美bt精品| 视频一区二区中文字幕| 亚洲va在线va天堂| 亚洲第一主播视频| 香蕉av福利精品导航| 香蕉久久一区二区不卡无毒影院| 亚洲综合一区在线| 婷婷成人综合网| 奇米精品一区二区三区在线观看 | 欧美一区三区四区| 日韩丝袜美女视频| 精品对白一区国产伦| 26uuu精品一区二区| 中文字幕乱码久久午夜不卡| 国产精品久久久久久一区二区三区| 国产精品免费丝袜| 亚洲激情网站免费观看| 亚洲1区2区3区4区| 久久不见久久见免费视频1| 精品一区在线看| www.欧美色图| 国产麻豆日韩欧美久久| 国产精品1区2区| 91香蕉视频mp4| 欧美日韩专区在线| 日韩欧美国产麻豆| 国产欧美一区视频| 一区二区三区日韩欧美| 婷婷丁香久久五月婷婷| 国产老妇另类xxxxx| 91成人免费电影| 日韩女优制服丝袜电影| 欧美激情一区在线| 亚洲成人一区二区在线观看| 久久99国产精品尤物| 99麻豆久久久国产精品免费| 91麻豆精品国产综合久久久久久| 欧美va亚洲va| 亚洲女人的天堂| 国产在线不卡视频| 欧美午夜影院一区| 国产亚洲欧美日韩日本|