2015年9月13日 星期日

使用VB(ASP.NET) 連接 MySQL 方法

  1. 安裝 MySQL
  2. 安裝 MySQL Connector/ODBC
    安裝完成的檢查:控制台\系統管理工具\資料來源 (ODBC)\驅動程式
    看看有沒有成功安裝 (捲軸往下拉,應該會有 Mysql ODBC 5.1 Driver)
  3. 建立資料庫、資料表、灌資料
  4. 開啟 VWD,建立 ASP.NET Web 應用程式
  5. 在方案總管的專案(not方案)上方按右鍵,選擇『加入參考』,切換到『瀏覽』標籤,搜尋位置『C:\Program Files (x86)\MySQL\MySQL Connector Net x.x.x\Assemblies\』,看要進入哪個版本,找到『Mysql.Data.dll』加入
  6. xxx.aspx.vb 加入 Imports MySql.Data.MySqlClient 
    xxx.aspx.cs 加入 using MySql.Data.MySqlClient;
  7. 撰寫程式碼

VB 參考程式碼 (.NET 不支援 set 和 let 了)

'宣告
Dim oConn As MySqlConnection
Dim sConnStr As String
Dim oDbAdapter As MySqlDataAdapter
Dim oTable As Data.DataTable

'資料庫連線字串'Database=資料庫
sConnStr = String.Format("Server=localhost;Port=3307;User=rrrrr; Password=pppp; Database=test; Pooling=false" 

'開啟資料庫連線
oConn = New MySqlConnection(sConnStr)
oConn.Open()

'執行 SQL 語法取得資料集
oTable = New Data.DataTable()
oDbAdapter = New MySqlDataAdapter("SELECT * FROM first", oConn)
oDbAdapter.Fill(oTable)

'將資料集餵給 GridView 當作 DataSource (後記得要 Binding)
GridView1.DataSource = oTable
GridView1.DataBind()


C# 參考程式碼:

//建立連接字串與物件
string cnnString = "Server=localhost;Port=3307;Database=test;User=rrrrr;Pwd=pppp";
MySqlConnection cnx = new MySqlConnection(cnnString);
MySqlDataAdapter adapter = new MySqlDataAdapter();

//執行 SQL 語法
string cmdText = "SELECT * FROM first";
MySqlCommand cmd = new MySqlCommand(cmdText, cnx);

//取得資料集
DataSet ds = new DataSet();
adapter.SelectCommand = cmd;
adapter.Fill(ds);

//餵給GridView
GridView1.DataSource = ds;
GridView1.DataBind();

遇到的問題:

  1. 安裝了 Appsev 的 MySQL,會沒有 Connector NET 6.7.4 這個模組,導致在『加入參考』的時候會找不到 Mysql.Data.dll 這個函式庫,因此還是要安裝官方的 MySQL
  2. Appserv 的 MySQL 有提供一個 Web-based 的管理介面,官方的管理介面則是Workbench這個軟體,官方的MySQL叫做 WinMySQLAppserv MySQL就叫做MySQL
  3. 當有 Appserv MySQL時,因為MySQL預設的Port3306,所以 WinMySQL Port會被改成3307

物件Object的New,Dispose與Connection的Open,Close概念分享

什麼是New

我們經常可以看到有人使用一個物件的時候會寫

1Dim oEmp as ObjEmployee
2oEmp = New ObjEmployee
而且少了New就不能執行,那麼什麼是New呢 
New是產生執行個體,不過相信很多人又要問,什麼是【產生執行個體】 (能不能講明白一點啊!! )


這要提到電腦的程式運作過程。程式在電腦上跑,會把程式的區段,在記憶體裡面挖一塊空間,然後把程式碼載入那塊空間
接著程式在運作的時候,就是記憶體與CPU之間溝通、運算、記錄等動作,而把【挖塊記憶體,把程式載到那塊空間】這個過程就是【產生執行個體】。


因此沒有New的話會怎樣,程式區塊根本沒有載入到記憶體中,因此也無法運作執行
講的擬人化一點

Dim oEmp as ObjEmployee  '宣告oEmp是ObjEmployee這種物件類別(此時有魂無體)
oEmp = New ObjEmployee   '產生執行個體(此時投胎轉世,靈魂變成實體,可以開始工作)

什麼是 Dispose


當一個物件已經使用完後,未來不會再使用,此時這個物件已經完成他這一生(New完之後到現在)的任務。因此他可以塵歸塵、土歸土...一切還諸天地...此時就進行Dispose 
然而實際上,在記憶體中,當物件Dispose的時候,並沒有把該段記憶體清空,只是標註,這段空間不再使用,直到GC啟動把他清空才算真正的清空。


因此如果用完後,不進行 Dispose ...那麼就會等到該位置很久沒動作了(就像有個人躺在地上,已經超過一定時間(一個月??)沒動作,也沒呼吸),才會被其他的程式拿來用。
以上說明的是New(生)與 Dispose (死)的關係


什麼是Open


當你有了實體後,代表可以開始運作
但不是真的已經運作了
以Connecion來說
1Using Conn As New Connetion(ConnStr)
2    'Conn.Open
3    Dim Dr as SqlDataReader
4    Using Cmmd as New SqlCommand("Select...",Conn)
5        Dr = Cmmd.ExecuteReader
6    End Using
7End Using
上面這段程式會出錯,他告訴你...Connection沒有Open,也就例如您建立了一個橋,但是這座橋卻沒有通車,因此也沒辦法用。因此使用DataReader或者Cmmd.ExecuteNoneQuery的時候,都需要告訴他已經通車了...他才會正常運作。

而如果使用DataAdapter的話這個傢伙比較厲害... 他會看有沒有通車,有通車他就用;沒通車的話,他會自己把這通道打開,然後去使用。

最後說什麼是Close

Close是關閉通道,通道關了是可以再開的唷。
然後跟上面的 Dispose 再比對一下:
Close只是把通道關閉
 Dispose 卻是通知作業系統...我已經完成任務,這段記憶體你可以拿去再用...然後壽終正寢


垃圾回收機制

垃圾回收器有兩個基本的原理:

  1. 考慮某個物件在未來的程式執行中,將不會被存取。
  2. 向這些物件要求歸回記憶體。