构建可重用的数据访问库
当想向某表提交SQL语句来实现修改的时间(如插入、删除、修改操作),就要用到ExecuteNonQuery()方法。
数据库代码的重用
- 增加连接逻辑
作用:连接、断开某个数据源
代码:
public class InventoryDAL{
private SqlConnection sqlCn = null;
//连接数据源
public void OpenConnection(string connectionString){
sqlCn = new SqlConnection();
sqlCn.ConnectionString = connectionString;
sqlCn.Open();
}
//关闭数据源
public void CloseConnection(){
sqlCn.Close();
}
}
- 增加插入逻辑
作用:增加新记录
代码:
public void InsertAuto(int id,string color,string make,string petName){
string sql = string.Format("Insert Into Inventory"+.....);
//使用我们的连接执行
using(SqlCommand cmd = new SqlCommand(sql,this.sqlCn){
cmd.ExecuteNonQuery();
}
}
- 增加删除逻辑
- 增加更新逻辑
- 增加选择逻辑
使用参数化的命令对象
上述内容,都是使用字符串字面量来实现插入、更新和删除逻辑的,我们也可以使用参数化查询,能像对象那样处理SQL参数。
而且,参数化查询执行起来比纯文本的SQL语句快很多,并且可以消除SQL注入攻击。
例如:
using(SqlCommand cmd = new SqlCommand(sql,this.sqlCn)){
//填充参数集合
SqlParameter param = new SqlParameter();
//设置DbParameter的名称
param.ParameterName = "@CarID";
//设置参数的值
param.Value = id;
//设置原始数据类型
param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(param);
.........
cmd.ExecuteNonQuery();
}
执行存储过程
在数据库中已有名为GetPetname的存储过程,格式如下:
GetPetName
@carID int,
@petName char(10) output
AS
SELECT @petName = PetName from Inventory where CarID = @carID
c#调用存储过程:
public string LookUpPetName(int carID){
string carPetName = "";
//设定存储过程名
using( SqlCommand cmd = new SqlCommand("GetPetName",this.sqlCn)){
cmd.CommandType = CommandType.StoredProcedure;
//输入参数
SqlParameter param = new SqlParameter();
param.ParameterName = "@carID";
param.Value = carID;
param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(param);
//输出参数
param = new SqlParameter();
param.ParameterName = "@petName";
param.SqlDbType = SqlDbType.Char;
param.Size = 10;
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);
//执行存储过程
cmd.ExecuteNonQuery();
carPetName = (string)cmd.Parameters["@petName"].Value;
}
}