dll操作資料庫
1. 想寫一個操作資料庫的通用dll類庫,該注意什麼
1.dll的入口只有一處,出口也只有一處,保證完整性。
2.能進行所有的資料庫操作。
3.所有的函數需要有返回值,並且返回值需要的是最簡單的數據類型,其他的應按照ref傳值
4.所有資源做到有申明就有釋放,有打開就有關閉。
5.不要用static這種東西
6.安全性問題,什麼是私有的,那些是可被外部調用的,受保護的.
2. 電腦常識:Dll資料庫是什麼,其作用是
你好朋友;
dll文件是資料庫鏈接文件;
動態鏈接庫
動態鏈接庫文件動態鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。DLL 還有助於共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。
目錄
簡介
DLL 優點
DLL文件損壞
DLL 依賴項
DLL 入口點
導出 DLL 函數兩種方法
特別調用
DLL內容說明
DLL錯誤的危害
DLL修復方法
dll木馬原理簡介
DLL 優點
DLL文件損壞
DLL 依賴項
DLL 入口點
導出 DLL 函數 兩種方法
特別調用
DLL內容說明
DLL錯誤的危害
DLL修復方法
dll木馬原理展開 編輯本段簡介
動態鏈接庫可以更為容易地將更新應用於各個模塊,而不會影響該程序的其他部分。例如,您有一個大型網路游戲,如果把整個數百MB甚至數GB的游戲的代碼都放在一個應用程序里,日後的修改工作將會十分費時,而如果把不同功能的代碼分別放在數個動態鏈接庫(DLL)中,您無需重新生成或安裝整個程序就可以應用更新。 下表說明了 Windows 操作系統中的一些作為 DLL 實現的文件: · ActiveX控制項(.ocx) 文件 ActiveX 控制項的一個示例是日歷控制項,它使您可以從日歷中選擇日期。 動態鏈接庫
· 控制面板(.cpl) 文件 .cpl 文件的一個示例是位於控制面板中的項。每個項都是一個專用 DLL。 · 設備驅動程序(.drv) 文件 設備驅動程序的一個示例是控制列印到列印機的列印機驅動程序。
DLL 優點
1、擴展了應用程序的特性; 2、可以用許多種編程語言來編寫; 3、簡化了軟體項目的管理; 4、有助於節省內存; 5、有助於資源共享; 6、有助於應用程序的本地化; 7、有助於解決平台差異; 8、可以用於一些特殊的目的。windows使得某些特性只能為DLL所用。
編輯本段DLL文件損壞
當前木馬病毒經常感染或者替換系統文件dll文件,部分安全工具查殺後並未對dll文件進行系統修復,所以經常會出現以下現象: 1、網路游戲打不開 2、電腦沒聲音 3、電腦藍屏 4、桌面無法顯示 dll圖標
5、主頁被修改為網址導航 6、桌面圖標無法刪除(淘寶、小游戲、電影等等,重啟同樣不能正常刪除)
DLL 依賴項
當某個程序或 DLL 使用其他 DLL 中的 DLL 函數時,就會創建依賴項。因此,該程序就不再是獨立的,並且如果該依賴項被損壞,該程序就可能遇到問題。例如,如果發生下列操作之一,則該程序可能無法運行: · 依賴 DLL 升級到新版本。 · 修復了依賴 DLL。 · 依賴 DLL 被其早期版本覆蓋。 · 從計算機中刪除了依賴 DLL。 這些操作通常稱為 DLL 沖突。如果沒有強制實現向後兼容性,則該程序可能無法成功運行。
編輯本段DLL 入口點
在創建 DLL 時,可以有選擇地指定入口點函數。當進程或線程將它們自身附加到 DLL 或者將它們自身從 DLL 分離時,將調用入口點函數。您可以使用入口點函數根據 DLL 的需要來初始化數據結構或者銷毀數據結構。此外,如果應用程序是多線程的,則可以在入口點函數中使用線程本地存儲 (TLS) 來分配各個線程專用的內存。下面的代碼是一個 DLL 入口點函數的示例: BOOL APIENTRY DllMain( HANDLE hMole, // Handle to DLL mole DWORD ul_reason_for_call, // Reason for calling function LPVOID lpReserved ) // Reserved { switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACHED: // A process is loading the DLL. break; case DLL_THREAD_ATTACHED: // A process is creating a new thread. break; case DLL_THREAD_DETACH: // A thread exits normally. break; case DLL_PROCESS_DETACH: // A process unloads the DLL. break; } return TRUE; } 當入口點函數返回 FALSE 值時,如果您使用的是載入時動態鏈接,則應用程序不啟動。如果您使用的是運行時動態鏈接,則只有個別 DLL 不會載入。 入口點函數只應執行簡單的初始化任務,不應調用任何其他 DLL 載入函數或終止函數。例如,在入口點函數中,不應直接或間接調用 LoadLibrary 函數或 LoadLibraryEx 函數。此外,不應在進程終止時調用 FreeLibrary 函數。 注意:在多線程應用程序中,請確保將對 DLL 全局數據的訪問進行同步(線程安全),以避免可能的數據損壞。為此,請使用 TLS 為各個線程提供唯一的數據。
導出 DLL 函數
要導出 DLL 函數,您可以向導出的 DLL 函數中添加函數關鍵字,也可以創建模塊定義文件(.def) 以列出導出的 DLL 函數。
兩種方法
方法一、向導出的 DLL 函數中添加函數關鍵字 要使用函數關鍵字,您必須使用以下關鍵字來聲明要導出的各個函數: __declspec(dllexport) 要在應用程序中使用導出的 DLL 函數,您必須使用以下關鍵字來聲明要導入的各個函數: __declspec(dllimport) 通常情況下,您最好使用一個包含 define 語句和 ifdef 語句的頭文件,以便分隔導出語句和導入語句。 方法二、創建模塊定義文件 (.def) 以列出導出的 DLL 函數 使用模塊定義文件來聲明導出的 DLL 函數。當您使用模塊定義文件時,您不必向導出的 DLL 函數中添加函數關鍵字。在模塊定義文件中,您可以聲明 DLL 的 LIBRARY 語句和 EXPORTS 語句。
特別調用
關於特定情況下的調用,比如DLL函數中使用到了win32 API或者將C++生成的DLL供標准C語言使用,則需要注意以下一些情況: 如果使用到了win32 API,則應該使用調用方式為「__stdcall」。 在將C++生成的DLL供標准C語言使用,輸出文件需要用「extern "C"」修飾,否則不能被標准C語言調用。如果使用「__stdcall」調用方式,可能產生C不識別的修飾名,所以設置導出函數時要採用.def文件形式,而不是__declspec(dllexport)形式。後者會進行修飾名轉換,C語言無法識別函數。 下面的代碼是一個定義文件的示例。 // SampleDLL.def // LIBRARY "sampleDLL" EXPORTS HelloWorld示例 DLL 和應用程序XXXXXXXX在 Microsoft Visual C++6.0 中,可以通過選擇「Win32 動態鏈接庫」項目類型或「MFC 應用程序向導 (dll)」來創建 DLL。下面的代碼是一個在 Visual C++ 中通過使用「Win32 動態鏈接庫」項目類型創建的 DLL 的示例。 // SampleDLL.cpp //#include "stdafx.h" #define EXPORTING_DLL #include "sampleDLL.h" BOOL APIENTRY DllMain( HANDLE hMole, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } void HelloWorld(){ MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK); } // File: SampleDLL.h //#ifndef INDLL_H #define INDLL_H #ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ; #elseextern __declspec(dllimport) void HelloWorld() ; #endif #endif 下面的代碼是一個「Win32 應用程序」項目的示例,該示例調用 SampleDLL DLL 中的導出 DLL 函數。 // SampleApp.cpp //#include "stdafx.h" #include "sampleDLL.h" int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { HelloWorld(); return 0; } 注意:在載入時動態鏈接中,您必須鏈接在生成 SampleDLL 項目時創建的 SampleDLL.lib 導入庫。 在運行時動態鏈接中,您應使用與以下代碼類似的代碼來調用 SampleDLL.dll 導出 DLL 函數。 ... typedef VOID (*DLLPROC) (LPTSTR); ... HINSTANCE hinstDLL; DLLPROC HelloWorld; BOOL fFreeDLL; hinstDLL = LoadLibrary("sampleDLL.dll"); if (hinstDLL != NULL) { HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld"); if (HelloWorld != NULL) (HelloWorld); fFreeDLL = FreeLibrary(hinstDLL); } ...
DLL內容說明
KERNEL32.DLL ---- 低級內核函數。使用他可以完成內存管理、任務管理、 資源控制等。 USER32.DLL------與windows管理有關的函數。消息、菜單、游標、計時器 、通信和其他大多數非現實函數都可以從這里找到 GDI32.DLL-------圖形設備介面庫。於設備輸出有關的函數:大多數繪圖 、顯示場景、圖元文件、坐標及其字體函數都可以從這里找到。 COMDLG32.DLL\LZ32.DLL\VERSION.DLL\---這都是提供一些附加函數的庫,包 括通用對話框、文件壓縮、版本控制的支持。 COMCTL32.DLL --------一個新的windows控制項集合,比如TreeView和RichTextBox 等等,最初這個是為了win95而製作的,但是現在也使用與NT下 MAPI32.DLL---------提供了一套電子郵件的專用函數 NETAPI32.DLL--------提供了一套訪問和控制網路的函數 ODBC32.DLL--------ODBC功能的DLL之DLL(Delay Locked Loop,延時鎖定迴路提供一個數據濾波信號)
DLL錯誤的危害
系統文件auditpolicygpinterop.dll出錯,是由於木馬病毒、或不小心下載了流氓軟體被感染所致。而該文件又是系統/程序正常運行的前提條件,所以一旦不幸被感染,通常會伴隨下幾種情況: 1、桌面圖標無法刪除(淘寶、小游戲、電影等等,重啟同樣不能正常刪除) 2、網路游戲打不開(DNF,穿越火線,魔獸世界等等) 3、電腦無故藍屏 4、電腦沒聲音 5、桌面無法顯示 6、主頁被修改為網址導航 7、一些程序無法正常使用(比如雙擊無響應等一系列情況)
DLL修復方法
部分.dll缺失可以從其他電腦或者網上上下載拷貝到,c盤windows目錄下來完成修復。 auditpolicygpinterop.dll出錯,很多是因為中了流氓軟體的招,如果不太了解系統,不知道應該把auditpolicygpinterop.dll放在哪,那麼建議使用修復工具對系統進行最全面的掃描和修復。
dll木馬原理
DLL是編譯好的代碼,與一般程序沒什麼大差別,只是它不能獨立運行,需要程序調用。那麼,DLL與木馬能扯上什麼關系呢?如果你學過編程並且寫過DLL,就會發現,其實DLL的代碼和其他程序幾乎沒什麼兩樣,僅僅是介面和啟動模式不同,只要改動一下代碼入口,DLL就變成一個獨立的程序了。當然,DLL文件是沒有程序邏輯的,這里並不是說DLL=EXE,不過,依然可以把DLL看做缺少了main入口的EXE,DLL帶的各個功能函數可以看作一個程序的幾個函數模塊。DLL木馬就是把一個實現了木馬功能的代碼,加上一些特殊代碼寫成DLL文件,導出相關的API,在別人看來,這只是一個普通的DLL,但是這個DLL卻攜帶了完整的木馬功能,這就是DLL木馬的概念。也許有人會問,既然同樣的代碼就可以實現木馬功能,那麼直接做程序就可以,為什麼還要多此一舉寫成DLL呢?這是為了隱藏,因為DLL運行時是直接掛在調用它的程序的進程里的,並不會另外產生進程,所以相對於傳統EXE木馬來說,它很難被查到
3. 怎麼用C#編寫個dll,用來讀取sql資料庫中一張表的數據,然後返回XML格式字元串
這是由兩部操作組成的,一個是你要從資料庫中將這個欄位讀出來,再一個就是將你讀出來的數據賦值textBox.Text中就行,你可以參考一下(別復制粘貼,因為需要按照你的程序修改一下):
//這個方法是用來顯示一個單一的返回值而編寫的,你只需要向其中傳輸你的
//SQL語句就行,這里的返回值的信息就是string 類型的。
public string mysqlfun(string sql)
{
string info = "";
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
conn.ConnectionString = "Data Source=.;Initial Catalog=你的資料庫的名字;Integrated Security=True";//這是一個連接字元串,考慮
//widows安全模式下登錄
conn.Open();
DataSet objDataSet = new DataSet();
SqlDataAdapter obj = new SqlDataAdapter();
obj.SelectCommand = new SqlCommand(sql, conn);
obj.Fill(objDataSet, "info");
SqlCommand objSqlCommand = new SqlCommand(sql, conn);
SqlDataReader objSqlReader = objSqlCommand.ExecuteReader();
while (objSqlReader.Read())
{
info = objSqlReader.GetValue(0).ToString ();
}
return info;
}
我相信你應該會寫SQL語句吧!
然後就像我剛才說的:
textBox1.Text=info;
這樣就行了。希望能幫到你!!
最後,還有一點提示,看到你的資料庫是master,如果是你自己練習的,最好自己創建一個資料庫,因為master資料庫是一個系統資料庫,使用它感覺不是很好。