Chương trình chia sẻ CSDL qua Internet (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Còn nhiều thứ chưa xong lắm bạn, mã hóa, phân quyền, bãy lỗi ....... Mới xong mừng qué poss khoe xíu @$@^#
 
Còn nhiều thứ chưa xong lắm bạn, mã hóa, phân quyền, bãy lỗi ....... Mới xong mừng qué poss khoe xíu @$@^#
Khoe làm chi bạn ơi, có gì thì khoe luôn , giúp mọi người, không có mọi người cứ phụ thuộc hoài sản phẩm thương mại
Thực tình vấn đề này liên quan Excel thì khó, còn với app Web hay cloud ứng dụng thì mặc định đã có từ lâu
 
Buồn buồn ngồi mày mò Code cho đỡ Stress hihi

Vụ này giống Dương Quá, buồn vì mười mấy năm không gặp cô Long nên đã luyện thành tuyệt kỷ Ám Nhiên Tiêu Hồn Chưởng đây. :)
Chờ những phát triển tiếp của em, quan trọng là tính ứng dụng của nó.
 
Khoe làm chi bạn ơi, có gì thì khoe luôn , giúp mọi người, không có mọi người cứ phụ thuộc hoài sản phẩm thương mại
Thực tình vấn đề này liên quan Excel thì khó, còn với app Web hay cloud ứng dụng thì mặc định đã có từ lâu
Mình đưa vào excel thì được rồi đó, mà nhìn nó hơi 2 lúa. Chưa có ý tưởng gì
Những cái cốt lõi của cái CT của mình thì mình đã nói ra hết rồi. Mà không thấy ai làm hay hứng thú gì hết. Cứ đòi open. Mình thì không thích vậy.
Cũng giống như đợt hàm co giãn cũng vậy. Thấy có một số anh làm gần ra giống mình tự nhiên không thấy gì nữa, chắc có thể máy ảnh làm được rồi.
Bài đã được tự động gộp:

Vụ này giống Dương Quá, buồn vì mười mấy năm không gặp cô Long nên đã luyện thành tuyệt kỷ Ám Nhiên Tiêu Hồn Chưởng đây. :)
Chờ những phát triển tiếp của em, quan trọng là tính ứng dụng của nó.
Nó như mô hình client server thu nhỏ thôi anh. Hihi
Mò được bí kíp mà chưa lãnh hội hết anh. Cũng còn vướng những chỗ em từng hỏi đến giờ vẫn chưa hình dung ra được.
 
Lần chỉnh sửa cuối:
Trùm nhiều chuyện Nguyễn Thị Thanh Thủy cũng xinh dữ ta :D
Cho cu anh tui số phone, zalo đi bà trùm
 
Úi za thế mà lâu Mạnh cứ nghĩ là Anh ấy chứ ... hoá ra là Chị à .. thật rất lấy làm tiếc nhiều khi Mạnh buông lời lả lơi chút .... Sorry lắm lắm :D
 
Lần chỉnh sửa cuối:
Trùm nhiều chuyện Nguyễn Thị Thanh Thủy cũng xinh dữ ta :D
Cho cu anh tui số phone, zalo đi bà trùm

Cái hính đó không biết của ai nằm trong máy em sài thôi kkkk --=0.
Mà có gì không anh ?
Bài đã được tự động gộp:

Úi za thế mà lâu Mạnh cứ nghĩ là Anh ấy chứ ... hoá ra là Chị à .. thật rất lấy làm tiếc nhiều khi Mạnh buông lời lả lơi chút .... Sorry lắm lắm :D
-0-0-0-ủa cái chuyện đản bà đàn ông liên quan gì ở đây, xin lỗi anh nhé em chưa bao giờ nói mình là con gái để đi xin xỏ Code két nhé. -0-0-0-
Em là Ô mô -0-0-0-. Tồ Lô
 
Lần chỉnh sửa cuối:
Có ai nói gì đâu mà hôm nay mạnh mới biết đó chứ .... thui nhé
Vui vẻ he /*-*/
 
Hehe bình thường chứ có gì mà lăn tăn -0-/.
 
Hihi chuẩn bị có version 2 hihihi
 
Em xin phép hóng với ạ. Thanks ad
 
Em cũng xin phép ngồi hóng với ạ. Em chỉ dùng access với excel.
Nhân tiện khi xem video có nói đến mật khẩu của access, anh chị có thể cho e cách kết nối đến access có mật khẩu không ạ.
Em kết nối đến access có mật khẩu đều bị lỗi "invail passwork"
P/s: em xài office 2016
 
Em cũng xin phép ngồi hóng với ạ. Em chỉ dùng access với excel.
Nhân tiện khi xem video có nói đến mật khẩu của access, anh chị có thể cho e cách kết nối đến access có mật khẩu không ạ.
Em kết nối đến access có mật khẩu đều bị lỗi "invail passwork"
P/s: em xài office 2016

Bạn xem lại chuổi kết nối đã có thêm tham số mật khẩu chưa?
Vd:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Temp\Test.accdb;Jet OLEDB: Database Password=123456;
 
cái này cần thêm code bảo vệ của Python và CSS . trước tôi có làm cho 1 dự án của viettel giờ già quá lẩm cẩm lúc nhớ lúc không
Ví dụ 1 đoạn code bảo vệ kẻ xấu tân công qua IP
Mã:
### profile may optionally select or skip tests

# (optional) list included tests here:
tests: ['B201', 'B301']

# (optional) list skipped tests here:
skips: ['B101', 'B601']

### override settings - used to set settings for plugins to non-default values

any_other_function_with_shell_equals_true:
  no_shell: [os.execl, os.execle, os.execlp, os.execlpe, os.execv, os.execve,
    os.execvp, os.execvpe, os.spawnl, os.spawnle, os.spawnlp, os.spawnlpe,
    os.spawnv, os.spawnve, os.spawnvp, os.spawnvpe, os.startfile]
  shell: [os.system, os.popen, os.popen2, os.popen3, os.popen4,
    popen2.popen2, popen2.popen3, popen2.popen4, popen2.Popen3,
    popen2.Popen4, commands.getoutput,  commands.getstatusoutput]
  subprocess: [subprocess.Popen, subprocess.call, subprocess.check_call,
    subprocess.check_output]
Python mình thua, nhưng mình sẽ nghiên cứu vấn đề này, bạn có thể diễn giải cách thức được không ?
 
Mình có 1 đoạn code nhúng vào SQL để bảo mật rất tốt viếc = C++ . bạn thử xem
Mã:
/*******************************************************************************
/* ODBCSQL: a sample program that implements an ODBC command line interpreter.
/*
/* USAGE:   ODBCSQL DSN=<dsn name>   or
/*          ODBCSQL FILEDSN=<file dsn> or
/*          ODBCSQL DRIVER={driver name}
/*
/*
/* Copyright(c) Microsoft Corporation.   This is a WDAC sample program and
/* is not suitable for use in production environments.  
/*
/******************************************************************************/
/* Modules:
/*      Main                Main driver loop, executes queries.
/*      DisplayResults      Display the results of the query if any
/*      AllocateBindings    Bind column data
/*      DisplayTitles       Print column titles
/*      SetConsole          Set console display mode
/*      HandleError         Show ODBC error messages
/******************************************************************************/

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <stdlib.h>
#include <sal.h>


