二.執行SQL語句
1.使用SqlCommand執行SQL語句
一般,我們把資料庫的各種操作分成兩種:
(1)不返回記錄集的命令。通常是執行添加,插入和修改等操作的SQL語句來更新記錄。
(2)返回記錄集的命令。通常是執行查詢SQL語句來擷取資料集用於呈現。
不論是哪種操作都需要使用Command對象來執行SQL語句。
SqlCommand對象重載的幾個方法:
(1)SqlCommand()
(2)SqlCommand(string cmdText)
(3)SqlCommand(string cmdText,SqlConnection connection)
(4)Sqlcommand(string cmdText,SqlConnection connection,SqlTransaction transaction)
Sqlcommand對象需要接受一個有效Sqlconnection.用來告知Command對象我們需要和哪個資料來源進行互動。
還可以在Sqlcommand的構造方法中直接傳入要執行的SQL語句。還可以傳入SqlTransaction參數實現事務。
因此,使用一個Command對象簡單來說需要以下步驟:
(1)聲明一個有效Connection對象。
(2)聲明一個有效Command對象。
(3)為Command對象指定需要操作的SQL語句字串和關聯的Connection對象的執行個體。
(4)開啟Connection對象。
(5)執行Command對象的各種方法進行資料庫操作。
(6)關閉Connection對象。
2.使用參數Parameter來防止SQL注入
SqlCommand cmd =new Sqlcommand("Select count(*) from tbclass where className=@className",conn)
cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.add("@className ",,sqlDbType.VarChar,50);
cmd.Parameters["@className"].Value=txtclass.Text;
cmd.Parameters["@className"].Direction=ParameterDirection.Input;
3.使用DataReader訪問資料
DataReader是唯讀只進的讀取方式。所以往往會使用迴圈語句來讀取記錄集。
以下執行個體需要引用:
using System.Data;
using System.Data.SqlClient;
using System.Text;
(1)使用DataReader讀取單記錄集
string sConnectionString = @"Server=(Local)\SQLExpress;database=GuestBook;Trusted_Connection=True";
using (SqlConnection conn = new SqlConnection(sConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("Select * from tbGuestBook", conn))
{
using (SqlDataReader dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
StringBuilder htmlstr = new StringBuilder();
//使用StringBuilder構造字串效率比較高
htmlstr.Append("<table border='1' cellpadding='5' cellspacing='0' style='font-size:9pt;font:宋體'>");//表格開始
htmlstr.Append("<tr style='background-color=#f0f0f0'>");//表頭開始
for (int i = 0; i < dr.FieldCount; i++)
{
htmlstr.Append(string.Format("<td><strong>{0}</strong></td>",dr.GetName(i)));//構造表頭
}
htmlstr.Append("</tr>");//表頭結束
while (dr.Read())
{
htmlstr.Append("<tr>");//記錄行開始
for (int i = 0; i < dr.FieldCount; i++)
{
htmlstr.Append(string.Format("<td>{0}</td>",dr.GetValue(i)));//構造記錄行
}
htmlstr.Append("</tr>");//記錄行結束
}
htmlstr.Append("</table>");//表格結束
Response.Write(htmlstr);
}
}
}
}
(2)使用DataReader讀取多記錄集
string sConnectionString = @"Server=(Local)\SQLExpress;database=bbs;Trusted_Connection=True";
using (SqlConnection conn = new SqlConnection(sConnectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("Select * from Bbs_Link ; Select * from Bbs_MenuBig", conn))
{
using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection))//得到一個DataReader.
{
if (dr.HasRows)//記錄集是否為空白
{
do
{
StringBuilder htmlstr = new StringBuilder();
//使用StringBuilder構造字串效率比較高
htmlstr.Append("<table border='1' cellpadding='5' cellspacing='0' style='font-size:9pt;font:宋體'>");//表格開始
htmlstr.Append("<tr style='background-color=#f0f0f0'>");//表頭開始
for (int i = 0; i < dr.FieldCount; i++)
{
htmlstr.Append(string.Format("<td><strong>{0}</strong></td>", dr.GetName(i)));//構造表頭
}
htmlstr.Append("</tr>");//表頭結束
while (dr.Read())
{
htmlstr.Append("<tr>");//記錄行開始
for (int i = 0; i < dr.FieldCount; i++)
{
if(!dr.IsDBNull(i))
htmlstr.Append(string.Format("<td>{0}</td>", dr.GetValue(i)));//構造記錄行
}
htmlstr.Append("</tr>");//記錄行結束
}
htmlstr.Append("</table>");//表格結束
Response.Write(htmlstr);
} while (dr.NextResult());
}
}
}
}