1.第一個WinForm程式
(1) WinForm: Windows Form, .NET中用來開發Windows視窗應用程式的技術。
(2) 控制項:視窗上很多元素都是相似的,因此將這些元素抽象成一些類,這些類就叫做控制項。按鈕(Button),文字框(TextBox),標籤(Label),選項按鈕(RadioButton),複選框(CheckBox)。
(3) 複習TryParse
int.TryParse:將數位字串表示形式轉換為它的等效32位有符號整數,一個指示操作是否成功的傳回值。
文法結構:public static bool Tryparse(string s,out int result);
註:TryParse方法類似與parse方法,不同之處在於TryParse方法在轉換失敗事不引發異常。
例如:加法計算機:
string str1=TextBox1.Text; string str2=TextBox2.text;
int i1,i2;
if(!int.TryParse(str1,out i1))
{
MessageBox.Show(“第一個數不是合法的整數!”);
Return;
}
If(!int.TryParse(str2,out i2))
{
MessageBox.Show(“第二個數不是合法的整數!”);
Return;
}
int i3=i1+i2; TextBox3.Text=Convert.ToString(i3);
(4) 文字框的幾種模式:Multiline(多行),PassWordChar(密碼)
(5) 控制項名要有含義,控制項名首碼的“潛規則”,按鈕Button:btn;文字框TextBox:txt;
複選框CheckBox:cb。控制項的名字要有意義!
(6) 局部變數每次運行完畢變數的值都會被銷毀,下次在運行,會重新初始化,而類欄位只要是一個對象,那麼只要對象不銷毀,就會一直保持對象的欄位值。
例如:文字框實現查詢出某人的成績是裡面最高的?
ADO.NET基礎
- ADO.NET基礎
(1) 程式要和資料庫進行互動要通過ADO.NET進行,通過ADO.NET就能在程式中執行SQL語句,ADO.NET提供了對各種不同年資料庫的統一操作介面。
(2) 在Winform中用到的一段代碼(楊中科老師譽為神奇的代碼)。嘿嘿
string dataDir=AppDomain.CurrentDomain.BaseDirectory;
if(dataDir.Endswith(@”\bin\Debug”)||dataDir.EndsWith(@”\bin\Release”))
{
dataDir=System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
AppDomain.CurrentDomain.SetData(“DataDirectory”,dataDir);
}
原理分析:連接字串中的DataDirectory的值就是通過AppDomain.CurrentDomain.SetData賦值過去的,如果當前程式的目錄以”\bin\Debug\”或者”\bin\Release\”,則認為它是運行在Visual Studio環境中的,就取項目的目錄然後賦值給DataDirectory的這個Key。
- 串連SQL Server
(1) 連接字串:程式通過連接字串指定要串連到那台伺服器上的,那個執行個體的那個資料庫,用什麼使用者名稱和密碼。
(2) 項目內嵌mdf檔案形式的連結字串為:
“DataSource=.\SqlExpress;AttachDBFilename=|DataDirectory|\Database.mdf|; Integrated.Security=True;User InStance=True”。
註解:.\SqlExpress表示”本機上的SQLExpress執行個體”如果資料庫執行個體名不是SQLExpress,則需要修改。
(3) ADO.NET中通過SqlConnection類建立到SQL Server的串連,SqlConnection代表一個資料庫連接,ADO.NET中的串連等資源都實現了IDisposable介面,可以使用using進行資源管理。
(4) 釋放資源的兩種方法:
(1) using( ) (2) try
{ { }
catch
} {
conn.Close();
conn.Dispose();
}
- 執行簡單的Insert語句
(1) SqlCommand表示向伺服器提交一個命令(SQL語句等)。
CommandText屬性為要執行的SQL語句,ExecuteNonQuery方法執行一個非查詢語句(Update,Insert,Delete)等。
using(SqlCommand cmd=conn.CreateCommand())
{
cmd.CommandText=”Insert into myTable1(name) values(‘abc’)”;
cmd.ExecuteNonQuery();
}
(2) ExecuteNonQuery傳回值是執行受影響的行數。
- 執行查詢
(1) 執行有多行結果集的用ExecuteReader。
SqlDataReader reader=cmd.ExecuteReader();
While(reader.Read())
{
Console.WriteLine(reader.GetString());
}
(2) reader的GetString,GetInt32等方法只能接受整數參數,也就是序號,用GetOrdinal()方法根據列名動態得到序號。
(3) close和Dispose的區別:
1) close關閉以後還能開啟。
2) Dispose:直接銷毀,不能再次使用。
3) using在出了範圍以後調用Dispose,SqlConnection,FileStream等的Dispose內部都會做這樣的判斷,判斷有沒有close,如果沒有close就先close在釋放資源Dispose。
- ExecuteScalar
(1) SqlCommand的ExecuteScalar方法用於執行查詢,並返回查詢所返回的結果集中的第一行第一列,因為不能確定傳回值的類型,所以傳回值是object類型。
cmd.CommandText=”Select count(*) from T_Users”;
int i=Convert.ToInt32(cmd.ExecuteScalar());
(2) 得到自動成長欄位的值,在values關鍵字前面加上output inserted.ID,其中id為主鍵欄位名,執行結果就是輸入的的主索引值,用ExecuteScalar執行最方便。
cmd.CommandText=”Insert into T_Users(username,password) output inserted.ID values(‘admin’,’888888’)”;
int i=Convert.ToInt32(cmd.ExecuteScalar());
- SQL注入漏洞攻擊
(1) 登入判斷:select * from T_Users where username=…. and Password=…..;將參數拼接到SQL語句中。
(2) 構造惡意的password=’or’1’=’1
(3) 防範注入漏洞攻擊的方法:不使用SQL語句拼接,通過參數賦值。
- 查詢參數
(1) SQl語句使用@UserName表示”此處用參數代替”,向SqlCommand的Parameters中添加參數。
cmd.CommandText=”Select * from T_User where username=@username and Password=@pwd”;
cmd.Parameters.Add(new SqlParameters(“username”,”admin”));
cmd.Parameters.Add(new SqlParameters(”password”,”888888”));
(2) 參數在SQL Server內部不是簡單的字串替換,SQL Server直接用添加的值進行資料比較,因此不會有注入漏洞攻擊。