/*******************************************/
/* Macro to call ODBC functions and        */
/* report an error on failure.             */
/* Takes handle, handle type, and stmt     */
/*******************************************/

#define TRYODBC(h, ht, x)   {   RETCODE rc = x;\
                                if (rc != SQL_SUCCESS) \
                                { \
                                    HandleDiagnosticRecord (h, ht, rc); \
                                } \
                                if (rc == SQL_ERROR) \
                                { \
                                    fwprintf(stderr, L"Error in " L#x L"\n"); \
                                    goto Exit;  \
                                }  \
                            }
/******************************************/
/* Structure to store information about   */
/* a column.
/******************************************/

typedef struct STR_BINDING {
    SQLSMALLINT         cDisplaySize;           /* size to display  */
    WCHAR               *wszBuffer;             /* display buffer   */
    SQLLEN              indPtr;                 /* size or null     */
    BOOL                fChar;                  /* character col?   */
    struct STR_BINDING  *sNext;                 /* linked list      */
} BINDING;



/******************************************/
/* Forward references                     */
/******************************************/

void HandleDiagnosticRecord (SQLHANDLE      hHandle,    
                 SQLSMALLINT    hType,  
                 RETCODE        RetCode);

void DisplayResults(HSTMT       hStmt,
                    SQLSMALLINT cCols);

void AllocateBindings(HSTMT         hStmt,
                      SQLSMALLINT   cCols,
                      BINDING**     ppBinding,
                      SQLSMALLINT*  pDisplay);


void DisplayTitles(HSTMT    hStmt,
                   DWORD    cDisplaySize,
                   BINDING* pBinding);

void SetConsole(DWORD   cDisplaySize,
                BOOL    fInvert);

/*****************************************/
/* Some constants                        */
/*****************************************/


#define DISPLAY_MAX 50          // Arbitrary limit on column width to display
#define DISPLAY_FORMAT_EXTRA 3  // Per column extra display bytes (| <data> )
#define DISPLAY_FORMAT      L"%c %*.*s "
#define DISPLAY_FORMAT_C    L"%c %-*.*s "
#define NULL_SIZE           6   // <NULL>
#define SQL_QUERY_SIZE      1000 // Max. Num characters for SQL Query passed in.

#define PIPE                L'|'

SHORT   gHeight = 80;       // Users screen height

int __cdecl wmain(int argc, _In_reads_(argc) WCHAR **argv)
{
    SQLHENV     hEnv = NULL;
    SQLHDBC     hDbc = NULL;
    SQLHSTMT    hStmt = NULL;
    WCHAR*      pwszConnStr;
    WCHAR       wszInput[SQL_QUERY_SIZE];

    // Allocate an environment

    if (SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) == SQL_ERROR)
    {
        fwprintf(stderr, L"Unable to allocate an environment handle\n");
        exit(-1);
    }

    // Register this as an application that expects 3.x behavior,
    // you must register something if you use AllocHandle

    TRYODBC(hEnv,
            SQL_HANDLE_ENV,
            SQLSetEnvAttr(hEnv,
                SQL_ATTR_ODBC_VERSION,
                (SQLPOINTER)SQL_OV_ODBC3,
                0));

    // Allocate a connection
    TRYODBC(hEnv,
            SQL_HANDLE_ENV,
            SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc));

    if (argc > 1)
    {
        pwszConnStr = *++argv;
    }
    else
    {
        pwszConnStr = L"";
    }

    // Connect to the driver.  Use the connection string if supplied
    // on the input, otherwise let the driver manager prompt for input.

    TRYODBC(hDbc,
        SQL_HANDLE_DBC,
        SQLDriverConnect(hDbc,
                         GetDesktopWindow(),
                         pwszConnStr,
                         SQL_NTS,
                         NULL,
                         0,
                         NULL,
                         SQL_DRIVER_COMPLETE));

    fwprintf(stderr, L"Connected!\n");

    TRYODBC(hDbc,
            SQL_HANDLE_DBC,
            SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt));

    wprintf(L"Enter SQL commands, type (control)Z to exit\nSQL COMMAND>");

    // Loop to get input and execute queries

    while(_fgetts(wszInput, SQL_QUERY_SIZE-1, stdin))
    {
        RETCODE     RetCode;
        SQLSMALLINT sNumResults;

        // Execute the query

        if (!(*wszInput))
        {
            wprintf(L"SQL COMMAND>");
            continue;
        }
        RetCode = SQLExecDirect(hStmt,wszInput, SQL_NTS);

        switch(RetCode)
        {
        case SQL_SUCCESS_WITH_INFO:
            {
                HandleDiagnosticRecord(hStmt, SQL_HANDLE_STMT, RetCode);
                // fall through
            }
        case SQL_SUCCESS:
            {
                // If this is a row-returning query, display
                // results
                TRYODBC(hStmt,
                        SQL_HANDLE_STMT,
                        SQLNumResultCols(hStmt,&sNumResults));

                if (sNumResults > 0)
                {
                    DisplayResults(hStmt,sNumResults);
                }
                else
                {
                    SQLLEN cRowCount;

                    TRYODBC(hStmt,
                        SQL_HANDLE_STMT,
                        SQLRowCount(hStmt,&cRowCount));

                    if (cRowCount >= 0)
                    {
                        wprintf(L"%Id %s affected\n",
                                 cRowCount,
                                 cRowCount == 1 ? L"row" : L"rows");
                    }
                }
                break;
            }

        case SQL_ERROR:
            {
                HandleDiagnosticRecord(hStmt, SQL_HANDLE_STMT, RetCode);
                break;
            }

        default:
            fwprintf(stderr, L"Unexpected return code %hd!\n", RetCode);

        }
        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLFreeStmt(hStmt, SQL_CLOSE));

        wprintf(L"SQL COMMAND>");
    }

Exit:

    // Free ODBC handles and exit

    if (hStmt)
    {
        SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
    }

    if (hDbc)
    {
        SQLDisconnect(hDbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
    }

    if (hEnv)
    {
        SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    }

    wprintf(L"\nDisconnected.");

    return 0;

}

/************************************************************************
/* DisplayResults: display results of a select query
/*
/* Parameters:
/*      hStmt      ODBC statement handle
/*      cCols      Count of columns
/************************************************************************/

