'准备方式查询和执行SQL
'工作方式为:
'一：先用准备语句 Sqlite3_prepare 如：
'   INSERT INTO table1(中文,iii,rrr) VALUES(?,?,?)
'二：后来用写入语句补全SQL里的？号，没？号就不需要补写变量，适合任意数据
'  sqlite3_bind_int(ppStmt, index, value1)' 表示将value绑定给第index个参数,此编号是从1开始，而不是从0开始
'  sqlite3_bind_int64(ppStmt, index, value2)
'  sqlite3_bind_double(ppStmt, index, value3)
'  sqlite3_bind_text(ppStmt, index, ByVal StrPtr(value4),Len(value4), %Null)'最后一个参数好像是表示是否需要拷贝一份，这里的value是一个指针，防止其指向的对象被修改。
'  sqlite3_bind_blob(ppStmt, index, ByVal VarPtr(value5(0)),UBound(value5)+1, %Null)
'  sqlite3_bind_null(ppStmt, index)
'三：执行一次SQL sqlite3_step(ppStmt) 
'四：如是查询，就用读语句读取，否则不就需要
'          value1 = sqlite3_column_int(ppStmt, index)
'          value2 = sqlite3_column_int64(ppStmt, index)
'          value3 = sqlite3_column_double(ppStmt, index)
'          value = sqlite3_column_text(ppStmt, index) '数据指针
'          siz   = sqlite3_column_bytes(ppStmt, index)'数据长度
'          value4=Utf8ToChr(Peek(value,siz))
'          value = sqlite3_column_blob(ppStmt, index) '数据指针
'          siz   = sqlite3_column_bytes(ppStmt, index)'数据长度
'          ReDim value5(siz-1)
'          FF_MemCopy( value, VarPtr(value5(0)) , siz )
'五：sqlite3_finalize(ppStmt) '释放，必须的，不然内存会溢出
Function SQLitePrepare( ByVal db as  SQLite3 Ptr ,ByVal sSql as String ) as Long  '准备语句
''使用例题，这里只是例题，具体还要看内容
'    Local ppStmt,pszTail as  DWord 
'    Local index as Long   
'     sSql=StrToUtf8(sSql) & $Nul
'    Function = Sqlite3_prepare(hDB, ByVal StrPtr(sSQL), -1, ppStmt, pszTail)
''zSql：sql语句，使用UTF-8编码
''nByte：如果nByte小于0，则函数取出zSql中从开始到第一个0终止符的内容；如果nByte不是负的，
'        '那么它就是这个函数能从zSql中读取的字节数的最大值。如果nBytes非负，zSql在第一次遇见’/000/或’u000’的时候终止
''ppStmt：能够使用sqlite3_step()执行的编译好的准备语句的指针，如果错误发生，它被置为Null，如假如输入的文本不包括sql语句。
'         '调用过程必须负责在编译好的sql语句完成使用后使用sqlite3_finalize()删除它。
''pzTail：上面提到zSql在遇见终止符或者是达到设定的nByte之后结束，假如zSql还有剩余的内容，那么这些剩余的内容被存放到pZTail中，不包括终止符
''-------------
''写入参数
''如SQL是="Insert ... values(?, ?)"其中？表示绑定的参数
'  Local value1 as Long 
'  Local value2 as Quad 
'  Local value3 as Double
'  Local value4 as String 
'  Local value5() as Byte 
'  Local u,i as Long 
'  Local t as  Asciiz Ptr
'  Local bb as String
'  Local Value,siz as Long 
'  u=sqlite3_column_count(ppStmt) '根据select语句的对象，获取结果集中的字段数量，只有select才有，其实为0。
'  ? Str(u)
'  For i=0 To u-1
'    t=sqlite3_column_decltype(ppStmt,i) '获取其声明时的类型。
'                                        '返回值说明 
'                                         '1：SQLITE_INTEGER  
'                                         '2：SQLITE_FLOAT  
'                                         '3：SQLITE_TEXT  
'                                         '4：SQLITE_BLOB  
'                                         '5：SQLITE_NULL
'    t=sqlite3_column_name( ppStmt, i )   '获取字段名称
''    t=sqlite3_database_name( ppStmt, i )'获取数据库名称
''    t=sqlite3_table_name( ppStmt, i )  '获取表的名称
'    bb=@t
'    bb=Utf8ToChr(bb)
'    ? bb
'  Next
''  sqlite3_bind_int(ppStmt, index, value1)' 表示将value绑定给第index个参数,此编号是从1开始，而不是从0开始
''  sqlite3_bind_int64(ppStmt, index, value2)
''  sqlite3_bind_double(ppStmt, index, value3)
''  sqlite3_bind_text(ppStmt, index, ByVal StrPtr(value4),Len(value4), %Null)'最后一个参数好像是表示是否需要拷贝一份，这里的value是一个指针，防止其指向的对象被修改。
''  sqlite3_bind_blob(ppStmt, index, ByVal VarPtr(value5(0)),UBound(value5)+1, %Null)
''  sqlite3_bind_null(ppStmt, index)
'  'Int sqlite3_bind_text16(sqlite3_stmt*, Int, Const void*, Int, void(*)(void*));
'  'Int sqlite3_bind_value(sqlite3_stmt*, Int, Const sqlite3_value*);
' '正常返回SQLITE_OK。=0
'     While (sqlite3_step(ppStmt) = %SQLITE_ROW) '完成后退出                                                                                     
''          value1 = sqlite3_column_int(ppStmt, index)
''          value2 = sqlite3_column_int64(ppStmt, index)
''          value3 = sqlite3_column_double(ppStmt, index)
''          value = sqlite3_column_text(ppStmt, index) '数据指针
''          siz   = sqlite3_column_bytes(ppStmt, index)'数据长度
''          value4=Utf8ToChr(Peek(value,siz))
''          value = sqlite3_column_blob(ppStmt, index) '数据指针
''          siz   = sqlite3_column_bytes(ppStmt, index)'数据长度
''          ReDim value5(siz-1)
''          FF_MemCopy( value, VarPtr(value5(0)) , siz )
'          Value = sqlite3_column_text(ppStmt, 0) '数据指针
'          siz   = sqlite3_column_bytes(ppStmt, 0)'数据长度
'          value4=Utf8ToChr(Peek(Value,siz))
'FF_ListBox_AddString( HWND_FORM1_LIST1, value4 )
'     Wend 
' sqlite3_finalize(ppStmt) '释放
End Function
