ADO.Net 浅析(一)

ADO.Net是什么?

ADO是.Net对DataBase操作的相关类的集合.

ADO在处理数据时,可分为连接式与断开式


ADO涉及到的主要对象:

连接对象:Connection          命令对象:Command             数据读取器对象:DataReader          数据适配器对象:DataAdapter

数据集对象: DataSet



下面是一个简单的连接式访问数据库的代码

private static void ReadOrderData(string connectionString)
{
    
string queryString =

        
"SELECT OrderID, CustomerID FROM dbo.Orders;";
//此处使用using来自动释放connection

    using (SqlConnection connection =
               
new SqlConnection(connectionString))
    {
        SqlCommand command 
=

            
new SqlCommand(queryString, connection);
        connection.Open();

        SqlDataReader reader 
=
 command.ExecuteReader();

        
// SqlDataReader 的默认位置在第一条记录前面。因此,必须调用 Read 来开始访问任何数据

        while (reader.Read())
        {
            Console.WriteLine(String.Format(
"{0}, {1}"
,
                reader[
0], reader[1
]));
        }

        
// 关闭reader

        reader.Close();
//对于SqlConnection的MARS模式关闭的情况下,一次只能打开一个 SqlDataReader,在第一个关闭之前,打开另一个的任何尝试都将失败。另外,在reader不关闭之前,相同的command.ExecuteReader();将会失败
(无论是否为MARS)

    }
}

 

接下来对上面这段代码做一些说明:

代码:
           Console.WriteLine(String.Format(
"{0}, {1}",
                reader[
0], reader[1]));

 

使用了reader的索引器,
索引器调用所的方法如下:

        override public object this[int i] {
            
get
 {
                
return
 GetValue(i);
            }
        }
 
        
override public object this[string
 name] {
            
get
 {
                
return
 GetValue(GetOrdinal(name));
            }
        }

 

 (二)关于command的一些方法的说明

 

ExecuteNonQuery 对连接执行 Transact-SQL 语句并返回受影响的行数。 (重写 DbCommand..::.ExecuteNonQuery()()()。)
ExecuteReader 已重载。 CommandText 发送到 Connection 并生成一个 SqlDataReader
ExecuteScalar 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。 (重写 DbCommand..::.ExecuteScalar()()()。)
ExecuteXmlReader CommandText 发送到 Connection 并生成一个 XmlReader 对象。

 

(三)关于connectionstring

以下是常用的几种connectionstring

//基本
string baseconnstr="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword";


//MARS

string marsconnstr="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
                    
+"MultipleActiveResultSets=true"


//在app_data文件夹中的sqlexpress.mdf

string mdfDataDir="Server=.\SQLExpress;AttachDbFilename=|DataDirectory|mydbfile.mdf; Database=dbname;Trusted_Connection=Yes;"


//使用SQL集群故障转移
string mirrorconnstr="Data Source=myServerAddress;Failover Partner=myMirrorServerAddress;Initial Catalog=myDataBase;Integrated Security=True;"

//异步
string asynconnstr="Server=myServerAddress;Database=myDataBase;Integrated Security=True;Asynchronous Processing=True;"

 

MARS中,其实是对未关闭的sqlcommand挂起.所以datareader只能使用其各自的command实例.
在非MARS的情况下,先将command对象dispose掉,然后重新构造command实例生成datareader,是不可行的,因为dispose并非立刻执行;