void DisplayResults(HSTMT       hStmt,
                    SQLSMALLINT cCols)
{
    BINDING         *pFirstBinding, *pThisBinding;          
    SQLSMALLINT     cDisplaySize;
    RETCODE         RetCode = SQL_SUCCESS;
    int             iCount = 0;

    // Allocate memory for each column

    AllocateBindings(hStmt, cCols, &pFirstBinding, &cDisplaySize);

    // Set the display mode and write the titles

    DisplayTitles(hStmt, cDisplaySize+1, pFirstBinding);


    // Fetch and display the data

    bool fNoData = false;

    do {
        // Fetch a row

        if (iCount++ >= gHeight - 2)
        {
            int     nInputChar;
            bool    fEnterReceived = false;

            while(!fEnterReceived)
            {  
                wprintf(L"              ");
                SetConsole(cDisplaySize+2, TRUE);
                wprintf(L"   Press ENTER to continue, Q to quit (height:%hd)", gHeight);
                SetConsole(cDisplaySize+2, FALSE);

                nInputChar = _getch();
                wprintf(L"\n");
                if ((nInputChar == 'Q') || (nInputChar == 'q'))
                {
                    goto Exit;
                }
                else if ('\r' == nInputChar)
                {
                    fEnterReceived = true;
                }
                // else loop back to display prompt again
            }

            iCount = 1;
            DisplayTitles(hStmt, cDisplaySize+1, pFirstBinding);
        }

        TRYODBC(hStmt, SQL_HANDLE_STMT, RetCode = SQLFetch(hStmt));

        if (RetCode == SQL_NO_DATA_FOUND)
        {
            fNoData = true;
        }
        else
        {

            // Display the data.   Ignore truncations

            for (pThisBinding = pFirstBinding;
                pThisBinding;
                pThisBinding = pThisBinding->sNext)
            {
                if (pThisBinding->indPtr != SQL_NULL_DATA)
                {
                    wprintf(pThisBinding->fChar ? DISPLAY_FORMAT_C:DISPLAY_FORMAT,
                        PIPE,
                        pThisBinding->cDisplaySize,
                        pThisBinding->cDisplaySize,
                        pThisBinding->wszBuffer);
                }
                else
                {
                    wprintf(DISPLAY_FORMAT_C,
                        PIPE,
                        pThisBinding->cDisplaySize,
                        pThisBinding->cDisplaySize,
                        L"<NULL>");
                }
            }
            wprintf(L" %c\n",PIPE);
        }
    } while (!fNoData);

    SetConsole(cDisplaySize+2, TRUE);
    wprintf(L"%*.*s", cDisplaySize+2, cDisplaySize+2, L" ");
    SetConsole(cDisplaySize+2, FALSE);
    wprintf(L"\n");

Exit:
    // Clean up the allocated buffers

    while (pFirstBinding)
    {
        pThisBinding = pFirstBinding->sNext;
        free(pFirstBinding->wszBuffer);
        free(pFirstBinding);
        pFirstBinding = pThisBinding;
    }
}

/************************************************************************
/* AllocateBindings:  Get column information and allocate bindings
/* for each column.  
/*
/* Parameters:
/*      hStmt      Statement handle
/*      cCols       Number of columns in the result set
/*      *lppBinding Binding pointer (returned)
/*      lpDisplay   Display size of one line
/************************************************************************/

void AllocateBindings(HSTMT         hStmt,
                      SQLSMALLINT   cCols,
                      BINDING       **ppBinding,
                      SQLSMALLINT   *pDisplay)
{
    SQLSMALLINT     iCol;
    BINDING         *pThisBinding, *pLastBinding = NULL;
    SQLLEN          cchDisplay, ssType;
    SQLSMALLINT     cchColumnNameLength;

    *pDisplay = 0;

    for (iCol = 1; iCol <= cCols; iCol++)
    {
        pThisBinding = (BINDING *)(malloc(sizeof(BINDING)));
        if (!(pThisBinding))
        {
            fwprintf(stderr, L"Out of memory!\n");
            exit(-100);
        }

        if (iCol == 1)
        {
            *ppBinding = pThisBinding;
        }
        else
        {
            pLastBinding->sNext = pThisBinding;
        }
        pLastBinding = pThisBinding;


        // Figure out the display length of the column (we will
        // bind to char since we are only displaying data, in general
        // you should bind to the appropriate C type if you are going
        // to manipulate data since it is much faster...)

        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLColAttribute(hStmt,
                    iCol,
                    SQL_DESC_DISPLAY_SIZE,
                    NULL,
                    0,
                    NULL,
                    &cchDisplay));


        // Figure out if this is a character or numeric column; this is
        // used to determine if we want to display the data left- or right-
        // aligned.

        // SQL_DESC_CONCISE_TYPE maps to the 1.x SQL_COLUMN_TYPE.
        // This is what you must use if you want to work
        // against a 2.x driver.

        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLColAttribute(hStmt,
                    iCol,
                    SQL_DESC_CONCISE_TYPE,
                    NULL,
                    0,
                    NULL,
                    &ssType));


        pThisBinding->fChar = (ssType == SQL_CHAR ||
                                ssType == SQL_VARCHAR ||
                                ssType == SQL_LONGVARCHAR);

        pThisBinding->sNext = NULL;

        // Arbitrary limit on display size
        if (cchDisplay > DISPLAY_MAX)
            cchDisplay = DISPLAY_MAX;

        // Allocate a buffer big enough to hold the text representation
        // of the data.  Add one character for the null terminator

        pThisBinding->wszBuffer = (WCHAR *)malloc((cchDisplay+1) * sizeof(WCHAR));

        if (!(pThisBinding->wszBuffer))
        {
            fwprintf(stderr, L"Out of memory!\n");
            exit(-100);
        }

        // Map this buffer to the driver's buffer.   At Fetch time,
        // the driver will fill in this data.  Note that the size is
        // count of bytes (for Unicode).  All ODBC functions that take
        // SQLPOINTER use count of bytes; all functions that take only
        // strings use count of characters.

        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLBindCol(hStmt,
                    iCol,
                    SQL_C_TCHAR,
                    (SQLPOINTER) pThisBinding->wszBuffer,
                    (cchDisplay + 1) * sizeof(WCHAR),
                    &pThisBinding->indPtr));


        // Now set the display size that we will use to display
        // the data.   Figure out the length of the column name

        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLColAttribute(hStmt,
                    iCol,
                    SQL_DESC_NAME,
                    NULL,
                    0,
                    &cchColumnNameLength,
                    NULL));

        pThisBinding->cDisplaySize = max((SQLSMALLINT)cchDisplay, cchColumnNameLength);
        if (pThisBinding->cDisplaySize < NULL_SIZE)
            pThisBinding->cDisplaySize = NULL_SIZE;

        *pDisplay += pThisBinding->cDisplaySize + DISPLAY_FORMAT_EXTRA;

    }

    return;

Exit:

    exit(-1);

    return;
}


/************************************************************************
/* DisplayTitles: print the titles of all the columns and set the
/*                shell window's width
/*
/* Parameters:
/*      hStmt          Statement handle
/*      cDisplaySize   Total display size
/*      pBinding        list of binding information
/************************************************************************/

