Chị có share không chị?Buồn buồn ngồi mày mò Code cho đỡ Stress hihi
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ạiCò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![]()
Buồn buồn ngồi mày mò Code cho đỡ Stress hihi
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ì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
Nó như mô hình client server thu nhỏ thôi anh. HihiVụ 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ó.
Trùm nhiều chuyện Nguyễn Thị Thanh Thủy cũng xinh dữ ta
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![]()
Chưa muộn đâuCó ai nói gì đâu mà hôm nay mạnh mới biết đó chứ .... thui nhé
Vui vẻ he![]()
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
hihi cái này tuỳ mỗi người, có người thích ăn cơm, có người thích ăn hủ tíu, có người thích an phở.Tôi thấy hơi rôi Màu mè . Tôi góp ý nếu dùng Google dirver sẽ nhanh hơn
cái vụ này mình cũng đang lăn tăn đây?cái này bảo mật chưa tốt. kẻ xấu tấn công dữ liệu dể dàng. Góp ý nên dùng Googlr driver đặt chung thư mục sẽ dể dàng hơn
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 ?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]
Ý mình bạn có thể nói sơ về cách thức tấn cô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); } }
Nó đó.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.Sao thấy cái cách bạn nói chuyện thấy quen quen sao ý
Cỡ đó thì cũng tương đương tuổi tôi thô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
Eccc sao anh không đưa đoạt giải lên luôn đi ghê thật.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![]()
Nhận Giấy khen của Ban tổ chức Hội thi cho giải Khuyến khích?Eccc sao anh không đưa đoạt giải lên luôn đi ghê thật.
Mò mẫm hơn 4 năm đó, chứ không phải tự nhiên đâudù 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.
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.Cạn lời với bạn.
Mà sao cách nói chuyện thấy quen giống ai nhỉ![]()
Xin lỗi "Thấy sang bắt quàng làm họ" bạn đang ngái ngũ hả.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![]()
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
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.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. 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,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. Còn nếu "Không phải" thì cần đạt thêm tiêu chí gì nhỉ?
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.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.
Đang hóng đó nhớ xong nhắn mình nhéCòn ai quan tâm cái zụ chia sẻ dữ liệu này không ta
hihihiCó 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.
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.
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.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.
Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ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
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
"http://myservices.com?db=ten_db&query=SELECT.."
còn cái dòng sau thì sao ???Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ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ã:"http://myservices.com?db=ten_db&query=SELECT.."
máy khách sẽ nhận được kết quả dưới dạng nào á bạn?Ví dụ tôi tạo ra một cái kênh cấp dữ liệu theo địa chỉ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ã:"http://myservices.com?db=ten_db&query=SELECT.."
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.máy khách sẽ nhận được kết quả dưới dạng nào á bạn?
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 đâyNAT Port modem hay ko ????
Cái này thuộc về ông System Admin rồi anh.còn cái dòng sau thì sao ???
NAT Port modem hay ko ????
Bài số 53 ấy![]()
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 à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.
Hình như đây là cách làm phổ thông trong thực tế đúng không 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.