Delphi DLL k MQL

 

Привет! Сделал ДЛЛ для работы с базой MSSQL. При передачи строки запроса SQL, происходит ошибка. При отладке видно что не коректно передаётся данные строки. Подозреваю что просто кусок данных из памяти. Использую PChar. Подскажите как правильо передать строку. Вот код DLL и MQL:

Delphi DLL

....

procedure RunSQL(strSQL: PChar); stdcall;
begin
CoInitialize(nil);
ShowMessage(strSQL);
ds.CommandText:= strSQL;
try
ds.Execute;
except
on E : Exception do
ShowMessage(Format ('%s The Hex errorCode is %x',[E.Message]));

end;

CoUnInitialize;
end;

....

MQL:

........

#import "DLL_SQL.dll"
void InitConnection(string DBParams);
void CloseConnection();
void RunSQL(string strSQL);
#import

int init()
{
InitConnection("kkk");
return(0);

}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
CloseConnection();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

RunSQL("UPDATE ClearingFarm SET ask = "+Ask+", bid = "+Bid+" WHERE (broker_id=5) and (symbol=\'"+Symbol()+"\')");

}

........

Cпасибо

 

Ну так ты смотри, сам же пишешь:

void RunSQL(string strSQL);

Код должен таким быть где-то:

string QUERY=StringConcentrate("UPDATE ClearingFarm SET ask = "+Ask+", bid = "+Bid+" WHERE (broker_id=5) and (symbol=\'"+Symbol()+"\')");
RunSQL(QUERY);
 

Я писал подобное.. при этом не использовал StringConcentrate

Проблем нет..

 
Red.Line писал (а):

Ну так ты смотри, сам же пишешь:

void RunSQL(string strSQL);

Код должен таким быть где-то:

string QUERY=StringConcentrate("UPDATE ClearingFarm SET 
ask = "+Ask+", bid = "+Bid+" WHERE (broker_id=5) and (symbol=\'"+Symbol()+"\')");
RunSQL(QUERY);

А это, StringConcentrate, что за зверь?

Наверное StringConcatenate?

Опять же, зачем если и так все плюсами уставлено?

Оно, конечно, не есть неправильно, но странно как-то. Или то, или другое...

По мне, так лучше StringConcatenate использовать, поскольку

1. Конкатенация плюсами крива, как турецкая сабля...

2. "Функция StringConcatenate() работает быстрее и экономнее по памяти, чем связывание строк при помощи операций сложения (+). " (из хелпа)

3. При использовании плюсов надо явно приводить double к int

Минусы:

Она неявно приводит double к четырем знакам после запятой. Что произойдет, если инструмент будет с пятью знаками? Это уже не редкость...

Самое корректное - это явно и в обязательном порядке использовать или DoubleToStr, или NormalizeDouble.

Вобщем, вот, сравните:

int start()
{
double dbBID, dbASK, dbTmp;
string sQUERY, sBID, sASK;
int iD; // BID, ASK, DIGITS

// только плюсы
sQUERY = "UPDATE ClearingFarm SET ask = " + Ask + ", bid = " + Bid +
" WHERE (broker_id = 5) AND (symbol = \'" + Symbol() + "\')";
Print(sQUERY, " (Только плюсы)");

// встроеная конкатенация
sQUERY = StringConcatenate(
"UPDATE ClearingFarm SET ask = ", Ask, ", bid = ", Bid,
" WHERE (broker_id = 5)AND (symbol = \'", Symbol(), "\')");
Print(sQUERY, " (Только конкатенация)");

// много цифров после запятой
dbTmp = 1.123456789;

sQUERY = "Test: " + dbTmp;
Print(sQUERY, " (Только плюсы)");

sQUERY = StringConcatenate("Test: ", dbTmp);
Print(sQUERY, " (Только конкатенация)");

// по уму
iD = Digits;

dbBID = NormalizeDouble(Bid, iD);
dbASK = NormalizeDouble(Ask, iD);
sQUERY = StringConcatenate(
"UPDATE ClearingFarm SET ask = ", dbASK, ", bid = ", dbBID,
" WHERE (broker_id = 5) AND (symbol = \'", Symbol(), "\')");
Print(sQUERY, " (NormalizeDouble & StringConcatenate)");

// или
sBID = DoubleToStr(Bid, iD);
sASK = DoubleToStr(Ask, iD);
sQUERY = StringConcatenate(
"UPDATE ClearingFarm SET ask = ", sBID, ", bid = ", sASK,
" WHERE (broker_id = 5) AND (symbol = \'", Symbol(), "\')");
Print(sQUERY, " (DoubleToStr & StringConcatenate)");

// или, если уж очень хочется плюсами
sQUERY = "UPDATE ClearingFarm SET ask = " + sASK + ", bid = " + sBID +
" WHERE (broker_id = 5) AND (symbol = \'" + Symbol() + "\')";
Print(sQUERY, " (DoubleToStr & плюсы)");

return(0);


Все сугубо имо. Я только начинающий, может старшие товарищи поправят ;)

 

Я обычно делаю буфер для строки из MT 4. Например так

procedure RunSQL(strSQL: PChar); stdcall;
var s: ShortString;
begin
  s := string(strSQL);
  CoInitialize(nil);
  ShowMessage(s);

...............