void DisplayTitles(HSTMT     hStmt,
                   DWORD     cDisplaySize,
                   BINDING   *pBinding)
{
    WCHAR           wszTitle[DISPLAY_MAX];
    SQLSMALLINT     iCol = 1;

    SetConsole(cDisplaySize+2, TRUE);

    for (; pBinding; pBinding = pBinding->sNext)
    {
        TRYODBC(hStmt,
                SQL_HANDLE_STMT,
                SQLColAttribute(hStmt,
                    iCol++,
                    SQL_DESC_NAME,
                    wszTitle,
                    sizeof(wszTitle), // Note count of bytes!
                    NULL,
                    NULL));

        wprintf(DISPLAY_FORMAT_C,
                 PIPE,
                 pBinding->cDisplaySize,
                 pBinding->cDisplaySize,
                 wszTitle);
    }

Exit:

    wprintf(L" %c", PIPE);
    SetConsole(cDisplaySize+2, FALSE);
    wprintf(L"\n");

}


/************************************************************************
/* SetConsole: sets console display size and video mode
/*
/*  Parameters
/*      siDisplaySize   Console display size
/*      fInvert         Invert video?
/************************************************************************/

void SetConsole(DWORD dwDisplaySize,
                BOOL  fInvert)
{
    HANDLE                          hConsole;
    CONSOLE_SCREEN_BUFFER_INFO      csbInfo;

    // Reset the console screen buffer size if necessary

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    if (hConsole != INVALID_HANDLE_VALUE)
    {
        if (GetConsoleScreenBufferInfo(hConsole, &csbInfo))
        {
            if (csbInfo.dwSize.X <  (SHORT) dwDisplaySize)
            {
                csbInfo.dwSize.X =  (SHORT) dwDisplaySize;
                SetConsoleScreenBufferSize(hConsole, csbInfo.dwSize);
            }

            gHeight = csbInfo.dwSize.Y;
        }

        if (fInvert)
        {
            SetConsoleTextAttribute(hConsole, (WORD)(csbInfo.wAttributes | BACKGROUND_BLUE));
        }
        else
        {
            SetConsoleTextAttribute(hConsole, (WORD)(csbInfo.wAttributes & ~(BACKGROUND_BLUE)));
        }
    }
}


/************************************************************************
/* HandleDiagnosticRecord : display error/warning information
/*
/* Parameters:
/*      hHandle     ODBC handle
/*      hType       Type of handle (HANDLE_STMT, HANDLE_ENV, HANDLE_DBC)
/*      RetCode     Return code of failing command
/************************************************************************/

