DatabaseBindArray

将数组设置为参数值。

bool  DatabaseBind(

   int  request,      // DatabasePrepare中创建的请求句柄

   int  index,        // 请求中的参数索引

   T&   array[]       // 数组设为参数值

   );

参数

request

[in] DatabasePrepare()中创建的请求句柄。

index

[in]  应该为请求中的参数索引设置一个值。编号从0开始。

array[]

[in]  要设置为请求参数值的数组。

返回值

如果成功返回true,否则返回false。要获得错误代码,请使用GetLastError(),可能回应:

  • ERR_INVALID_PARAMETER (4003)              – 不支持类型;
  • ERR_ARRAY_BAD_SIZE (4011)                    - 数组大小(以字节为单位)超过INT_MAX;
  • ERR_DATABASE_INVALID_HANDLE (5121)  - 无效数据库句柄;
  • ERR_DATABASE_NOT_READY (5128)    - 目前无法使用该函数发出请求(请求正被执行或已经完成,应该调用DatabaseReset)。

注意

该函数在SQL请求包含"?"或"?N"参数化值的情况下被使用,这里N表示参数索引(从1开始)。同时,DatabaseBindArray()中的参数索引从0开始。

例如:

     INSERT INTO table VALUES (?,?,?)

该函数可以在DatabasePrepare()中创建参数化请求或使用DatabaseReset()重置请求之后立即调用。

将该函数与DatabaseReset()一起使用,可以根据需要使用不同的参数值来多次执行请求。

例如:

//+------------------------------------------------------------------+

//| 脚本程序起始函数                                                   |

//+------------------------------------------------------------------+

void OnStart()

  {

//--- 打开用于选择带有DAT扩展名的文件的对话框

   string selected_files[];

   if(!FileSelectDialog("Select files to download", NULL,

                       "Data files (*.dat)|*.dat|All files (*.*)|*.*",

                       FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)

     {

      Print("Files not selected. Exit");

      return;

     }

//--- 获取文件大小

   ulong filesize[];

   int filehandle[];

   int files=ArraySize(selected_files);

   ArrayResize(filesize, files);

   ZeroMemory(filesize);

   ArrayResize(filehandle, files);

   double total_size=0;

   for(int i=0; i<files; i++)

     {

      filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);

      if(filehandle[i]!=INVALID_HANDLE)

        {

         filesize[i]=FileSize(filehandle[i]);

         //PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);

         total_size+=(double)filesize[i];

        }

     }

//--- 检查常规文件大小

   if(total_size==0)

     {

      PrintFormat("Total files size is 0. Exit");

      return;

     }



//--- 在常规程序端文件夹中创建或打开数据库

   string filename="dat_files.sqlite";

   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);

   if(db==INVALID_HANDLE)

     {

      Print("DB: ", filename, " open failed with code ", GetLastError());

      return;

     }

   else

      Print("Database: ", filename, " opened successfully");

//--- 如果FILES表格已存在,请将其删除

   if(DatabaseTableExists(db, "FILES"))

     {

      //--- 删除表格

      if(!DatabaseExecute(db, "DROP TABLE FILES"))

        {

         Print("Failed to drop table FILES with code ", GetLastError());

         DatabaseClose(db);

         return;

        }

     }

//--- 创建FILES表格

   if(!DatabaseExecute(db, "CREATE TABLE FILES("

                       "NAME           TEXT NOT NULL,"

                       "SIZE           INT  NOT NULL,"

                       "PERCENT_SIZE   REAL NOT NULL,"

                       "DATA           BLOB NOT NULL);"))

     {

      Print("DB: failed to create table FILES with code ", GetLastError());

      DatabaseClose(db);

      return;

     }

//--- 显示FILES表格中所有字段列表

   if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)

     {

      PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") failed, error code=%d at line %d", GetLastError(), __LINE__);

      DatabaseClose(db);

      return;

     }



//--- 创建参数化请求,将文件添加到FILES表格中

   string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"

              " VALUES (?1,?2,?3,?4);"; // 请求参数

   int request=DatabasePrepare(db, sql);

   if(request==INVALID_HANDLE)

     {

      PrintFormat("DatabasePrepare() failed with code=%d", GetLastError());

      Print("SQL request: ", sql);

      DatabaseClose(db);

      return;

     }



//--- 检查所有文件并将其添加到FILES表格中

   bool request_error=false;

   DatabaseTransactionBegin(db);

   int count=0;

   uint size;

   for(int i=0; i<files; i++)

     {

      if(filehandle[i]!=INVALID_HANDLE)

        {

         char data[];

         size=FileReadArray(filehandle[i], data);

         if(size==0)

           {

            PrintFormat("FileReadArray(%s) failed with code %d", selected_files[i], GetLastError());

            continue;

           }



         count++;

         //--- 在将文件添加到表格之前设置参数值

         if(!DatabaseBind(request, 0, selected_files[i]))

           {

            PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());

            request_error=true;

            break;

           }

         if(!DatabaseBind(request, 1, size))

           {

            PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());

            request_error=true;

            break;

           }

         if(!DatabaseBind(request, 2, double(size)*100./total_size))

           {

            PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());

            request_error=true;

            break;

           }

         if(!DatabaseBindArray(request, 3, data))

           {

            PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());

            request_error=true;

            break;

           }

         //--- 执行插入条目的请求并检查错误

         if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))

           {

            PrintFormat("DatabaseRead() failed with code=%d", GetLastError());

            DatabaseFinalize(request);

            request_error=true;

            break;

           }

         else

            PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);

         //--- 在下一次参数更新之前重置请求

         if(!DatabaseReset(request))

           {

            PrintFormat("DatabaseReset() failed with code=%d", GetLastError());

            DatabaseFinalize(request);

            request_error=true;

            break;

           }

        }

     }

//--- 交易事务状态

   if(request_error)

     {

      PrintFormat("Table FILES: failed to add %d files", count);

      DatabaseTransactionRollback(db);

      DatabaseClose(db);

      return;

     }

   else

     {

      DatabaseTransactionCommit(db);

      PrintFormat("Table FILES: added %d files", count);

     }



//--- 关闭数据库文件并告知

   DatabaseClose(db);

   PrintFormat("Database: %s created and closed", filename);

  }

另见

DatabasePrepareDatabaseResetDatabaseReadDatabaseBind