Форум » [x]Harbour » Как прицепится к ADS по сети ? » Ответить

Как прицепится к ADS по сети ?

Dima: Есть ADS 10.10 в настройках у него стоит порт 6262 Вот таким исходником пытаюсь к нему подрубиться. [pre2] #include "ads.ch" proc main REQUEST ADS rddSetDefault( "ADSCDX" ) SET SERVER REMOTE SET CHARTYPE TO OEM ? AdsConnect("MYSERVER") // .f. ? AdsConnect("//127.0.0.1/:6262") // .f. return [/pre2] ADS.INI в папке с прогой [pre2] [MYSERVER] LAN_IP=127.0.0.1 LAN_PORT=6262 [/pre2] Где мой косяк ?

Ответов - 257, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 All

Dima: Haz пишет: INTO #TmpBase совсем другое дело ее корректировать можно

Haz: Вообще при использовании SQL я перестал использовать USE cBase SHARED и тд сами таблицы закидываю в словарь, а работаю с ними только через курсоры, без прямого открытия через USE. Все редактируется и удаляется тоже в курсорах. Индексы создаю по всем полям по которым будет выборка и почти не использую Dbseek(). Обленился , вся оптимизация в мозгах у сервера а не в моей голове ) Добавлю еще : в больших по числу записей таблицах стараюсь на держать строки а только ID на строку в справочнике т.к. всегда могу склеить для показа запросом, зато скорости выборки фантастические

Dima: Haz пишет: Вообще при использовании SQL я перестал использовать USE cBase SHARED и тд у меня все наоборот ;)


Haz: Dima пишет: у меня все наоборот ;) сам лет десять делал наоборот )))) пока не появилась задача клеить на лету из 10 баз одну добило сравнение кода на clipper/harbour против одной строки запроса

Dima: Haz пишет: лучше сразу в SQL прописать SELECT * INTO #TmpBase FROM ... WHERE ... а закрывать ее как обычно ? adssql->(dbclosearea()) AdsDisconnect( hh )

Haz: рабочая область закрывается через dbclosearea() AdsDisconnect - перед выходом из программы и то без него сервер обнаружит висяк и обрубит сам

Haz: вот мой вызов SQL FUNCTION SQL( cAlias, cSql, lLog ) LOCAL cTempAlias := '_TMP' + NToC( SECONDS() ) LOCAL lClose := FALSE LOCAL nSaveArea := Select() LOCAL i := 0 LOCAL nLog := 0 LOCAL cBuffer := '' IF lLog == NIL lLog := .F. END IF cAlias == NIL cAlias := cTempAlias lClose := .T. END IF lLog IF !File(DirPrg() + "\LogSql.Log") nLog := FCreate( DirPrg() + "\LogSql.Log" ) ELSE nLog := FOpen( DirPrg() + "\LogSql.Log", 66 ) END FSeek( nLog, 0, 2 ) cBuffer := DToC(Date()) + " " + Time() + " " + ProcName(1) + "()" + " -> " + cSql + CRLF FWrite( nLog, cBuffer, Len( cBuffer )) FClose(nLog) END IF (cAlias)->(USED()) ( cAlias ) ->( DBCLOSEAREA() ) END Select( 0 ) IF AdsCreateSqlStatement( cAlias, 3 ) IF ADSVERIFYSQL( cSql ) AdsExecuteSqlDirect( cSql ) ELSE IF MsgYesNo('Error in SQL statement' + CRLF+ cSql + CRLF + ; ' function = ' + ProcName(0) + " -> line = " + NTOC(ProcLine(0)) + CRLF + ; ' function = ' + ProcName(1) + " -> line = " + NTOC(ProcLine(1)) + CRLF + ; ' function = ' + ProcName(2) + " -> line = " + NTOC(ProcLine(2)) + CRLF + ; ' function = ' + ProcName(3) + " -> line = " + NTOC(ProcLine(3)) + CRLF + ; 'Закончить работу ?') MemoWrit( "_ERRSql.txt", cSql ) QUIT END END END IF lClose ( cAlias ) ->( DBCLOSEAREA() ) DBSELECTAREA( nSaveArea ) ELSE i := ASCAN( aSqlQuery, { | q | q[ 1 ] == UPPER(cAlias) } ) IF i == 0 AADD( aSqlQuery, { UPPER(cAlias), cSql } ) ELSE aSqlQuery[ i, 2 ] := cSql END END RETURN AdsGetLastError()