void HandleDiagnosticRecord (SQLHANDLE      hHandle,    
                             SQLSMALLINT    hType,  
                             RETCODE        RetCode)
{
    SQLSMALLINT iRec = 0;
    SQLINTEGER  iError;
    WCHAR       wszMessage[1000];
    WCHAR       wszState[SQL_SQLSTATE_SIZE+1];


    if (RetCode == SQL_INVALID_HANDLE)
    {
        fwprintf(stderr, L"Invalid handle!\n");
        return;
    }

    while (SQLGetDiagRec(hType,
                         hHandle,
                         ++iRec,
                         wszState,
                         &iError,
                         wszMessage,
                         (SQLSMALLINT)(sizeof(wszMessage) / sizeof(WCHAR)),
                         (SQLSMALLINT *)NULL) == SQL_SUCCESS)
    {
        // Hide data truncated..
        if (wcsncmp(wszState, L"01004", 5))
        {
            fwprintf(stderr, L"[%5.5s] %s (%d)\n", wszState, wszMessage, iError);
        }
    }
Ý mình bạn có thể nói sơ về cách thức tấn công á
 
65 tuổi mà giỏi vậy đó hả, post bài liên tục, cái này phả gọi là ông già gân quá hihihih
 
Sao thấy cái cách bạn nói chuyện thấy quen quen sao ý
Tôi thấy cũng ngờ ngợ, nhưng thôi biết cái gì hỗ trợ lẫn nhau là được rồi.
Ông/Bà xưa thường nói "Đánh kẻ chạy đi chứ ai đánh người chạy lại".
Quan điểm của tôi thì rất rõ ràng: Nếu thành viên nào tôi không thích hoặc họ đôi co thái quá tôi cho vào "Danh sách đen" để khỏi đọc bài của họ.
Tôi luôn nhớ câu nói của Ông/Bà xưa là "Một câu nhịn chín câu lành", nhẫn nhịn là điều tốt nhất ta sẽ không gây mất lòng cho ai cũng như không tạo sự ghen ghét cho ai và sẽ đem lại sự hài hòa cho mọi người.
 
Lần chỉnh sửa cuối:
Mình năm nay gần 70 tuổi rồi. Luôn ăn nói lịch sự. Mình mong muốn đem hết kiến thức mình giúp cho cộng đồng. Tôi yêu GPE. GPE là ngôi nhà của tôi
Cỡ đó thì cũng tương đương tuổi tôi thôi.
Bài 32 tôi dùng từ nào mà bạn cho là không lịch sự, tôi dùng từ ngờ ngợ có nghĩa là nghi ngờ, chứ có chỉ đích danh một người nào đó đâu.
 

Cập nhật bài mới để các bạn theo dõi Dowload và Comment
 
Lần chỉnh sửa cuối:
Xem video thì nó là cái Sever + Client + *.accdb đó chứ ??!!
 
Danh sách đăng ký dự thi Hội thi Giáo viên giỏi ứng dụng CNTT trong công tác giảng dạy tỉnh Đồng Nai lần thứ 4 năm 2013
4 Nguyễn Thị Thanh Thủy 1981 Nữ Trường Mầm non Ánh Dương thị xã Long Khánh, tỉnh Đồng Nai Mầm non
Cô giáo mầm non mà giỏi nhỉ,ối anh theo không kịp đó, kkk :D
 
Lần chỉnh sửa cuối:
Danh sách đăng ký dự thi Hội thi Giáo viên giỏi ứng dụng CNTT trong công tác giảng dạy tỉnh Đồng Nai lần thứ 4 năm 2013
4 Nguyễn Thị Thanh Thủy 1981 Nữ Trường Mầm non Ánh Dương thị xã Long Khánh, tỉnh Đồng Nai Mầm non
Cô giáo mầm non mà giỏi nhỉ,ối anh theo không kịp đó, kkk :D
Eccc sao anh không đưa đoạt giải lên luôn đi ghê thật.
Lâu rồi mới thấy anh xuất hiện hihihi
 
Là nữ, cô giáo mầm non nữa, trái ngành nghề mà được như vậy là rất giỏi đó bé.
 
dù không hiểu nội dung topic này nhưng mà nể cô giáo mầm non quá trời quá đất, thiệt là không thể ngờ luôn đó cô ơi.
 
Ở GPE có mấy thành phần chuyên soi mói hoạnh hoẹ đủ thứ (mức độ phải cỡ vạch lá soi ra virus luôn) thế mà cái này của chị Thủy không thấy ý kiến ý cò gì chứng tỏ công phu chị Thủy đáng kinh ngạc thật. :1a:
 
Lần chỉnh sửa cuối:
Cạn lời với bạn.
Mà sao cách nói chuyện thấy quen giống ai nhỉ :rolleyes:
 
Lần chỉnh sửa cuối:
Cạn lời với bạn.
Mà sao cách nói chuyện thấy quen giống ai nhỉ :rolleyes:
Có câu "Thấy sang bắt quàng làm họ", tôi chuyên móc c...t, thông cống (100% thật) thì đừng có nhận quen nha kẻo thúi lây.
Nhân tiện GPE có đồng môn ngành bới móc cống (hổng phải bới móc linh tinh nha) thì giơ tay giao lưu biết đau học hỏi kinh nghiệm :whistling:
 
Lần chỉnh sửa cuối:
Có câu "Thấy sang bắt quàng làm họ", tôi chuyên móc c...t, thông cống (100% thật) thì đừng có nhận quen nha kẻo thúi lây.
Nhân tiện GPE có đồng môn ngành bới móc cống (hổng phải bới móc linh tinh nha) thì giơ tay giao lưu biết đau học hỏi kinh nghiệm :whistling:
Xin lỗi "Thấy sang bắt quàng làm họ" bạn đang ngái ngũ hả.
Bạn muốn bới móc hay móc cống cứ nói thẳng trực tiếp ý của bạn đó là quyền của bạn chứ đừng nói kiểu đó
 
192.168.x.x cái IP là cái IP mạng nội bộ, không phải IP Publib, muốn dùng IP Publib phải mở port nha. Chưa có mở port mà đòi chia sẽ qua internet
 
192.168.x.x cái IP là cái IP mạng nội bộ, không phải IP Publib, muốn dùng IP Publib phải mở port nha. Chưa có mở port mà đòi chia sẽ qua internet

Demo đó chủ yếu giới thiệu về cách thức sử dụng chương trình, kết nối và cách lập trình sử dụng cái tool này - đây là điều quan trọng nhất. Khi bạn down về tự khai báo IP tĩnh của bạn hoặc DDNS vô test nhé.
Đã kiểm tra các kiểu rồi mới đưa lên chứ không có kiểu "treo đầu dê bán thịt chó" ở đây nhé bạn.
 
Demo đó chủ yếu giới thiệu về cách thức sử dụng chương trình, kết nối và cách lập trình sử dụng cái tool này - đây là điều quan trọng nhất. Khi bạn down về tự khai báo IP tĩnh của bạn hoặc DDNS vô test nhé.
Đã kiểm tra các kiểu rồi mới đưa lên chứ không có kiểu "treo đầu dê bán thịt chó" ở đây nhé bạn.
Tôi lúc trước cũng viết một cái web form cho phép nạp SQL để truy vấn CSDL từ một máy khác thông qua giao thức http. Nếu nạp lệnh kiểu SELECT thì nó xuất kết quả dạng bảng, còn lại thì cho kết quả thực thi (ví dụ bao nhiêu dòng bị cập nhật, bị xóa). Phần lập trình mạng thì hầu như chẳng cần làm nhiều gì cả vì cái Browser (trình duyệt web) với Host nó tự giải quyết rồi, việc duy nhất của tôi là viết code chạy query với xuất kết quả query từ trên host. Ưu điểm của cái tôi viết là không cần cài đặt gì cả, thậm chí không cần dùng máy tính, chỉ cần cái điện thoại mở browser oánh địa chỉ nạp web form là thao tác được.

Theo ongke0711, cái tôi viết có được coi là công cụ hay chương trình kết nối, chia sẻ CSDL không nhỉ? Đang hy vọng được bác nói "Phải" để mở mày mở mặt --=0. Còn nếu "Không phải" thì cần đạt thêm tiêu chí gì nhỉ?
 
Tôi lúc trước cũng viết một cái web form cho phép nạp SQL để truy vấn CSDL từ một máy khác thông qua giao thức http. Nếu nạp lệnh kiểu SELECT thì nó xuất kết quả dạng bảng, còn lại thì cho kết quả thực thi (ví dụ bao nhiêu dòng bị cập nhật, bị xóa). Phần lập trình mạng thì hầu như chẳng cần làm nhiều gì cả vì cái Browser (trình duyệt web) với Host nó tự giải quyết rồi, việc duy nhất của tôi là viết code chạy query với xuất kết quả query từ trên host. Ưu điểm của cái tôi viết là không cần cài đặt gì cả, thậm chí không cần dùng máy tính, chỉ cần cái điện thoại mở browser oánh địa chỉ nạp web form là thao tác được.

Theo ongke0711, cái tôi viết có được coi là công cụ hay chương trình kết nối, chia sẻ CSDL không nhỉ? Đang hy vọng được bác nói "Phải" để mở mày mở mặt --=0. Còn nếu "Không phải" thì cần đạt thêm tiêu chí gì nhỉ?

Tôi thì chỉ biết mỗi VBA chứ không biết ngôn ngữ lập trình khác nhưng tôi biết các ngôn ngữ khác sẽ có thư viện hỗ trợ mạnh hơn, cụ thể là cho việc kết nối qua internet, thực hiện những tác vụ đơn giản mà đối với VBA phải viết một đống code.
Vấn đề kết nối còn liên quan đến CSDL mà bạn dùng. Nếu tôi dùng SQL Server + Ms Access làm front end thì cũng thao tác kết nối máy chủ qua internet như bình thường không cần cài đặt thêm tool này nọ vì bản thân SQL SV đã hỗ trợ rồi. Nếu không dùng Access làm front end (Desktop Application) thì dùng dùng ASP.net, PHP...để thiết kế theo dạng Web Application, chỉ cần có trình duyệt web là máy nào chạy cũng được như bạn đã viết.
Quay lại cái công cụ bạn thuyyeu9999 chia sẻ ở đây thì nên hiểu theo kiểu: là cái tool viết riêng để hỗ trợ các loại CSDL (Ms Access, tạm coi Excel cũng là CSDL vậy) mà bản thân nó không hỗ trợ để truy xuất, thao tác đến dữ liệu của nó qua Internet (không nói đến lập trình Windows Socket nhé).
Theo tôi cái ứng dụng bạn viết không phải là công cụ để hỗ trợ người lập trình mà là một ứng dụng cho người dùng cuối.
 
Tôi lúc trước cũng viết một cái web form cho phép nạp SQL để truy vấn CSDL từ một máy khác thông qua giao thức http. Nếu nạp lệnh kiểu SELECT thì nó xuất kết quả dạng bảng, còn lại thì cho kết quả thực thi (ví dụ bao nhiêu dòng bị cập nhật, bị xóa). Phần lập trình mạng thì hầu như chẳng cần làm nhiều gì cả vì cái Browser (trình duyệt web) với Host nó tự giải quyết rồi, việc duy nhất của tôi là viết code chạy query với xuất kết quả query từ trên host. Ưu điểm của cái tôi viết là không cần cài đặt gì cả, thậm chí không cần dùng máy tính, chỉ cần cái điện thoại mở browser oánh địa chỉ nạp web form là thao tác được.

Theo ongke0711, cái tôi viết có được coi là công cụ hay chương trình kết nối, chia sẻ CSDL không nhỉ? Đang hy vọng được bác nói "Phải" để mở mày mở mặt --=0. Còn nếu "Không phải" thì cần đạt thêm tiêu chí gì nhỉ?
Hihi cám ơn bạn, :clap:
Lâu lam rồi mới có người comment
 
Lần chỉnh sửa cuối:
Vấn đề kết nối còn liên quan đến CSDL mà bạn dùng. Nếu tôi dùng SQL Server + Ms Access làm front end thì cũng thao tác kết nối máy chủ qua internet như bình thường không cần cài đặt thêm tool này nọ vì bản thân SQL SV đã hỗ trợ rồi. Nếu không dùng Access làm front end (Desktop Application) thì dùng dùng ASP.net, PHP...để thiết kế theo dạng Web Application, chỉ cần có trình duyệt web là máy nào chạy cũng được như bạn đã viết.
Quay lại cái công cụ bạn thuyyeu9999 chia sẻ ở đây thì nên hiểu theo kiểu: là cái tool viết riêng để hỗ trợ các loại CSDL (Ms Access, tạm coi Excel cũng là CSDL vậy) mà bản thân nó không hỗ trợ để truy xuất, thao tác đến dữ liệu của nó qua Internet (không nói đến lập trình Windows Socket nhé).
Theo tôi cái ứng dụng bạn viết không phải là công cụ để hỗ trợ người lập trình mà là một ứng dụng cho người dùng cuối.
Có thể bác chưa lập trình web bao giờ nên mới nhận định như vậy. Web form là do mã trên server sinh ra cho browser, mã tương tác với CSDL cũng nằm trên server. Tôi lợi dụng giao thức HTTP dựa trên nền tảng TCP/IP để tránh việc phải viết lại cái phần TCP/IP khá đau đầu.

Mã của tôi nối với một CSDL cụ thể nhưng tôi hoàn toàn có thể chỉnh sửa để nó có thể nối với bất cứ CSDL được phép trên server. Về phía client, mọi ngôn ngữ lập trình đều có thể truy vấn CSDL thông qua giao thức HTTP. Chẳng hạn với VBA thì có thể dùng MSXML2.DOMDocument truy cập đường dẫn "http://linkluutru?query=SELECT... FROM" mà không cần phải dùng thư viện ngoài nào cả.

Nhưng ngay cả khi tôi có viết ra như thế thì tôi cũng không nghĩ là mình đã tạo chương trình "kết nối, chia sẻ CSDL". Đây là khái niệm rất bao quát, phức tạp cỡ trình độ như tôi là không bao giờ dám nghĩ đến.
 
Thế mục đích anh hỏi là gì ???....
 
Hihi dạo này mình nhiều việc phải xử lý quá, chưa có thời gian rảnh để làm cái Permission
 
Có thể bác chưa lập trình web bao giờ nên mới nhận định như vậy. Web form là do mã trên server sinh ra cho browser, mã tương tác với CSDL cũng nằm trên server. Tôi lợi dụng giao thức HTTP dựa trên nền tảng TCP/IP để tránh việc phải viết lại cái phần TCP/IP khá đau đầu.

Mã của tôi nối với một CSDL cụ thể nhưng tôi hoàn toàn có thể chỉnh sửa để nó có thể nối với bất cứ CSDL được phép trên server. Về phía client, mọi ngôn ngữ lập trình đều có thể truy vấn CSDL thông qua giao thức HTTP. Chẳng hạn với VBA thì có thể dùng MSXML2.DOMDocument truy cập đường dẫn "http://linkluutru?query=SELECT... FROM" mà không cần phải dùng thư viện ngoài nào cả.

Nhưng ngay cả khi tôi có viết ra như thế thì tôi cũng không nghĩ là mình đã tạo chương trình "kết nối, chia sẻ CSDL". Đây là khái niệm rất bao quát, phức tạp cỡ trình độ như tôi là không bao giờ dám nghĩ đến.
hihihi ;) về ngữ nghĩa theo mình không hề sai, còn bạn nghĩ bao quát là ý kiến cá nhân của bạn, hehe mà mình cũng không đi sâu vào vấn đề ngữ nghĩa đâu.
Còn cái mình hỏi Conect ảnh hưởng đến hiệu suất là vấn đề khác mà đã phát hiện ra rồi ;).
Bạn vô nhà người khác và người ta mời uống nước thì mới có nước mà uống, còn không mời thì bắt buộc phải tự đem nước theo mà uống chứ

