相关知识:
- 前面所有示例,君是访问特定的数据库(SQL Server),因此注入SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter等类名都添加了“Sql”的前缀,并且隶属于System.Data.SqlClient命名空间。这就给代码的可移植性带来了巨大问题。如果数据库改用Oracle、MySQL或者BD2,代码几乎要全部重写,非常不利于重用。
- System.Data.Common命名空间提供了一组类和操作,使得程序可以忽略底层数据库的差异,进行统一的调用
- DbProviderFactories:代表所有的数据提供程序
- DbProviderFactory:代表某个特定的数据提供程序,例如:System.Data.SqlClient
- DbConnection、DbCommand、DbDataReader:与数据库实现无关的对象类型
- 使用通用数据库访问,在很大程度上可以使数据访问代码与数据库无关
主要代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Data; 7 using System.Data.Common; 8 9 namespace ConsoleApplication16 10 { 11 class Program 12 { 13 const string provider = "System.Data.SqlClient"; 14 const string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root"; 15 16 static void Main(string[] args) 17 { 18 //获取数据提供程序工厂类 19 DbProviderFactory factory = DbProviderFactories.GetFactory(provider); 20 21 //通过工厂创建连接对象 22 DbConnection conn = factory.CreateConnection(); 23 conn.ConnectionString = strConn; 24 25 //通过工厂创建命令对象 26 DbCommand cmd = factory.CreateCommand(); 27 cmd.Connection = conn; 28 cmd.CommandText = "SELECT AccountID, AccountName, password FROM Account"; 29 30 try 31 { 32 conn.Open(); 33 DbDataReader dr = cmd.ExecuteReader(); 34 35 while (dr.Read()) 36 { 37 Console.WriteLine("{0}:{1},{2}", dr[0], dr[1], dr[2]); 38 } 39 } 40 catch (Exception e) 41 { 42 Console.WriteLine(e); 43 } 44 finally 45 { 46 conn.Close(); 47 } 48 } 49 } 50 }