使用SqlConnection,SqlCommand,SqlDataReader的类进行数据库操作时,需要编写大量机械的代码,使用编写数据库访问类程序集,可以将这些重复的工作进行封装和复用。提高效率。
创建一个类库,生成AutoLotDAL(DataAccessLayer数据访问层)类库项目。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; namespace AutoLotDAL { public class InventoryDAL { private SqlConnection sqlCn = new SqlConnection(); public void OpenConnection(string conString) { sqlCn.ConnectionString = conString; 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" + "(CarID,Make,Color,PetName) values" + "('{0}','{1}','{2}','{3}')", id, make, color, petName); using (SqlCommand cmd = new SqlCommand(sql, sqlCn)) { cmd.ExecuteNonQuery(); } } public void UpdateCarPetName(int id, string newPetName) { string sql = string.Format("Update Inventory set PetName='{0}' where CarID='{1}'", newPetName , id); using (SqlCommand cmd = new SqlCommand(sql, sqlCn)) { cmd.ExecuteNonQuery(); } } public DataTable GetAllInventory() { DataTable inv = new DataTable(); string sql = "Select * from Inventory"; using (SqlCommand cmd = new SqlCommand(sql, sqlCn)) { SqlDataReader sdr = cmd.ExecuteReader(); //使用DataTable 的load方法将SqlDataReader读入到DataTable中 inv.Load(sdr); sdr.Close(); } return inv; } } }
使用范例,首先添加引用,然后编写
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data.Common; using System.Data; using System.Configuration; using AutoLotDAL; namespace DataProviderFactory { class Program02 { static void Main(string[] args) { Console.WriteLine("*****使用Provder Factory示例******"); SqlConnectionStringBuilder conStringBuilder = new SqlConnectionStringBuilder(); conStringBuilder.InitialCatalog = "AutoLot"; conStringBuilder.DataSource = @"(local)/sql2005"; conStringBuilder.IntegratedSecurity = true; conStringBuilder.ConnectTimeout = 30; InventoryDAL inv = new InventoryDAL(); inv.OpenConnection(conStringBuilder.ConnectionString); DataTable dt = inv.GetAllInventory(); foreach (DataRow row in dt.Rows) { foreach (DataColumn dc in dt.Columns) { Console.Write(row[dc].ToString()+"/t"); } Console.WriteLine(); } inv.CloseConnection(); Console.ReadLine(); } } }
改写AutoLotDAL.cs文件中
…… public void InsertAuto(int id, string color, string make, string petName) { string sql = string.Format("Insert into Inventory" + "(CarID,Make,Color,PetName) values" + "('{0}','{1}','{2}','{3}')", id, make, color, petName); using (SqlCommand cmd = new SqlCommand(sql, sqlCn)) { cmd.ExecuteNonQuery(); } } public void InsertAutoUsingParameters(int id, string color, string make, string petName) { string sql = string.Format("Insert into Inventory" + "(CarID,Make,Color,PetName) values" + "(@CarID,@Make,@Color,@PetName)"); using (SqlCommand cmd = new SqlCommand(sql,sqlCn)) { SqlParameter param = new SqlParameter(); param.ParameterName = "@CarID"; param.Value = id; param.SqlDbType = SqlDbType.Int; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Make"; param.Value = make; param.SqlDbType = SqlDbType.NVarChar; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@Color"; param.Value = color; param.SqlDbType = SqlDbType.NVarChar; param.Size = 10; cmd.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@PetName"; param.Value = petName; param.SqlDbType = SqlDbType.NVarChar; param.Size = 10; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } } ……
使用Main示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data.Common; using System.Data; using System.Configuration; using AutoLotDAL; namespace DataProviderFactory { class Program02 { static void Main(string[] args) { Console.WriteLine("*****使用Provder Factory示例******"); SqlConnectionStringBuilder conStringBuilder = new SqlConnectionStringBuilder(); conStringBuilder.InitialCatalog = "AutoLot"; conStringBuilder.DataSource = @"(local)/sql2005"; conStringBuilder.IntegratedSecurity = true; conStringBuilder.ConnectTimeout = 30; InventoryDAL inv = new InventoryDAL(); inv.OpenConnection(conStringBuilder.ConnectionString); Console.WriteLine("******在插入数据之前*****"); PrintInventory(inv); Console.WriteLine("******在插入数据1之后*****"); inv.InsertAuto(12, "Black", "BMW", "zz"); PrintInventory(inv); Console.WriteLine("******在插入数据2之后*****"); inv.InsertAutoUsingParameters(11, "Black", "BMW", "zz"); PrintInventory(inv); inv.CloseConnection(); Console.ReadLine(); } private static void PrintInventory(InventoryDAL inv) { DataTable dt = inv.GetAllInventory(); foreach (DataRow row in dt.Rows) { foreach (DataColumn dc in dt.Columns) { Console.Write(row[dc].ToString() + "/t"); } Console.WriteLine(); } } } }
在AutoLotDAL中添加一个GetPetName方法,用于返回一个指定CarID的PetName,注意存储过程调用后的output返回类型,可以通过SqlCommand的Parameters索引获得其值。注意参数名称,大小写必须和存储过程的大小写一致。
public string LookUpPetName(int carID) { string carPetName = string.Empty; using (SqlCommand cmd = new SqlCommand("GetPetName", sqlCn)) { cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param.SqlDbType = SqlDbType.Int; param.Value = carID; param.ParameterName = "@carID"; cmd.Parameters.Add(param); param = new SqlParameter(); param.SqlDbType = SqlDbType.Char; param.Size = 10; param.ParameterName = "@petName"; param.Direction = ParameterDirection.Output; cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); //返回输出参数 carPetName = ((string)cmd.Parameters["@petName"].Value).Trim(); } return carPetName; }