Ah mà quên còn cái OCX mình đã Share lên mạng thì chắc chắc đã có người Dowload về thử nghiệm mà nói thẳng là mình có check connect và khi thực hiện lấy dữ liệu xong là ngắt kết nối luôn.
Kỳ này là cho người dùng tự chọn xem cấu hình sever mình đủ mạnh thì cứ cho connect hay disconect thì tuỳ mọi người.
 
Lần chỉnh sửa cuối:
Do máy yếu nên chắc có dùng 1 chúc tiểu sảo, anh Vô Danh Tiểu Tốt có soi ra nói em biết nhé


Sau bao nhiêu mệt mỏi, niềm vui tinh thần là đây

data.png
 
Có thể bác chưa lập trình web bao giờ ... Tôi lợi dụng giao thức HTTP dựa trên nền tảng TCP/IP để tránh việc phải viết lại cái phần TCP/IP khá đau đầu.
...
Nhưng ngay cả khi tôi có viết ra như thế thì tôi cũng không nghĩ là mình đã tạo chương trình "kết nối, chia sẻ CSDL". Đây là khái niệm rất bao quát, phức tạp cỡ trình độ như tôi là không bao giờ dám nghĩ đến.

Thấy bạn nhắc lại sẳn tôi phản hồi luôn.
Bạn đang so sánh khập khiễng rồi.
- Bạn viết trên nền web, web form để kết nối tới CSDL và Tool của bạn thuyyeu99 thì không dùng ngôn ngữ lập trình web.
- Bạn không cần dùng thư viện ngoài nào cả vậy để chạy Web server bạn không cần cài phần mềm gì sao? không cài HTTP server? Apache, xampp gì gì đó?
- Tool nói rõ dùng cho Access và Excel. Dùng chính ứng dụng Access và Excel + Tool để lập trình. Vậy nếu tôi dùng cách của bạn có thể lập trình trong Access để kết nối tới Access không hoặc mở file Excel lên tạo kết nối với file khác trong một folder nào đó qua internet?
- Bạn có đề cập đến thư viện MSXML2.DOMDocument có trong VBA, đúng là tôi chưa dùng nhiều thư viện này chỉ lấy dữ liệu từ web xuống vì nó là WebServices. Vậy bạn có thể dùng nó để kết nối và lấy dữ liệu từ một file Excel, Access từ một máy khác (máy chủ cũng được) qua internet? Tôi cũng muốn học hỏi cái này.
Theo tôi hiểu thì bạn (developer) chỉ ứng dụng các thư viện người ta viết sẳn để xây dựng ứng dụng mô hình Client - Server, còn cái tool bạn thuyyeu cũng như tool của bác Tuân là họ tự viết nên cái thư viện để cho developer áp dụng vô phầm mềm của họ. Chỉ vậy thôi.
 
