图解分析一个dNet进销存软件
該源碼下載自
http://www.onlinedown.net/soft/43299.htm
?
首先安裝;
?
?
?
看下它的數據庫;在sql server 2008中附加;
?
順帶復習sql server的連接屬性對話框;產品欄包括以下屬性:名稱,企業版;版本,10.50.1600;本機名稱,HC093;排序規則,Chinese_PRC_CI_AS;
服務器的硬件,內存,CPU,操作系統;
連接:連接的數據庫,model;SPID,估計是客戶端工具連接數據庫引擎的進程的ID;網絡協議,默認,默認的估計是TCP/IP;連接超時值,15,秒?;連接未加密;
身份驗證方法和用戶名;
?
附加成功;查看數據庫對象;先看數據庫關系圖;彈出如下提示;
?
算了,看下表的情況吧;打如下SQL,列出所有表名;
看下,大概是庫存表,銷售細節表,銷售表等等;
?
打如下SQL,列出所有表的結構信息;
表的主鍵都是int類型;
?
全部表的結構信息;
?
?
?
?
?
?
帶有3個存儲過程,一個標量值函數;
?
?
存儲過程代碼;
備份數據庫,
?
USE [es_CostumeStore_01_01] GO /****** Object: StoredProcedure [dbo].[p_backupdb] Script Date: 08/12/2016 09:28:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER proc [dbo].[p_backupdb] @dbname sysname='', --要備份的數據庫名稱,不指定則備份當前數據庫 @bkpath nvarchar(260)='', --備份文件的存放目錄,不指定則使用SQL默認的備份目錄 @bkfname nvarchar(260)='', --備份文件名,文件名中可以用\DBNAME\代表數據庫名,\DATE\代表日期,\TIME\代表時間 @bktype nvarchar(10)='DB', --備份類型:'DB'備份數據庫,'DF' 差異備份,'LOG' 日志備份 @appendfile bit=1 --追加/覆蓋備份文件 as declare @sql varchar(8000) if isnull(@dbname,'')='' set @dbname=db_name() if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null) if isnull(@bkfname,'')='' set @bkfname='\DBNAME\_\DATE\_\TIME\.BAK' set @bkfname=replace(replace(replace(@bkfname,'\DBNAME\',@dbname) ,'\DATE\',convert(varchar,getdate(),112)) ,'\TIME\',replace(convert(varchar,getdate(),108),':','')) set @sql='backup '+case @bktype when 'LOG' then 'log ' else 'database ' end +@dbname +' to disk='''+@bkpath+@bkfname +''' with '+case @bktype when 'DF' then 'DIFFERENTIAL,' else '' end +case @appendfile when 1 then 'NOINIT' else 'INIT' end print @sql exec(@sql)
創建作業,
?
?
USE [es_CostumeStore_01_01] GO /****** Object: StoredProcedure [dbo].[p_createjob] Script Date: 08/12/2016 09:28:39 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER proc [dbo].[p_createjob] @jobname varchar(100), --作業名稱 @sql varchar(8000), --要執行的命令 @dbname sysname='', --默認為當前的數據庫名 @freqtype varchar(6)='day', --時間周期,month 月,week 周,day 日 @fsinterval int=1, --相對于每日的重復次數 @time int=170000 --開始執行時間,對于重復執行的作業,將從0點到23:59分 as if isnull(@dbname,'')='' set @dbname=db_name() --創建作業 exec msdb..sp_add_job @job_name=@jobname --創建作業步驟 exec msdb..sp_add_jobstep @job_name=@jobname, @step_name = '數據處理', @subsystem = 'TSQL', @database_name=@dbname, @command = @sql, @retry_attempts = 5, --重試次數 @retry_interval = 5 --重試間隔 --創建調度 declare @ftype int,@fstype int,@ffactor int select @ftype=case @freqtype when 'day' then 4 when 'week' then 8 when 'month' then 16 end ,@fstype=case @fsinterval when 1 then 0 else 8 end if @fsinterval<>1 set @time=0 set @ffactor=case @freqtype when 'day' then 0 else 1 end EXEC msdb..sp_add_jobschedule @job_name=@jobname, @name = '時間安排', @freq_type=@ftype , --每天,8 每周,16 每月 @freq_interval=1, --重復執行次數 @freq_subday_type=@fstype, --是否重復執行 @freq_subday_interval=@fsinterval, --重復周期 @freq_recurrence_factor=@ffactor, @active_start_time=@time --下午17:00:00分執行
恢復備份,
?
?
USE [es_CostumeStore_01_01] GO /****** Object: StoredProcedure [dbo].[p_RestoreDb] Script Date: 08/12/2016 09:28:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER proc [dbo].[p_RestoreDb] @bkfile nvarchar(1000), --定義要恢復的備份文件名 @dbname sysname='', --定義恢復后的數據庫名,默認為備份的文件名 @dbpath nvarchar(260)='', --恢復后的數據庫存放目錄,不指定則為SQL的默認數據目錄 @retype nvarchar(10)='DB', --恢復類型:'DB'完事恢復數據庫,'DBNOR' 為差異恢復,日志恢復進行完整恢復,'DF' 差異備份的恢復,'LOG' 日志恢復 @filenumber int=1, --恢復的文件號 @overexist bit=1, --是否覆蓋已經存在的數據庫,僅@retype為 @killuser bit=1 --是否關閉用戶使用進程,僅@overexist=1時有效 as declare @sql varchar(8000) --得到恢復后的數據庫名 if isnull(@dbname,'')='' select @sql=reverse(@bkfile) ,@sql=case when charindex('.',@sql)=0 then @sql else substring(@sql,charindex('.',@sql)+1,1000) end ,@sql=case when charindex('\',@sql)=0 then @sql else left(@sql,charindex('\',@sql)-1) end ,@dbname=reverse(@sql) --得到恢復后的數據庫存放目錄 if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('') --生成數據庫恢復語句 set @sql='restore '+case @retype when 'LOG' then 'log ' else 'database ' end+@dbname +' from disk='''+@bkfile+'''' +' with file='+cast(@filenumber as varchar) +case when @overexist=1 and @retype in('DB','DBNOR') then ',replace' else '' end +case @retype when 'DBNOR' then ',NORECOVERY' else ',RECOVERY' end print @sql --添加移動邏輯文件的處理 if @retype='DB' or @retype='DBNOR' begin --從備份文件中獲取邏輯文件名 declare @lfn nvarchar(128),@tp char(1),@i int --創建臨時表,保存獲取的信息 create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0)) --從備份文件中獲取信息 insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''') declare #f cursor for select ln,tp from #tb open #f fetch next from #f into @lfn,@tp set @i=0 while @@fetch_status=0 begin select @sql=@sql+',move '''+@lfn+''' to '''+@dbpath+@dbname+cast(@i as varchar) +case @tp when 'D' then '.mdf''' else '.ldf''' end ,@i=@i+1 fetch next from #f into @lfn,@tp end close #f deallocate #f end --關閉用戶進程處理 if @overexist=1 and @killuser=1 begin declare @spid varchar(20) declare #spid cursor for select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) open #spid fetch next from #spid into @spid while @@fetch_status=0 begin exec('kill '+@spid) fetch next from #spid into @spid end close #spid deallocate #spid end --恢復數據庫 exec(@sql)
標量值函數,返回數據庫路徑;
?
?
USE [es_CostumeStore_01_01] GO /****** Object: UserDefinedFunction [dbo].[f_getdbpath] Script Date: 08/12/2016 09:28:51 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GOALTER function [dbo].[f_getdbpath](@dbname sysname) returns nvarchar(260) as begin declare @re nvarchar(260) if @dbname is null or db_id(@dbname) is null select @re=rtrim(reverse(filename)) from master..sysdatabases where name='master' else select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname if @dbname is null set @re=reverse(substring(@re,charindex('\',@re)+5,260))+'BACKUP' else set @re=reverse(substring(@re,charindex('\',@re),260)) return(@re) end
也可以打如下SQL,列出單個表的字段名;
?
?
打如下SQL,列出各個表的記錄數;
?
看下登錄密碼,加了密的;
?
運行軟件,登錄,發生如下錯誤;
?
以下是錯誤對話框中的詳情;
有關調用實時(JIT)調試而不是此對話框的詳細信息,
請參見此消息的結尾。
************** 異常文本 **************
System.NullReferenceException: 未將對象引用設置到對象的實例。
? ?在 CostumeStore.frm_Login.CheckDisk(String& strDiskName)
? ?在 CostumeStore.frm_Login.CheckEdition()
? ?在 CostumeStore.frm_Login.btnLogin_Click(Object sender, EventArgs e)
? ?在 System.Windows.Forms.Control.OnClick(EventArgs e)
? ?在 DevComponents.DotNetBar.ButtonX.OnClick(EventArgs e)
? ?在 DevComponents.DotNetBar.ButtonX.OnMouseUp(MouseEventArgs e)
? ?在 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
? ?在 System.Windows.Forms.Control.WndProc(Message& m)
? ?在 DevComponents.DotNetBar.ButtonX.WndProc(Message& m)
? ?在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
? ?在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
************** 已加載的程序集 **************
mscorlib
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
----------------------------------------
CostumeStore
? ? 程序集版本: 1.0.0.0
? ? Win32 版本: 1.0.0.0
? ? 基本代碼: file:///C:/Program%20Files%20(x86)/大地天空/進銷存管理專家/CostumeStore.exe
----------------------------------------
System.Windows.Forms
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
DevComponents.DotNetBar2
? ? 程序集版本: 6.8.3.0
? ? Win32 版本: 6.8.3.0
? ? 基本代碼: file:///C:/Program%20Files%20(x86)/大地天空/進銷存管理專家/DevComponents.DotNetBar2.DLL
----------------------------------------
Accessibility
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
DataOperate
? ? 程序集版本: 1.0.0.0
? ? Win32 版本: 1.0.0.0
? ? 基本代碼: file:///C:/Program%20Files%20(x86)/大地天空/進銷存管理專家/DataOperate.DLL
----------------------------------------
System.Data
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_64/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Configuration
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Transactions
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_64/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_64/System.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
mscorlib.resources
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/Microsoft.NET/Framework64/v2.0.50727/mscorlib.dll
----------------------------------------
System.Management
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.5420 (Win7SP1.050727-5400)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Management/2.0.0.0__b03f5f7f11d50a3a/System.Management.dll
----------------------------------------
System.Windows.Forms.resources
? ? 程序集版本: 2.0.0.0
? ? Win32 版本: 2.0.50727.4927 (NetFXspW7.050727-4900)
? ? 基本代碼: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_zh-CHS_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
************** JIT 調試 **************
要啟用實時(JIT)調試,
該應用程序或計算機的 .config 文件(machine.config)的 system.windows.forms 節中必須設置
jitDebugging 值。
編譯應用程序時還必須啟用
調試。
例如:?
<configuration>
? ? <system.windows.forms jitDebugging="true" />
</configuration>
啟用 JIT 調試后,任何無法處理的異常
都將被發送到在此計算機上注冊的 JIT 調試器,
而不是由此對話框處理。
?
錯誤詳情列出了加載的程序集,包括.net系統的和程序自身的,每個程序集包括程序集版本, Win32 版本,基本代碼三項;
看下錯誤位于
frm_Login.btnLogin_Click
函數中;
?
下面反編譯此dNet程序;
總體結構:
?
主要的類;
?
看錯誤情況,是在frm_Login.btnLogin_Click中調用CheckEdition();CheckEdition()代碼如下,
private bool CheckEdition()
{
? ? string str;
? ? if (!this.CheckDisk(out str))
? ? {
? ? ? ? return false;
? ? }
? ? if ((str != "") && !this.CheckSerialNum(str))
? ? {
? ? ? ? return false;
? ? }
? ? return true;
}
在CheckEdition()中調用CheckDisk(out str)時出的錯;
?
但是當查看CheckDisk(out str)代碼時,.NET Reflector 產生了如下錯誤,并看不到CheckDisk(out str)的代碼;
?
對于Ambiguous match found,網上有如下說法:
出現原因:由于被調用的dll里面有多個重載的函數,因此提示。
解決方法: 反射調用不能調用重載的函數,只能調用唯一的函數。
?
看下所附帶的DataOperate.dll,是操作數據庫的,除了有操作數據庫的函數,還有讀寫.ini文件的函數;
?
public class DataOperate {// Fieldsprivate static SqlConnection con;public static short signErr;public static string strCon;public static string strErr;// Methodspublic static void CloseCon(){if (con != null){con.Close();}}public static void ExecuteCmd(string[] strArrSql){signErr = 1;strErr = "";OpenCon();if (signErr != 0){SqlTransaction transaction = con.BeginTransaction();SqlCommand[] commandArray = new SqlCommand[strArrSql.Length];try{for (int i = 0; i < strArrSql.Length; i++){commandArray[i] = new SqlCommand(strArrSql[i]);commandArray[i].Transaction = transaction;commandArray[i].ExecuteNonQuery();}transaction.Commit();}catch (Exception exception){signErr = 0;strErr = exception.ToString();transaction.Rollback();}con.Close();con.Dispose();}}public static int ExecuteCmd(string strSql){signErr = 1;strErr = "";int num = -1;SqlCommand command = GrdQueryCmd(strSql);if (signErr == 0){return 0;}try{num = command.ExecuteNonQuery();con.Close();}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();return num;}public static void ExecuteProc(string strProcName, SqlParameter[] Prts){signErr = 1;strErr = "";SqlCommand command = GrdProcQueryCmd(strProcName, Prts);if (signErr != 0){try{command.ExecuteNonQuery();}catch (Exception exception){signErr = 0;strErr = exception.ToString();}}}public static SqlDataReader GetDataReader(string strSql){signErr = 1;strErr = "";SqlDataReader reader = null;SqlCommand command = GrdQueryCmd(strSql);if (signErr == 0){return null;}try{reader = command.ExecuteReader(CommandBehavior.CloseConnection);}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();return reader;}public static DataTable GetDataTable(string strSql){signErr = 1;strErr = "";OpenCon();if (signErr == 0){return null;}DataTable dataTable = new DataTable();try{new SqlDataAdapter(strSql, con).Fill(dataTable);}catch (Exception exception){signErr = 0;strErr = exception.ToString();con.Close();con.Dispose();return null;}con.Close();con.Dispose();return dataTable;}public static DataTable GetDataTable(string strSql, out SqlDataAdapter dpt){signErr = 1;strErr = "";dpt = null;OpenCon();if (signErr == 0){return null;}DataTable dataTable = new DataTable();dpt = new SqlDataAdapter(strSql, con);try{dpt.Fill(dataTable);}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();return dataTable;}[DllImport("kernel32.dll")]private static extern bool GetPrivateProfileString(string strAppName, string strKeyName, string strDefault, StringBuilder strReturn, int nSize, string strFielName);public static SqlDataReader GetProcDataReader(string strProcName, SqlParameter[] Prts){signErr = 1;strErr = "";SqlCommand command = GrdProcQueryCmd(strProcName, Prts);if (signErr == 0){return null;}SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);con.Close();con.Dispose();return reader;}public static DataSet GetProcDataSet(string strProcName, SqlParameter[] prts){signErr = 1;strErr = "";DataSet dataSet = new DataSet();SqlDataAdapter adapter = new SqlDataAdapter {SelectCommand = GrdProcQueryCmd(strProcName, prts)};if (signErr == 0){return null;}try{adapter.Fill(dataSet);}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();return dataSet;}public static DataTable GetProcDataTable(string strProcName, SqlParameter[] prts){signErr = 1;strErr = "";DataTable dataTable = new DataTable();SqlDataAdapter adapter = new SqlDataAdapter {SelectCommand = GrdProcQueryCmd(strProcName, prts)};if (signErr == 0){return null;}try{adapter.Fill(dataTable);}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();return dataTable;}private static SqlCommand GrdProcQueryCmd(string strProcName, SqlParameter[] prts){SqlCommand command = new SqlCommand();OpenCon();if (signErr == 0){return null;}command.Connection = con;command.CommandText = strProcName;command.CommandType = CommandType.StoredProcedure;if (prts == null){foreach (SqlParameter parameter in prts){command.Parameters.Add(parameter);}}con.Close();con.Dispose();return command;}private static SqlCommand GrdQueryCmd(string strSql){OpenCon();if (signErr == 0){return null;}return new SqlCommand(strSql, con);}public static void OpenCon(){int num;signErr = 1;strErr = "";string strFielName = @"C:\WINDOWS\system32\aeskderfEx.ini";StringBuilder strReturn = new StringBuilder(20);GetPrivateProfileString("SERVER", "desktop", "", strReturn, 20, strFielName);if (strReturn.ToString().Trim() == ""){num = 1;}else if (Convert.ToInt32(strReturn.ToString().Trim()) < 0){num = 1;}else{try{num = Convert.ToInt32(strReturn.ToString().Trim()) + 1;}catch{signErr = 0;strErr = "程序文件被損壞!";return;}}if ((num > 0x3e8) && (DateTime.Now > Convert.ToDateTime("2012-10-12"))){signErr = 0;strErr = "程序文件被損壞!";}else{string val = num.ToString();WritePrivateProfileString("SERVER", "desktop", val, strFielName);if (con == null){con = new SqlConnection();}if (con.State != ConnectionState.Open){con.ConnectionString = strCon;try{con.Open();}catch{signErr = 0;strErr = "數據庫連接失敗,請檢查!";}}}}public static void UpdataDt(DataTable dt, SqlDataAdapter dpt){signErr = 1;strErr = "";OpenCon();if (signErr != 0){try{SqlCommandBuilder builder = new SqlCommandBuilder(dpt);dpt.Update(dt);}catch (Exception exception){signErr = 0;strErr = exception.ToString();}con.Close();con.Dispose();}}public static void UpdataMultiDt(DataTable[] dt, SqlDataAdapter[] dpt){signErr = 1;strErr = "";OpenCon();if (signErr != 0){SqlTransaction transaction = con.BeginTransaction();try{SqlCommandBuilder[] builderArray = new SqlCommandBuilder[dt.Length];for (int i = 0; i < dt.Length; i++){dpt[i].SelectCommand.Transaction = transaction;builderArray[i] = new SqlCommandBuilder(dpt[i]);dpt[i].Update(dt[i]);}transaction.Commit();}catch (Exception exception){signErr = 0;strErr = exception.ToString();transaction.Rollback();}con.Close();con.Dispose();}}[DllImport("kernel32.dll")]public static extern long WritePrivateProfileString(string section, string key, string val, string filePath); }
看下它的加密解密的函數;
?
?
public static string Encrypto(string Source) {byte[] bytes = Encoding.UTF8.GetBytes(Source);MemoryStream stream = new MemoryStream();mobjCryptoService.Key = GetLegalKey();mobjCryptoService.IV = GetLegalIV();ICryptoTransform transform = mobjCryptoService.CreateEncryptor();CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write);stream2.Write(bytes, 0, bytes.Length);stream2.FlushFinalBlock();stream.Close();return Convert.ToBase64String(stream.ToArray()); }?
public static string Decrypto(string Source) {byte[] buffer = Convert.FromBase64String(Source);MemoryStream stream = new MemoryStream(buffer, 0, buffer.Length);mobjCryptoService.Key = GetLegalKey();mobjCryptoService.IV = GetLegalIV();ICryptoTransform transform = mobjCryptoService.CreateDecryptor();CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read);StreamReader reader = new StreamReader(stream2);return reader.ReadToEnd(); }?
?
使用的是.net framework 的System.Security下的類;
?
ctl_xxxx的一堆,都是用戶控件,是為了減輕開發量;如下,
public class ctl_Recede : UserControl
{
? ? // Fields
? ? private IContainer components;
? ? private decimal dAgio;
? ? private decimal dAgioPrice;
? ? public DataGridView dgvData;
? ? private decimal dMoney;
? ? private SqlDataAdapter[] dpt;
? ? private DataTable[] dtData;
? ? private DataTable dtSaleDetail;
? ? private frm_RecedeBalance frmBalance;
? ? private Label label1;
? ? private Label label2;
? ? private Label label6;
? ? private Label lblAgi;
? ? private Label lblAgio;
? ? private Label lblAgioPric;
? ? private Label lblAgioPrice;
? ? private Label lblAssociatorTyp;
? ? private Label lblAssociatorType;
?
總結
以上是生活随笔為你收集整理的图解分析一个dNet进销存软件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解内存搜索工具初步使用
- 下一篇: C#访问SQLite完整增删改查代码