首先關於資料庫的開啟可考慮兩種方式
1.用using{...}區塊
using(SqlConnection con = new SqlConnection())
{
con.ConnectionString = "....";
con.Open();
....
}
這種方法會在脫離區塊後立刻釋放Connection物件的資源
所以不用使用資料庫的關閉方法(如Close()、Dispose())
另外就是正規的寫法
2.
using System.Data.SqlClient;
....
SqlConnection con = new SqlConnection("xxx"); //xxx = connection string
SqlCommand cmd = new SqlCommand("xxx", con); //xxx = SQL command
SqlDataReader dr;
...
con.Open();
dr = cmd.ExecuteReader(); //使用DataReader物件讀取資料庫內容
...
con.Close();
SqlCommand物件的幾個常用方法跟屬性
ExecuteNonQuery() -
可以執行INSERT、UPDATE、DELETE等SQL command,成功時回傳受影響的紀錄筆數
ExecuteScalar() -
適用於結果集只回傳一個資料列的第一欄,例如SQL command 的COUNT()、MAX()等
ExecuteReader() -
執行Command物件中所指定的SQL的SELECT敘述,並建立一個DataReader來瀏覽資料
CommandText -
設定或取得要執行的命令
SqlCommand使用範例:
string sqlStr = string.Empty;
sqlStr = "INSERT INTO TableA(姓名, 聯絡方式, 薪水)" + "VALUES(@name, @tel, @pay)"
SqlCommand cmd = new SqlCommand( sqlStr , con);
cmd.CommandType = CommandType.StoreProcedure; //預先編譯SQL處理函式
cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar));
cmd.Parameters.Add(new SqlParameter("@tel", SqlDbType.NVarChar));
cmd.Parameters.Add(new SqlParameter("@pay", SqlDbType.NVarChar));
cmd.Parameters["@name"].Value = "vc56";
cmd.Parameters["@tel"].Value = "0000000";
cmd.Parameters["@pay"].Value = "$20000";
cmd.ExecuteNonQuery();
DataReader有幾個方法跟屬性較為重要,以下列出:
FieldCount屬性 -
將已查詢欄位的總數傳回
Read() -
將指標移到下一筆,並判斷是否指到EOF
如果到資料結尾則回傳false
Item[i] -
取得第i欄的資料內容
Item["欄位名稱"]集合 -
取得指定欄位名稱所指的資料內容
GetValue(i) -
取得第i欄位的資料內容,傳回值為object資料型別
IsDBNull(i) -
判斷第i個欄位使否為資料庫Null值
使用範例:
while(dr.Read())
{
for(int i = 0; i < dr.FieldCount; i++)
{
textBox1.Text += dr[i].ToString() + "\t";
}
}
以執行效率來說,使用索引會比使用欄位名稱還快
此外,取出時可使用方法來省略手動轉型的動作,如下:
while(dr.Read())
{
textBox1.Text += dr.GetString(0) + "\t";
textBox1.Text += dr.GetInt32(1).ToString() + "\t";
...
}
DataSet則是ADO.NET的特色
他會先將資料庫的內容存至記憶體中,並得以執行離線操作
操作完畢後再將內容回寫至資料庫中
適用於多用戶端資料存取,當然占用的記憶體多是不可避免的事
DataSet中可以包含一個以上的DataTable物件
由DataAdapter使用Command物件執行SQL command
再將取得的資料寫至DataSet,如此就能用DataTable存取資料表,範例:
using System.Data.SqlClient;
using System.Data;
.....
using(SqlConnection con = new SqlConnection())
{
con.ConnectionString = "....";
DataSet ds = new DataSet();
SqlDataAdapter dsContent = new SqlDataAdapter("xxx", con); //xxx = sql command
dsContent.Fill(ds, "Content"); //使用Fill()時,DataAdapter會自動連線到資料庫
/*
Adapter也可以改成SqlDataAdapter dsContent = new SqlDataAdapter();
dsContent.SelectCommand = cmd;
這樣就可以使用SqlCommand物件來保持彈性
另外有幾種特性語法示範
int n = ds.Tables.Count; //取得DataSet中DataTable的總數
String tName = ds.Table[i].TableName; //取得第i個DataTable的表格名稱
*/
DataTable dt = ds.Tables["Content"]; //對應SqlDataAdapter Fill ()時填入的資料表名
for(int i = 0; i < dt.Rows.Count; i++)
{
for(int j = 0; j < dt.Columns.Count; j++)
{
textBox1.Text += dt.Rows[i][j].ToString() + "\t";
}
textBox1.Text += Enviroment.NewLine;
}
}
....
DataSet另外尚有使資料表之間產生關連的操作
ds.Realations.Add( "關聯名稱",
ds.Tables["dt1"].Columns["dt1要關聯的欄位名稱"],
ds.Tables["dt2"].Columns["dt2要關聯的欄位名稱"],
)
日後可與DataView物件結合使用
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "dt1";
dataGridView2.DataSource = ds;
dataGridView2.DataMember = "dt1.關聯名稱";
沒有留言:
張貼留言