Lần chỉnh sửa cuối:
Bạn đang so sánh khập khiễng rồi.
- Bạn viết trên nền web, web form để kết nối tới CSDL và Tool của bạn thuyyeu99 thì không dùng ngôn ngữ lập trình web.
- Tool nói rõ dùng cho Access và Excel. Dùng chính ứng dụng Access và Excel + Tool để lập trình. Vậy nếu tôi dùng cách của bạn có thể lập trình trong Access để kết nối tới Access không hoặc mở file Excel lên tạo kết nối với file khác trong một folder nào đó qua internet?
- Bạn có đề cập đến thư viện MSXML2.DOMDocument có trong VBA, đúng là tôi chưa dùng nhiều thư viện này chỉ lấy dữ liệu từ web xuống vì nó là WebServices. Vậy bạn có thể dùng nó để kết nối và lấy dữ liệu từ một file Excel, Access từ một máy khác (máy chủ cũng được) qua internet? Tôi cũng muốn học hỏi cái này.
Anh có vẻ dùng mấy thông tin cũ nên không hiểu ý tôi thì phải. Hiểu đơn giản là tôi tạo ra một dịch vụ nhỏ để trả về dữ liệu có thể ở nhiều định dạng chẳng hạn CSV, XML, JSON, PLAIN-TEXT... hay bất cứ định dạng nào mà anh muốn dùng. Để khai thác dữ liệu từ ứng dụng của tôi thì cũng cần biết đường dẫn (ở dạng URL hay IP+Port). Chỉ khác là cách tôi tận dụng dịch vụ HTTP trên server, còn phương án chị Thủy thì tự tạo một cái dịch vụ riêng trên server.

Thông qua HTTP thì tôi dễ dàng kiểm tra, thử nghiệm chỉ bằng trình duyệt Chrome, IE, Firefox... Hay tuyệt vời hơn là nạp đường dẫn vào chính Excel để nó tự load dữ liệu về đúng triết lý chả cần lập trình Excel gì mà vẫn có dữ liệu }}}}}. Còn với các ngôn ngữ lập trình khác thì việc khai thác nguồn dữ liệu này quá dễ dàng.

Giao thức HTTP cũng chỉ là khai thác TCP/IP, mà cái dịch vụ cho HTTP này tích hợp sẵn trong Windows, chỉ cần biết bật nó lên là dùng được. Cách đây hơn 10-20 năm trước, nhiều văn phòng các sở ngành, công ty, đại học... đã tận dụng dịch vụ trên HTTP để tạo ra các ứng dụng dạng web trong mạng nội bộ thay vì dùng đến công nghệ TCP/IP thuộc loại siêu khó (ở thời điểm đó).

Để tạo ra cách dịch vụ dữ liệu thông qua HTTP thì hiển nhiên là phải dùng ngôn ngữ lập trình web. Nhiều vị sẽ ngạc nhiên nếu biết rằng khá nhiều ngôn ngữ lập trình web bây giờ dùng còn dễ hơn cả VBA. Chẳng qua do tâm lý đụng đến đến server, host nghe nó cao siêu nên ai cũng nghĩ là nó khó nhất là lập trình web thời điểm trước phức tạp ngang ngửa với lập trình windows. Tôi có cái may mắn vớ được tài liệu MS dành cho MCV 4.0 ra đời vào năm 2012. Xét về độ đơn giản, ngắn gọn thì nó có thể chỉ bằng 1/3 so với công nghệ Webform của MS ra đời trước đây. Chỉ cần mỗi một cái biến DATA_VDTT kết nối database thì tôi đã có thể khai thác bất cứ dữ liệu từ bảng nào thông qua DATA_VDTT["tên bảng"] hay thực hiện bất cứ SQL với lệnh DATA_VDTT.Query("lệnh..."). Nó có vài nét tương đồng với connection của ADO nhưng độ linh hoạt, tháo vát thì tuyệt vời hơn rất nhiều.
 
Mạnh hỏi 1 chút bài Số 52
đọc qua mà cứ như vịt nghe sấm vậy .... thui bỏ hết chỉ hỏi tẹo sau thôi :p

VD: đưa cái Database.accdb lên HTTP Web Server .... thì từ bất cứ máy nào lấy dữ liệu nó thì sao ???
cái máy chứa cái Database.accdb lên HTTP Web Server đó có cần NAT Port modem hay ko ???? để cho máy khác lấy dữ liệu .... chỉ hỏi cái này thôi
 
Mạnh hỏi 1 chút bài Số 52
đọc qua mà cứ như vịt nghe sấm vậy .... thui bỏ hết chỉ hỏi tẹo sau thôi :p

VD: đưa cái Database.accdb lên HTTP Web Server .... thì từ bất cứ máy nào lấy dữ liệu nó thì sao ???
cái máy chứa cái Database.accdb lên HTTP Web Server đó có cần NAT Port modem hay ko ???? để cho máy khác lấy dữ liệu .... chỉ hỏi cái này thôi
Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ
Mã:
"http://myservices.com?db=ten_db&query=SELECT.."
với tham số db chỉ database, query là câu truy vấn dữ liệu thì chỉ cần dán cái địa chỉ kèm truy vấn vô Firefox, Chrome... hay là Excel là nó trả về dữ liệu thôi. Giả sử anh muốn hình thức dữ liệu trả về thì bổ sung thêm tham số type lúc này link truy vấn dữ liệu sẽ là "http://myservices.com?db=ten_db&query=...&type=XML" với yêu cầu dữ liệu là XML. Cái này phụ thuộc vào script anh viết trên web-server. Nói chung anh Mạnh đã lập trình đến mức độ này rồi thì mấy cái yêu cầu trên chỉ là muỗi thôi.
 
Lần chỉnh sửa cuối:
Hihi kiến thức anh về HTTP thì chắc khỏi bàn cải rồi.
Nói tóm lại 2 cái có cái tương đồng vá có cái khác, mà khác cái gì quện rồi.
Mọi người thích gì hơn là tùy thuộc ở mỗi người. Còn không anh rảnh thì mở Toppic hướng dẫn thêm cho phong phú
 
Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ
Mã:
"http://myservices.com?db=ten_db&query=SELECT.."
với tham số db chỉ database, query là câu truy vấn dữ liệu thì chỉ cần dán cái địa chỉ kèm truy vấn vô Firefox, Chrome... hay là Excel là nó trả về dữ liệu thôi. Giả sử anh muốn hình thức dữ liệu trả về thì bổ sung thêm tham số type lúc này link truy vấn dữ liệu sẽ là "http://myservices.com?db=ten_db&query=...&type=XML" với yêu cầu dữ liệu là XML. Cái này phụ thuộc vào script anh viết trên web-server. Nói chung anh Mạnh đã lập trình đến mức độ này rồi thì mấy cái yêu cầu trên chỉ là muỗi thôi.
còn cái dòng sau thì sao ???

