기고글 토론 "SQL 및 MQL5: SQLite 데이터베이스로 작업하기" - 페이지 3

 

테스트 스크립트:

//--- 포함 
#include <MQH\Lib\SQLite3\SQLite3Base.mqh>
//--- 변수
CSQLite3Base   sql3;
CSQLite3Table  testTable;
CSQLite3Cell   testCell;
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 데이터베이스 연결 열기
   if(sql3.Connect("test.db3")!=SQLITE_OK)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("CONNECTED TO DB.");
//--- 테이블 생성
   if(sql3.Query("DROP TABLE IF EXISTS [test]")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   if(sql3.Query("CREATE TABLE [test] ([i] INT)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("TABLE CREATED.");
//--- 값 삽입
   if(sql3.Query("INSERT INTO [test] VALUES(1)")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   else
      Print("VALUE \"1\" INSERTED.");
//--- 테이블 행 개수 계산
   if(sql3.Query(testTable,"SELECT COUNT(*) FROM [test]")!=SQLITE_DONE)
     {Print(sql3.ErrorMsg()); DebugBreak(); return;}
   testTable.Cell(0,0,testCell);
   Print("RETRIEVED DATA FROM TABLE : Count(*)=",testCell.GetInt());
   
  }
//+------------------------------------------------------------------+

+비교를 위해 int ViewInt() 안에 인쇄 및 테스트 __int d0을 추가했습니다.

      Print(__FUNCSIG__," || ENTER FUNCTION");
      
      //--- TEST d0 
      __int d0={0};  Print ("TEST d0: d0.v=",d0.v, " DATA d.b:"); ArrayPrint(d0.b);
      ViewArray(d0.b,0,4);
      Print("ViewArray OUTPUT: d0.v=",d0.v," DATA d.b:"); ArrayPrint(d0.b);
      
      //--- d - AS WAS+일부 인쇄물
      __int d; d.v=0; Print("\n","d AS WAS: d.v=",d.v," DATA d.b:"); ArrayPrint(d.b);
      ViewArray(d.b,0,4);
      Print("ViewArray OUTPUT: d.v=",d.v, " DATA d.b:"); ArrayPrint (d.b);
      //---
       return(d.v);

OUTPUT:

//DB에 연결되었습니다.
//테이블이 생성되었습니다.
//값 "1"이 삽입되었습니다.
//int CSQLite3Cell::GetInt() || 함수 입력
//int CSQLite3Cell::GetInt() || type=CT_INT 케이스
//int CByteImg::ViewInt() || 함수 입력
//TEST d0: d0.v=0 DATA d.b:
//0 0 0 0
//ViewArray OUTPUT: d0.v=1 DATA d.b:
//1 0 0 0
// 
//d AS WAS: d.v=0 DATA d.b:
//0 0 0 0
//ViewArray 출력: d.v=0 DATA d.b:
//10 0 0
// 테이블에서 가져온 데이터 : Count(*)=0

이전 게시물을 작성하기 전에 @o_o 님의 코드를 읽었고 유니온이 있다는 것을 완벽하게 보았기 때문에이 버그도 이상해 보였지만 분명히 존재합니다.

그러나 라이브러리(코드 아래쪽의 ViewArray와 생성자 __int)에서 이 버그를 찾지 못했습니다( ). 그러나 OUTPUT에서 강조 표시된 내용 (유니온의 경우 분명히 이상 함)을 통해 "종류"컴파일러가 ViewArray (.b 만 작동 함) 이후에 __int의 변경 사항을 보지 못하고 캐시에서 .v = 0 (강조 표시됨) 대해 마지막으로 알려진 값을 반환했다고 가정 할 수 있습니다 .v 자체를 "보지 않고" d. v를 "보지 않고".

하지만 여기서는 컴파일러 자체를 보지 못했기 때문에 가정만 하고 있으며, 다시 말씀드리지만 코드에서 이 버그와 관련된 오류를 발견하지 못했습니다.

 
MetaQuotes Software Corp.:

새 문서 SQL 및 MQL5: SQLite 데이터베이스 작업하기가 게시되었습니다:

작성자: o_O


안녕하세요, 좋은 글입니다.

 

안녕하세요,

스크립트를 실행할 때 2 개의 경고가 표시됩니다:

2017.09.26 07:39:35.569 SQLite3Test 'C:\사용자\로만\앱데이터\로밍\메타쿼츠\터미널\MQL5\라이브러리\sqlite3_32.dll'은 64비트 버전이 아닙니다.

2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' [193] 로드할 수 없습니다.


라이브러리 32와 64 모두 아카이브에 있었습니다. Win7 64가 있습니다. 이해가 안 됩니다 - 어떻게 해야 하나요?


 
rvkstudent:
스크립트를 실행할 때 2개의 경고가 표시됩니다:

2017.09.26 07:39:35.569 SQLite3Test 'C:\Users\Roman\AppData\Roaming\MetaQuotes\Terminal\MQL5\Libraries\sqlite3_32.dll' 64비트 버전이 아님
2017.09.26 07:39:35.602 SQLite3Test (GAZP,H1) 'C:\사용자\로밍\앱데이터\로밍\메타쿼츠\터미널\MQL5\라이브러리\sqlite3_32.dll' [193] 로드할 수 없습니다.

라이브러리 32와 64 모두 아카이브에 있었습니다. Win7 64가 있습니다. 이해가 되지 않습니다 - 어떻게 해야 하나요?

아무것도

이것은 가져 오기에 대한 MT의 반응이지만 코드는 계속 작동합니다.

부록에 PrintTable 함수에 대한 수정 사항이 있습니다.

파일:
sql_ft__mql5.zip  808 kb
 
MetaQuotes Software Corp.:

새 문서 SQL 및 MQL5: SQLite 데이터베이스 작업하기 문서가 게시되었습니다:

작성자: o_O


32비트 버전이 있나요?

문제는 32 비트 고객이 많다는 것입니다 ...

 

안녕하세요.

SQLite3Test.mq5를 실행하면 오류 14(SQLITE_CANTOPEN)가 발생합니다. 제가 뭘 잘못하고 있나요?

 
Serhii Shevchuk:

안녕하세요.

SQLite3Test.mq5를 실행하면 오류 14(SQLITE_CANTOPEN)가 발생합니다.

제가 뭘 잘못하고 있나요?

오류 위치를 디버깅하거나 로깅하지 않음

 
o_o:

디버깅하지 않거나 오류 위치를 로그에 인쇄하지 않습니다.

1. 아카이브에서 스크립트를 "있는 그대로" 실행합니다.

2. "실제 데이터에서" 디버그합니다. 첫 번째 함수를 입력합니다:

//--- 데이터베이스 연결 열기
   if(sql3.Connect("SQLite3Test.db3")!=SQLITE_OK)
      return;

3. SQLite3Base.mqh 파일에서 이 위치로 이동합니다:

int CSQLite3Base::Reconnect()
  {
   Disconnect();
   uchar file[];
   StringToCharArray(m_dbfile,file);
   int res=::sqlite3_open(file,m_db);
   m_bopened=(res==SQLITE_OK && m_db);
   return(res);
  }

4. 줄을 실행한 후

int res=::sqlite3_open(file,m_db);

14와 같은 res를 얻습니다. 이것이 스크립트의 끝입니다.

기사의 텍스트로 판단하면 다음과 같아야합니다.

"В результате работы появится файл базы данных в папке установки терминала MetaTrader 5."

그 이유는 무엇일까요? 어느 쪽을 봐야 할까요?

 

다운로드한 스크립트를 확인했습니다.


처음에 모든 것이 올바르게 작동했습니다.




세히이 셰브추크:

어느 방향으로 봐야 하나요?

여기서 시작

 
o_o:

다운로드한 스크립트를 확인했습니다.

저도 확인했습니다:

여전히 오류 14입니다.

도움을 받기가 어렵다는 것을 알고 있습니다. 제가 직접 알아내야겠네요. 이 예제가 모든 곳에서 작동하는 것은 아니라는 점을 명심하세요. 이유를 모르겠어요.