ADO.NET 总结
一、简单介绍ADO.NET
System.Data:DataTable,DataSet,DataRow,DataColumn,DataRelation,Constraint
System.Data.Common(各种数据访问类的基类和接口):DataColumnMapping,DataTableMapping
System.Data.SqlClient(对Sql Server进行操作的数据访问类):
1)SqlConnection:数据库连接器
2)SqlCommand:数据库命名对象
3)SqlCommandBuilder:生存SQL命令
4)SqlDataReader:数据读取器
5)SqlDataAdapter:数据适配器,填充DataSet
6)SqlParameter:为存储过程定义参数
7)SqlTransaction:数据库事务
二、SqlConnection(连接对象)
1、连接字符串
基本语法:数据源(Data Source)+数据库名称(Initial Catalog)+用户名(User ID)+密码(Password)。
说明:
(1)必须指定Sql Server支持的两种身份验证方法(即Windows身份验证和Sql Server身份验证)中的一种。要想使用Windows身份验证,必须在连接字符串中包括 Integrated Security 属性:Data Source=ServerName;Integrated Security=True;默认情况下,Integrated Security属性为False。
(2)连接字符串中可用的选项:
Application Name(应用程序名称):应用程序的名称。如果没有被指定的话,它的值为.NET SqlClient Data Provider(数据提供程序)。
AttachDBFileName/extended properties(扩展属性)/Initial File Name(初始文件名): 可连接数据库的主要文件的名称,包括完整路径名称。数据库名称必须用关键字数据库指定。
Connect Timeout(连接超时)/Connection Timeout(连接超时):一个到服务器的连接在终止之前等待的时间长度(以秒计),缺省值为15。
Connection Lifetime(连接生存时间): 当一个连接被返回到连接池时,它的创建时间会与当前时间进行对比。如果这个时间跨度超过了连接的有效期的话,连接就被取消。其缺省值为0。
Connection Reset(连接重置): 表示一个连接在从连接池中被移除时是否被重置。缺少值为真。
Current Language(当前语言): SQL Server语言记录的名称。
Data Source(数据源)/Server(服务器)/Address(地址)/Addr(地址)/Network Address(网络地址):SQL Server实例的名称或网络地址。
Encrypt(加密):当值为真时,如果服务器安装了授权证书,SQL Server就会对所有在客户和服务器之间传输的数据使用SSL加密。被接受的值有true(真)、false(伪)、yes(是)和no(否)。
Enlist(登记):表示连接池程序是否会自动登记创建线程的当前事务语境中的连接,其缺省值为真。
Database(数据库)/Initial Catalog(初始编目):数据库的名称。
Integrated Security(集成安全)/Trusted Connection(受信连接):表示Windows认证是否被用来连接数据库。它可以被设置成真、伪或者是和真对等的sspi,其缺省值为伪。
Max Pool Size(连接池的最大容量): 连接池允许的连接数的最大值,其缺省值为100。
Min Pool Size(连接池的最小容量): 连接池允许的连接数的最小值,其缺省值为0。
Network Library(网络库)/Net(网络):用来建立到一个SQL Server实例的连接的网络库。支持的值包括: dbnmpntw (Named Pipes)、dbmsrpcn (Multiprotocol/RPC)、dbmsvinn(Banyan Vines)、dbmsspxn (IPX/SPX)和dbmssocn (TCP/IP)。协议的动态链接库必须被安装到适当的连接,其缺省值为TCP/IP。
Packet Size(数据包大小):用来和数据库通信的网络数据包的大小。其缺省值为8192。
Password(密码)/Pwd:与帐户名相对应的密码。
Persist Security Info(保持安全信息):用来确定一旦连接建立了以后安全信息是否可用。如果值为真的话,说明像用户名和密码这样对安全性比较敏感的数据可用,而如果值为伪则不可用。重置连接字符串将重新配置包括密码在内的所有连接字符串的值。其缺省值为伪。
Pooling(池):确定是否使用连接池。如果值为真的话,连接就要从适当的连接池中获得,或者,如果需要的话,连接将被创建,然后被加入合适的连接池中。其缺省值为真。
User ID(用户ID):用来登陆数据库的帐户名。
Workstation ID(工作站ID):连接到SQL Server的工作站的名称。其缺省值为本地计算机的名称。
(3)例举典型连接字符串
1>SQL Server连接字符串
标准安全连接:
Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Trusted_Connection=False;
可信连接:
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;或者
Server=myServerAddress;Database=myDatabase;Trusted_Connection=True;
2> Access连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myDatabase.mdb;User Id=admin;Password=;
3>MySQL连接字符串
Server=myServerAddress;Database=myDatabase;Uid=myUsername;Pwd=myPassword;
4>DB2连接字符串
Server=myAddress:myPortNumber;Database=myDatabase;UID=myUsername;PWD=myPassword;
5>Oracle连接字符串
Data Source=TORCL;User Id=myUsername;Password=myPassword;
2、创建连接对象
SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder()
{
DataSource = "",
InitialCatalog = "",
UserID = "",
Password = ""
};
SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString());
3、打开和关闭连接对象
using(SqlConnection connection = new SqlConnection(connectionStringBuilder.ToString()))
{
connection.Open();
connection.Close();
}
4、连接池
(1)建立一个数据库连接是非常消耗时间和消耗资源的事情。ADO.NET提供了名为连接池的优化方法。连接池就是一个容器,它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。
(2)连接池具有类别区分,同一个时刻同一应用程序域可以有多个不同类型的连接池。细致的讲,连接池是由进程、应用程序域、连接字符串以及windows标识(在使用集成的安全性时)共同组成签名来标识区分的。但对于同一应用程序域来说,一般只由连接字符串来标识区分。当打开一条连接时,如果该条连接的类型签名与现有的连接池类型不匹配,则创建一个新的连接池。反之,则不创建新的连接池。
例如:
//创建连接对象1
using (SqlConnection conn1 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
conn1.Open();
}
//创建连接对象2
using (SqlConnection conn2 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=pubs"))
{
conn2.Open();
}
//创建连接对象3
using (SqlConnection conn3 = new SqlConnection("DataSource=(local);Integrated Security=SSPI;Initial Catalog=Northwind"))
{
conn3.Open();
}
创建了三个SqlConnection对象,但是管理时只需要两个连接池。因为conn1与conn2的连接字符串相同,所有可以共享一个连接池。conn2与conn1,conn3不同,所以需要创建新的连接池。
(3)连接池行为可以通过连接字符串控制:
Connection Timeout:连接请求等待超时时间。默认为15秒。
Max Pool Size:连接池中最大连接数。默认为100。
Min Pool Size:连接池中最小连接数。默认为0。
Pooling:是否启用连接池。ADO.NET默认是启动的。
(4)使用T-SQL语句监视连接状态:exec sp_who
(5)高效使用连接池的基本原则:
● 在最晚的时刻申请连接,在最早的时刻释放连接。
● 关闭连接时先关闭相关用户定义的事务。
● 确保并维持连接池中至少有一个打开的连接。
● 尽力避免池碎片的产生。主要包括集成安全性产生的池碎片以及使用许多数据库产生的池碎片。
三、SqlCommand(命令对象)
1、实例化的时候默认初始化的四个属性:
CommandText:空字符串("")
CommandTimeout:30
CommandType:CommandType.Text
Connection:Null
2、创建命令对象:
SqlCommand command = connection.CreateCommand(); //这种方式比较好
SqlCommand command=new SqlCommand();
3、几个重要的属性:
(1)CommandText:获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程!
(2)CommandType:设置你执行的SQL语句是存储过程还是T-SQL(是一个枚举)!
● Text:SQL文本命令(默认)
● StoredProcedure:存储过程名称
● TableDirect:表的名称
(3)Parameters:设置你T-SQL中你需要用到的参数。
4、几个重要的方法:
(1)ExecuteNonQuery:返回是影响的行数(int),主要执行更新,添加,删除等操作!
(2)ExecuteReader:执行SQL或存储过程,返回的是SqlDataReader类型,主要用来查询!
注意这个方法的重载CommandBehavior枚举,成员如下:
● Default:此查询可能返回多个结果集。执行查询可能会影响数据库状态。当不设置CommandBehavior标志时默认为Default。
● SingleResult:查询返回个结果集。
● SchemaOnly:查询仅返回列信息。当使用SchemaOnly时,用于SQL Server的.NET Framework数据提供程序将在要执行的语句前加上SET FMTONLY ON。
● KeyInfo:此查询返回列和主键信息。
● SingleRow: 查询应返回一行。
● SequentialAccess:提供一种方法,以便DataReader处理包含带有大量二进制值的列的行。SequentialAccess不是加载整行,而是使DataReader将数据作为流来加载。然后可以使用GetBytes或GetChars方法来指定开始读取操作的字节位置以及正在返回的数据的有限的缓冲区大小。
● CloseConnection:在执行该命令时,如果关闭关联的DataReader对象,则关联的Connection对象也将关闭。
(3)ExecuteScalar:返回执行结果集中的第一行第一列,如果没有数据,则返回NULL!
可能返回NULL值,需要对结果进行判断,如下:
object my = cmd.ExecuteScalar();
if (object.Equals(my,null)) //可以使用Equals进行Null值的判断,易读性强
Console.WriteLine("Not Data");
else
Console.WriteLine("Yes");
(4)CreateParameter:创建SqlParameter实例。
5、异步执行命令:执行Command对象命令时,需要等待命令完成才能执行其他操作。比如,执行ExcuteNonQuery()方法,应用程序将会保持阻塞,直到数据操作成功完成或者异常终止以及连接超时。异步执行的根本思想是,在执行命令操作时,无需等待命令操作完成,可以并发的处理其他操作。ADO.NET提供了丰富的方法来处理异步操作,BeginExecuteNonQuery和EndExcuteNonQuery就是一对典型的为异步操作服务的方法。BeginExecuteNonQuery方法返回System.IAsyncResult接口对象。我们可以根据IAsyncResult的IsCompleted属性来轮询(检测)命令是否执行完成。
using System.Data;//必须引入
using System.Data.SqlClient;//必须引入
namespace Command
{
class Program
{
static void Main(string[] args)
{
SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder();
connStr.DataSource = @".\SQLEXPRESS";
connStr.IntegratedSecurity = true;
connStr.InitialCatalog = "db_MyDemo";
connStr.AsynchronousProcessing = true;//必须显示说明异步操作
StringBuilder strSQL = new StringBuilder();
//插入100个测试客户
for (int i = ; i <= ; ++i)
{
strSQL.Append("insert into tb_SelCustomer ");
strSQL.Append("values('");
string name = "测试客户" + i.ToString();
strSQL.Append(name);
strSQL.Append("','0','0','13822223333','liuhaorain@163.com','广东省深圳市宝安区',12.234556,34.222234,'422900','备注信息'); ");
}
using (SqlConnection conn = new SqlConnection(connStr.ConnectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
IAsyncResult pending = cmd.BeginExecuteNonQuery();//开始执行异步操作
double time = ;
//检查异步处理状态
while (pending.IsCompleted == false)
{
System.Threading.Thread.Sleep();
time++;
Console.WriteLine("{0}s", time * 0.001);
}
if (pending.IsCompleted == true)
{
Console.WriteLine("Data is inserted completely...\nTotal coast {0}s", time * 0.001);
}
cmd.EndExecuteNonQuery(pending);//结束异步操作
}
Console.Read();
}
}
}
6、如何获取插入行的ID
using System.Data;
using System.Data.SqlClient;
namespace Command2
{
class Program
{
static void Main(string[] args)
{
//构造连接字符串
SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder();
connStr.DataSource = @".\SQLEXPRESS";
connStr.IntegratedSecurity = true;
connStr.InitialCatalog = "db_MyDemo";
//拼接SQL语句
StringBuilder strSQL = new StringBuilder();
strSQL.Append("insert tb_SelCustomer(Name) ");
strSQL.Append("OUTPUT inserted.ID values(@Name)");
using (SqlConnection conn = new SqlConnection(connStr.ConnectionString))
{
SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn);
SqlParameter para = new SqlParameter("@Name", SqlDbType.VarChar, );
para.Value = "Kemi";
cmd.Parameters.Add(para);
try
{
conn.Open();
int insertedID = (int)cmd.ExecuteScalar();//获取单个值
Console.WriteLine("Inserted ID:{0}", insertedID);
}
catch (Exception ex)
{
Console.WriteLine("{0}", ex.Message);
}
}
Console.Read();
}
}
}
四、SqlParameter(Sql参数)
1、几个重要的属性
ParameterName:设置参数名
Value:给参数设置值
Size:设置参数字节最大大小
SqlDbType:参数在SQL中的类型
2、命令对象添加参数集合的几种方法
(1)AddWithValue
(2)Add
(3)AddRange
using (SqlConnection connection = new SqlConnection(""))
{
SqlCommand command = connection.CreateCommand();
command.CommandText = ""; //可以使用这种方式添加多个参数,不过方式不够好
command.Parameters.Add("@name", SqlDbType.NVarChar).Value = "yang"; //第一种方式
command.Parameters.Add("@age", SqlDbType.Int).Value = ;
command.Parameters.Add("@address", SqlDbType.NVarChar, ).Value = "Jiang Su"; //这种方式直接给定参数名和参数就可以了,可操作性比较差
command.Parameters.AddWithValue("@name", "yang");
command.Parameters.AddWithValue("@age", ).SqlDbType = SqlDbType.Int;
command.Parameters.AddWithValue("@address", "Jiang su").SqlDbType = SqlDbType.NVarChar; //直接使用参数集合添加你需要的参数,推荐这种写法
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@name",SqlDbType.NVarChar,){Value = "yang"},
new SqlParameter("@age",SqlDbType.Int,){Value = },
new SqlParameter("@address",SqlDbType.NVarChar,){Value = "Jiang Su"},
};
command.Parameters.AddRange(parameters); //参数也可以是一个Array数组,如果采用数组参数代码的可读性和扩展性就不是那么好了 //当我们把参数都添加好之后,会生成一个“SqlParameterCollection”集合类型,相当于参数的集合
//那么我们就可以对这些参数进行修改和移除了
//说穿了“SqlParameterCollection”内部其实是一个List<SqlParameter>的集合,只是它里面的复杂度比较高,考虑的很全面
command.Parameters[].Value = "hot girl";
command.Parameters[].Size = ;
}
五、SqlDataReader(数据流读取器)
1、基本用法
using (SqlConnection conn = new SqlConnection(""))
{
conn.Open();
SqlCommand command = conn.CreateCommand();
command.CommandText = "";
using (SqlDataReader dr = command.ExecuteReader(CommandBehavior.CloseConnection))
{
while (dr.Read())
{
//开始读取数据了,接下来你想怎么样就怎么样了
string str = dr.GetSqlString().ToString();
}
} }
2、常用方法
(1)GetOrdinal:获取指定列名的列序号(索引号),使用这个方法可以把经常变动的列进行固定
int name=dr.GetOrdinal("name"); //通过列名来获取当前列的索引号
(2)GetName: 获取列名,参数为指定列名的序列号,返回string
string columnName=dr.GetName(name);//通过列名所处的索引号来获取列名名称
(3)IsDBNull:判断当前读取的数据是否为Null,返回类型为Bool
dr.IsDBNull(coContractID)?"NULL":dr.GetInt32(coContractID).ToString();
(4)NextResult:当查询为批处理查询时,使用这个方法去读取下一个结果集,返回值为Bool,如果存在多个结果集,则为 true;否则为 false。
(5)Read:读取数据
3、常用属性
(1)HasRow:判断是否包含一行或多行,也就是判断有没有数据,返回类型为Bool。
(2)FieldCount:获取读取的列数,返回类型为Int。
(3)IsClosed:判断读取的数据流是否关闭。
4、性能剖析
读取数据的时候会有很多种写法,如dr[0].ToString(),dr["Name"].ToString(),dr.GetString(0),dr.GetSqlString(0)等等的读取方式的写法。
读取数据性能总结:
SqlDataReader读取方法
(1)DataReader 索引+基于[序列号]->dr[0].ToString() |Index-based access
(2)DataReader 索引+基于[列名]->dr["Name"].ToString() |性能最差
(3)GetString 开头的+基于[序列号]->dr.GetString(0) |type-access
(4)GetSql 开头的+基于[序列号]->dr.GetSqlString(0) |Provider-specific typed accessor
(5)GetOrdinal() 通过列名获取这个列的序列号 |这个方法在提高性能上面有作用
性能(4)-->(3)-->(1)-->(2)
5、补充
SqlDataReader是连接相关的,SqlDataReader中的查询结果并不是放在程序中,而是放在数据库服务器中,SqlDataReader只是相当于一个指针(游标),只能读取当前游标指向的行,连接断开就不能再读取。这样无论查询结果有多少条,对程序占用的内存都几乎没有影响。但SqlDataReader对于小数据量的数据来说带来的只有麻烦。
六、SqlTransaction(事务)
1、事务中的命名存储点
一旦你定义了命名存储点,只能回滚命名存储点之后的操作,这是要看情况而使用!
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "";
cmd.Transaction = transaction;
//使用命名存储点
transaction.Save("this is point"); //定义命名存储点,使用Save方法先保存存储点,定义回滚数据的开始位置
//这边是你要回滚的操作代码,TO DO...
//把从命名存储点到这里的操作进行回滚
transaction.Rollback("this is point"); //回滚命名存储点 }
2、SQL语句中的事务
BEGIN TRANSACTION
--你需要执行的更新,删除,插入的语句
IF(@@ERROR > 0) //这是系统变量,存储你在执行更新,删除,插入操作时发生错误的记录编号
ROLLBACK
ELSE
COMMIT
3、TransactionScope
using (TransactionScope transactionScope = new TransactionScope())
{
try
{
using (SqlConnection connection = new SqlConnection())
{
// TO DO
//提交事务,如果有异常,他会自动回滚的
transactionScope.Complete();
}
}
catch (Exception)
{
//捕获异常
throw;
} }
七、SqlDataAdapter(数据适配器)
1、构造函数
四个重载:
(1)无参
(2)SqlDataAdapter(SqlCommand) 执行命令对象实例
(3)SqlDataAdapter(String,SqlConnection) 只能指定查询语句,连接对象实例
(4)SqlDataAdapter(String,ConnectionString)
2、填充数据(Fill)
using (SqlConnection conn = new SqlConnection(""))
{
conn.Open();
SqlCommand command = conn.CreateCommand();
command.CommandText = "select name,age,address from MyInformation";
SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
dataAdapter.Fill(dataSet); //填充数据
}
3、使用“SqlCommandBuilder”对数据进行增删改查
(1)添加数据
using (SqlConnection conn = new SqlConnection(ConnectionString()))
{
conn.Open();
//构建查询语句,也可以指定SqlCommand,其中变换的方法有很多
SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName from dbo.Employees", conn);
DataSet ds = new DataSet();
da.Fill(ds);
//这句话很重要,它会把你在DataSet增加的数据转化为SQL语句用来更新数据库
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
//添加行,实例化一个行对象,注意是用NewRow来创建行
DataRow row = ds.Tables[].NewRow();
row[] = "Yang";
row[] = "鬼头";
ds.Tables[].Rows.Add(row); //添加到表中
da.Update(ds); //把DataSet中表和数据库进行对比,更新 }
(2)修改数据
using (SqlConnection conn = new SqlConnection(""))
{
SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
DataSet ds = new DataSet();
da.Fill(ds);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
ds.Tables[].Rows[][] = ""; //修改数据
da.Update(ds);
//调用Update方法其中隐式的调用了AcceptChanges方法,更新数据集中的数据
//如果你继续使用这个数据集而没有调用这个方法,在后面的使用会出现异常
ds.AcceptChanges(); //这句话可以不写的 }
(3)删除数据
using (SqlConnection conn = new SqlConnection(""))
{
SqlDataAdapter da = new SqlDataAdapter("SQL语句或你自己定义的命令对象", conn);
DataSet ds = new DataSet();
da.Fill(ds);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
//删除数据
ds.Tables[].Rows[].Delete();
da.Update(ds); //这边会隐式调用DataTable的AcceptChanges方法
}
4、关于“SqlDataAdapter”中Fill方法
ds.Fill(ds,5,10,"MyTable");
八、DataSet、DataTable、DataRow、DataColumn
表示数据存放在缓存中,DataSet里面可以包含多个DataTable,DataTable中有多个DataColumn和多个DataRow,包括对各种对DataTable的操作,以及对列和行的操作,在进行DataSet,DataTable进行操作的时候,应该先判断它们是否为Null。
非本人原创:http://www.cnblogs.com/sydeveloper/archive/2013/03/06/2909739.html
ADO.NET 总结的更多相关文章
- ADO.NET对象的详解
1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...
- WebForm获取GET或者POST参数到实体的转换,ADO.NET数据集自动转换实体
最近在修改维护以前的webform项目(维护别人开发的.....)整个aspx没有用到任何的控件,这个我也比较喜欢不用控件所以在提交信息的时候需要自己手动的去Request.QueryString[] ...
- ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...
- ADO.NET一小记-select top 参数问题
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 最近使用ADO.NET的时候,发现select top @count xxxx 不 ...
- .NET基础拾遗(6)ADO.NET与数据库开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- 升讯威ADO.NET增强组件(源码):送给喜欢原生ADO.NET的你
目前我们所接触到的许多项目开发,大多数都应用了 ORM 技术来实现与数据库的交互,ORM 虽然有诸多好处,但是在实际工作中,特别是在大型项目开发中,容易发现 ORM 存在一些缺点,在复杂场景下,反而容 ...
- ADO.NET Entity Framework 在哪些场景下使用?
在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...
- ADO.NET 核心对象简介
ADO.NET是.NET中一组用于和数据源进行交互的面向对象类库,提供了数据访问的高层接口. ADO.NOT类库在System.Data命名空间内,根据我们访问的不同数据库选择命名空间,System. ...
- ODBC、OLE DB、 ADO的区别
转自:http://blog.csdn.net/yinjingjing198808/article/details/7665577 一.ODBC ODBC的由来 1992年Microsoft和Syba ...
- LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
它基于由 ADO.NET 提供程序模型提供的服务.因此,我们可以将 LINQ to SQL 代码与现有的 ADO.Net 应用程序混合在一起,将当前 ADO.NET 解决方案迁移到 LINQ to S ...
随机推荐
- pure学习笔记
最近研究Pure,发现这个对于写css来说确实是个好的框架,特此总结了一番,如有错误或不足的地方,欢迎交流指点,轻拍. 此文运用的是优雅的Markdown而书 Pure学习笔记 #写在最前 1# Pu ...
- hdu 3333 Turing Tree
题目链接 给n个数, m个询问, 每次询问输出区间内的数的和, 相同的数只计算一次. 数组里的数是>-1e9 <1e9, 可以把它离散以后用莫队搞... #include <iost ...
- bootstrap读书笔记
引入bootstrap.js或单个插件的js文件 若引入单个插件的js文件,注意插件之间的依赖关系 data属性api data属性的api很方便,但我们也可以选择关闭这个功能:$(document) ...
- BZOJ 1089 严格n元树 (递推+高精度)
题解:用a[i]表<=i时有几种树满足度数要求,那么这样就可以递归了,a[i]=a[i-1]^n+1.n个节点每个有a[i-1]种情况,那么将其相乘,最后加上1,因为深度为0也算一种.那么答案就 ...
- struts之拦截器
拦截器是为了让一些自己不希望发生的事情进行预防.以下我说一下struts自己定义拦截器. 以下我贴下struts.xml里的自定义的拦截器: <package name="my&quo ...
- 【iOS知识学习】_UITableView简介
UITableView在iOS中估计是用的最多的控件了吧,几乎每个app都会用到. 一.它是一个非常重要的类来在table中展示数据. 1.是一个一维的表: 2.是UIScrollView的一个子类: ...
- [译]Stairway to Integration Services Level 6 - SSIS 工作流管理基础
简介 在之前的章节中,我们学习了增量载入数据. 本文中.我们通过优先约束(Precedence Constraints)来管理SSIS的工作流. 添加一个SSIS包 图 1 将新建的Package1. ...
- ios7以上自定义导航栏标题的字体大小及颜色的方法
自定义导航栏的字体和颜色,只需要自定义一个lable,然后将lable添加到导航栏的titleview中就可以了 代码如下 UILabel *label = [[UILabel alloc] init ...
- ibatis缓存配置
一.sqlmapconfig.xml <sqlMapConfig> <settings useStatementNamespaces="true" cacheM ...
- 模仿jquery的一些实现
wylUtil.js //w作为window的形参,就表示window (function(w) { // 定义一个全局的window.wyl变量,就类似于jquery里的$,Jquery对象 w.w ...