DatabaseImport
从文件导入数据到表格中。
long DatabaseImport(
int database, // 在DatabaseOpen中接收的数据库句柄
const string table, // 要插入数据的表格名称
const string filename, // 要导入数据的文件名
uint flags, // 标识组合
const string separator, // 数据分隔符
ulong skip_rows, // 要跳过多少初始字符串
const string skip_comments // 定义注释的字符串
);参数
database
[in] 在DatabaseOpen()中接收的数据库句柄。
table
[in] 将要添加文件数据的表格名称。
filename
[in] 用于读取数据的CSV文件或ZIP存档文件。该名称可能包含子目录,并且是相对于MQL5\Files文件夹设置。
flags
[in] ENUM_DATABASE_IMPORT_FLAGS枚举中的标识组合。
separator
[in] CSV文件中的数据分隔符。
skip_rows
[in] 当从文件读取数据时,要跳过的初始字符串数。
skip_comments
[in] 用于将字符串指定为注释的字符串。如果在字符串的开头检测到skip_comments中的任何字符,那么该字符串将被视为注释,并不被导入。
返回值
返回导入字符串的数量,如果出现错误则返回-1。要获得错误代码,请使用GetLastError(),可能回应:
- ERR_INVALID_PARAMETER (4003) – 没有指定表格名称(空字符串或NULL);
- ERR_DATABASE_INTERNAL (5120) – 内部数据库错误;
- ERR_DATABASE_INVALID_HANDLE (5121) - 无效数据库句柄。
注意
如果没有名为table的表格,则自动生成该表。根据文件数据自动定义创建表格中的名称和字段类型。
ENUM_DATABASE_IMPORT_FLAGS
| ID | 描述 |
|---|---|
| DATABASE_IMPORT_HEADER | 第一行包含表格字段的名称 |
| DATABASE_IMPORT_CRLF | CRLF(默认为LF)被认为是字符串中断 |
| DATABASE_IMPORT_APPEND | 将数据添加到现有表格末端 |
| DATABASE_IMPORT_QUOTED_STRINGS | 用双引号括住字符串值 |
| DATABASE_IMPORT_COMMON_FOLDER | 该文件存储在所有客户端的常规文件夹\Terminal\Common\File。 |
从DatabaseExport示例中的代码创建的文件中读取表格的示例:
//+------------------------------------------------------------------+
//| 脚本程序起始函数 |
//+------------------------------------------------------------------+
void OnStart()
{
string csv_filename;
//--- 从客户端的通用文件夹获取要下载的文本文件的名称
string filenames[];
if(FileSelectDialog("Select a CSV file to download a table", NULL,
"Text files (*.csv)|*.csv",
FSD_WRITE_FILE|FSD_COMMON_FOLDER, filenames, "data.csv")>0)
{
//--- 显示每个选定文件的名称
if(ArraySize(filenames)==1)
csv_filename=filenames[0];
else
{
Print("Unknown error while selecting file. Error code ", GetLastError());
return;
}
}
else
{
Print("CSV file not selected");
return;
}
//--- 创建或打开数据库
string db_filename="test.sqlite";
int db=DatabaseOpen(db_filename, DATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE);
//--- 检查TEST表格是否存在
if(DatabaseTableExists(db, "TEST"))
{
//--- 移除TEST表格
if(!DatabaseExecute(db, "DROP TABLE IF EXISTS TEST"))
{
Print("Failed to drop the TEST table with code ", GetLastError());
DatabaseClose(db);
return;
}
}
//--- 从文件导入条目到TEST表格
long imported=DatabaseImport(db, "TEST", csv_filename, DATABASE_IMPORT_HEADER|DATABASE_IMPORT_COMMON_FOLDER|DATABASE_IMPORT_APPEND, ";", 0, NULL);
if(imported>0)
{
Print(imported," lines imported in table TEST");
DatabasePrint(db,"SELECT * FROM TEST",DATABASE_PRINT_NO_INDEX);
}
else
{
Print("DatabaseImport() failed. Error ",GetLastError());
}
//--- 关闭数据库文件并告知
DatabaseClose(db);
PrintFormat("Database: %s closed", db_filename);
}