Dima: Haz пишет: AdsDisconnect - перед выходом из программы и то без него сервер обнаружит висяк и обрубит сам Нет ты не прав. Я же писал что работаю по старинке через USE и только в одном месте пока хочу устроить SQL выборку. А по сему основной хендл будет hh1:=AdsConnection() А коннект с запросом имеет свой hh adsConnect60( cDictionary, 0, "Guest", '', 7,@hh ) Это я проверил хендлы разные. Поэтому конструкция adssql->(dbclosearea()) AdsDisconnect( hh ) к висяку не приведет , проверил. Вопрос в том убьется ли в памяти база #TmpBase ? Haz пишет: Добавлю еще : в больших по числу записей таблицах стараюсь на держать строки а только ID на строку в справочнике т.к. всегда могу склеить для показа запросом, зато скорости выборки фантастические Да скорость очень даже

Haz: я имел ввиду что disconnect можно не делать . а временную таблицу ( не алиас ) нужно закрывать через "DROP TABLE #TempBase"

Dima: Haz пишет: "DROP TABLE #TempBase" вот что выходит sele adssql browse() sQlStr:="DROP TABLE #TmpBase" ? ADSVERIFYSQL(sQlStr) // .f. ? AdsExecuteSqlDirect(sQlStr) // .f. error 5109

Haz: Dima пишет: error 5109 пишет что курсор по этой таблице еще открыт

Dima: да я это читал , и не понял как же корректно убить в памяти таблицу #TmpBase или достаточно ADSSQL->(dbclosearea()) ?

Dima: Dima пишет: sele adssql browse() sQlStr:="DROP TABLE #TmpBase" ? ADSVERIFYSQL(sQlStr) // .f. ? AdsExecuteSqlDirect(sQlStr) // .f. если сделать так browse() adssql->(dbclosearea()) sQlStr:="DROP TABLE #TmpBase" ? ADSVERIFYSQL(sQlStr) // ФАЙЛ НЕ ОТКРЫТ ? AdsExecuteSqlDirect(sQlStr) // .f.

Haz: Dima пишет: или достаточно ADSSQL->(dbclosearea()) ? так только область закроется , а таблица останется жить в памяти надо и то и то сначала области позакрывать все из этой таблицы, а потом DROP саму временную таблицу

Haz: если сделать так browse() adssql->(dbclosearea()) sQlStr:="DROP TABLE #TmpBase" ? ADSVERIFYSQL(sQlStr) // ФАЙЛ НЕ ОТКРЫТ ? AdsExecuteSqlDirect(sQlStr) // .f. ` это должно работать правильно , из #TmpBase толко один SELECT ? и где AdsCreateSqlStatement() для запроса нужно все 3 вызова AdsCreateSqlStatement( cAlias, 2 ) ADSVERIFYSQL( cSql ) AdsExecuteSqlDirect( cSql )

Dima: Haz пишет: это должно работать правильно , из #TmpBase толко один SELECT ? ну да вроде. у меня открыто 2 базы , VOLVO через USE и выборка SQL c алиасом ADSSQL

Haz: для запроса нужно все 3 вызова AdsCreateSqlStatement( cAlias, 2 ) ADSVERIFYSQL( cSql ) AdsExecuteSqlDirect( cSql )

Dima: Haz пишет: и где AdsCreateSqlStatement( точно ! не доглядел , работает

Dima: насчет ROWID ты был прав , таблица становится READ ONLY , даже если юзать INTO #TmpBase

Haz: Dima пишет: насчет ROWID добавь поле ID - Integer и при DbAppend() что нибудь типа NewID() FUNC NewID() LOCAL nID := 0 SQL('GetID', 'SELECT TOP 1 ID FROM VolvoAT ORDER BY ID DESC') nId := GetID->ID GetID->(DbClosArea()) RETURN nId + 1 И далее пользуй ID а не Recno() ROWID думаю тоже можно поправить - определять его в образующем SELECT ROWID AS R, VaolvoAt.* INTO # тогда в темпбазу он должен перейти полем R.... ходя не проверял ( проверил - редактируется



полная версия страницы