NAT Port modem hay ko ????

Bài số 53 ấy :D
 
Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ
Mã:
"http://myservices.com?db=ten_db&query=SELECT.."
với tham số db chỉ database, query là câu truy vấn dữ liệu thì chỉ cần dán cái địa chỉ kèm truy vấn vô Firefox, Chrome... hay là Excel là nó trả về dữ liệu thôi. Giả sử anh muốn hình thức dữ liệu trả về thì bổ sung thêm tham số type lúc này link truy vấn dữ liệu sẽ là "http://myservices.com?db=ten_db&query=...&type=XML" với yêu cầu dữ liệu là XML. Cái này phụ thuộc vào script anh viết trên web-server. Nói chung anh Mạnh đã lập trình đến mức độ này rồi thì mấy cái yêu cầu trên chỉ là muỗi thôi.
máy khách sẽ nhận được kết quả dưới dạng nào á bạn?
 
máy khách sẽ nhận được kết quả dưới dạng nào á bạn?
Mặc định là dạng html nhưng nó có thể trả về dữ liệu bất kỳ như text(html, txt, xml, json, csv...), image (gif, jpg, bmp...).. Tùy theo nhu cầu và kỹ năng lập trình của bạn. Với dữ liệu kiểu text là dễ nhất.
 
Thi thoảng rờ tới web cũng lâu lắm rồi nhưng tôi chưa bao giờ phải xử lý những vấn đề này (NAT là gì tôi còn chả biết đây --=0) . Với port thì tôi dùng link kiểu http://123.123.123:999 (port nằm sau 2 chấm) Chắc là do tôi upload lên các server được người ta cài đặt sẵn nên không phải lo mấy cái chuyên môn cao siêu thế này. Bác Mạnh đừng hỏi mấy cái sâu với khó quá trình độ của tôi là không trả lời được đâu. :boredom:
 
Lần chỉnh sửa cuối:
Có ai đọc được thì đọc nhé
Cái nét work gì gì đó là cả 1 Cái class cũng là một mớ mấm, muối, nước tương trong đó chứ không đơn giản đâu.
Còn cái connect của tôi cũng là một mớ mấm, muối, nước tương trong đó chứ không có chuyện 1 phát ăn ngay đâu.
mà cũng biết đâu chừng " giống Dương Quá, buồn vì mười mấy năm không gặp cô Long nên đã luyện thành tuyệt kỷ Ám Nhiên Tiêu Hồn Chưởng " ra được món mới :D
 
Lần chỉnh sửa cuối:
còn cái dòng sau thì sao ???

NAT Port modem hay ko ????

Bài số 53 ấy :D
Cái này thuộc về ông System Admin rồi anh.
Trong diễn đàn có người biết nhưng chắc không nhiều.
Cái Webserver được xây dựng ngon lành rồi, ném cái gì vào đúng chỗ là cứ thế truy cập được từ bên ngoài ầm ầm.

Còn vụ ở thớt này là phải làm hết mọi việc, người dùng chỉ 'import' cái thư viện rồi dùng trên máy tính cá nhân, không phải động gì tới phần thiết lập hệ thống mạng.
 
Cái vụ NAT Port modem nói rồi mà chắc có thể ai đó mong lung rối quá
 
Cái này thuộc về ông System Admin rồi anh.
Trong diễn đàn có người biết nhưng chắc không nhiều.
Cái Webserver được xây dựng ngon lành rồi, ném cái gì vào đúng chỗ là cứ thế truy cập được từ bên ngoài ầm ầm.

Còn vụ ở thớt này là phải làm hết mọi việc, người dùng chỉ 'import' cái thư viện rồi dùng trên máy tính cá nhân, không phải động gì tới phần thiết lập hệ thống mạng.
Cái cốt lõi nó là thế đấy ẩn ý trong cái mạnh hỏi là một vấn đề khác ... có thể ai đó nghe thì cũng suy đoán như vịt nghe sấm thôi ... xong phán tầm bạy à
và cũng chỉ dùng lại ở đó thôi .... có lẻ ai đó ko trả lời nhưng họ sẻ hiểu Mạnh hỏi gì và nói Gì -0-0-0- -0-0-0-

Còn cái NAT Port là cái chuyện lông vịt biết từ xa xưa rồi ai hỏi nữa làm chi he
 
ờ chắc tui nghĩ tới đó à
 
@befaint thấy bài số 19 Link sau của Mạnh sao cho chút ý kiếm đi he


1603423767954.png
 
Mặc định là dạng html nhưng nó có thể trả về dữ liệu bất kỳ như text(html, txt, xml, json, csv...), image (gif, jpg, bmp...).. Tùy theo nhu cầu và kỹ năng lập trình của bạn. Với dữ liệu kiểu text là dễ nhất.
Hình như đây là cách làm phổ thông trong thực tế đúng không bạn.
 
Sau vài năm có những cái thắc mắc mà trước đây chưa làm được hay chưa có lời giải ... thì này qua Em ChatGPT vài ngày đã xong

Sử dụng DataSnap làm tốt ... tuy nhiên không cơ động và tùy chỉnh nhiều thứ như Web Server

suy cho cùng ẩn chứa sau DataSnap cũng là 1 Web Server tùy chỉnh đăng nhập thêm User và Pass nếu không thích thì ta cho nó là trắng trắng là xong à

chốt lại vậy thôi ... Ai đam mê code két viết theo hướng Web Server là rất đơn giản ... trên Windows ta có thể cấu hình = tay sử dụng IIS cũng ok

còn triển khai code ra sao tự dò đi là ra thôi --=0--=0--=0--=0--=0--=0--=0--=0--=0--=0--=0--=0


Bản nháp chưa hoàn chỉnh ứng dụng Web Server ... ai đó tò mò có thể tham khảo thêm

Thật ra tôi đã viết thêm nhiều hàm rồi nhưng làm biếng úp lại nên vẫn cứ để vậy chơi cho vui thôi


 
Lần chỉnh sửa cuối:
Còn 2 thắc mắc nhỏ nữa thôi

1/ Tại sao không Viết DLL mà lại viết OCX

2/ sử dụng Delphi XE thì nó hổ trợ tốt cho 32 và 64 bít ... vậy tại sao không builder 64 bit và 32 bit sử dụng mà chỉ sử dụng cho 32 bit còn 64 bit không sử dụng được

3/ Theo nguyên tắc suy đoán là có thể .... nhưng để lại đó cho thế hệ sau ai đam mê vào tìm lời giải tiếp cho vui
 

Bài viết mới nhất

Back
Top Bottom