【.NET】C#.NET ADO.NET数据访问模型概述(二)
二.执行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());
}
}
}
}