10.3.170.127
1.ADO.NET有俩个特别重要的核心:DataSet和Data Provider
2.Connection对象、Command对象、DataReader对象以及DataAdapter 是四大核心骨架
3.Parameter对象定义了命令和存储过程的输入、输出和返回值参数。
4.sql注入
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
userName = "' OR '1'='1";
与
passWord = "' OR '1'='1";
然后就有
strSQL = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (pw = '' OR '1'='1');"
5.现在我们用Parameter对象来改写简单的登陆验证代码:
复制代码
1 strSQL = "SELECT * FROM users WHERE Name = @Name and Password = @Password";
2 SqlParamter[] paras = new SqlParamter[]{//参数数组
3 new SqlParamter("@Name",SqlDBType.Varchar,50)
4 new SqlParamter("@Password",SqlDBType.Varchar,50)};
5 paras[0].value = userName;//绑定用户名
6 paras[1].value = password;//绑定用户密码
复制代码
6.
ConnectionStringBuilder:它提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法。
所有 ConnectionStringBuilder 对象的基类均为 DbConnectionStringBuilder 类。
CommandBuilder :它自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息,并填充 Command 对象的 Parameters 集合。
所有 CommandBuilder 对象的基类均为 DbCommandBuilder 类。
7.几种典型的字符串连接
(1)SQL SEVER的字符串连接
Data Source=myServerAddress;Initial Catalog=myDataBase; User Id=myUsername;Passwword=myPassword;
Data Source:需要连接的服务器。需要注意的是,如果使用的时Express版本的SQL Server需要在服务器名后加\SQLEXPRESS。例如,连接本地的SQL Server 2008 Express版本的数据库服务器,可以写成Data Source = (local)\SQLEXPRESS或者.\SQLEXPRESS。
Initial Catalog:默认使用的数据库名称。
User ID:数据库服务器账号。
Password:数据库服务器密码。
或者额可以写成:
Server = myServerAddress;Database = myDataBase; User ID=myUsername;Password=myPassword;Trusted_Connection=False;
(2)可信连接
Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=SSPI;
说明:
Data Source:与上述相同。
Initial Catalog:与上述相同。
Integrate Security:使用存在的windows安全证书访问数据库。
或者是:Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;
(3) Access连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;User Id=admin;Password=;
(4) MySQL连接字符串
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
(5) DB2连接字符串
Server=myAddress:myPortNumber;Database=myDataBase;UID=myUsername;PWD=myPassword;
(6) Oracle连接字符串
Data Source=TORCL;User Id=myUsername;Password=myPassword;
8.在配置文件中存储连接字符串
我们只需要在程序中添加相应代码来获取配置文件中的值:
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
9.Connection对象
(1) 必须掌握的几个方法
Open: 使用 ConnectionString 所指定的设置打开数据库连接。
Dispose: 释放由 Component 使用的所有资源。
Close: 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
(2) 必须掌握的几个属性
Database: 在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符串中指定的数据库名。
DataSource: 获取要连接的数据库服务器的名称。
ConnectionTimeOut: 获取在建立连接时终止尝试并生成错误之前所等待的时间。
ConnectionString: 获取或设置用于打开连接的字符串。
State: 获取描述连接状态的字符串。
(3) 说说ConnectionState
上面我们知道,State属性描述了与数据源的连接的当前状态。ConnectionState是一个枚举类型。它包括以下成员:
Closed: 连接处于关闭状态。
Open: 连接处于打开状态。
Connecting: 连接对象正在与数据源连接。
Executing: 连接对象正在执行命令。
Fetching: 连接对象正在检索数据。
Broken: 与数据源的连接中断。
数据库连接池
接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记
连接池的行为可以通过连接字符串来控制,主要包括四个重要的属性:
Connection Timeout:连接请求等待超时时间。默认为15秒,单位为秒。
Max Pool Size: 连接池中最大连接数。默认为100。
Min Pool Size: 连接池中最小连接数。默认为0。
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。
eg:SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder();
connStr.DataSource = @".\SQLEXPRESS";
connStr.InitialCatalog = "master";
connStr.IntegratedSecurity = true;
connStr.Pooling = true; //开启连接池
connStr.MinPoolSize = 0; //设置最小连接数为0
connStr.MaxPoolSize = 50; //设置最大连接数为50
connStr.ConnectTimeout = 10; //设置超时时间为10秒
using( SqlConnection conn = new SqlConnection(connStr.ConnectionString))
{
;//todo
}
Command对象与数据检索
Command对象:它封装了所有对外部数据源的操作(包括增、删、查、改等SQL语句与存储过程),并在执行完成后返回合适的结果。
必须掌握的几个属性
CommandText: 获取或设置对数据源执行的文本命令。默认值为空字符串。
CommandType: 命令类型,指示或指定如何解释CommandText属性。CommandType属性的值是一个枚举类型,定义结构如下:
public enum CommandType
{ Text = 1, //SQL 文本命令。(默认。)
StoredProcedure = 4, // 存储过程的名称。
TableDirect = 512 //表的名称。
}
需要特别注意的是,将CommandType 设置为 StoredProcedure 时,应将 CommandText 属性设置为存储过程的名称。 当调用 Execute 方法之一时,该命令将执行此存储过程。
Connection: 设置或获取与数据源的连接。
Parameters: 绑定SQL语句或存储过程的参数。参数化查询中不可或缺的对象,非常重要。
Tranction: 获取或设置在其中执行 .NET Framework 数据提供程序的 Command 对象的事务。
4. 必须掌握的几个方法
ExecuteNonQuery: 执行不返回数据行的操作,并返回一个int类型的数据。
注意:对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。 对于其他所有类型的语句,返回值 为 -1。
ExecuteReader: 执行查询,并返回一个 DataReader 对象。
ExecuteScalar: 执行查询,并返回查询结果集中第一行的第一列(object类型)。如果找不到结果集中第一行的第一列,则返回 null 引用。
5.如何创建Command对象
(1)通过构造函数
string strSQL = "Select * from tb_SelCustomer";
SqlCommand cmd = new SqlCommand(strSQL,conn);
或者
(2)通过Command对象的属性
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = strSQL;
例子:
namespace Command
{
class Program
{
static void Main(string[] args)
{
string connSQL = @"Data Source=.\SQLEXPRESS; Initial Catalog=db_MyDemo; Integrated Security=SSPI";//构造连接字符串
SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL);
using(SqlConnection conn = new SqlConnection(connStr.ConnectionString))
{
//拼接SQL语句
StringBuilder strSQL = new StringBuilder();
strSQL.Append("insert into tb_SelCustomer ");
strSQL.Append("values(");
strSQL.Append("'liuhao','0','0','13822223333','[email protected]','广东省深圳市宝安区',12.234556,34.222234,'422900','备注信息')");
Console.WriteLine("Output SQL:\n{0}",strSQL.ToString());
//创建Command对象
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strSQL.ToString();
try
{
conn.Open();//一定要注意打开连接
int rows = cmd.ExecuteNonQuery();//执行命令
Console.WriteLine("\nResult: {0}行受影响",rows);
}
catch(Exception ex)
{
Console.WriteLine("\nError:\n{0}", ex.Message);
}
}
Console.Read();
}
}
}