Ado.Net概述
protected
void
Page_Load(
object
sender, EventArgs e)
{
string con = ConfigurationManager.ConnectionStrings["mydbconn"].ToString();
SqlConnection conn = new SqlConnection(con);
conn.Open();
SqlCommand cmd = new SqlCommand("select 学号,姓名,地址 from test", conn);
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (dr.HasRows)
{
while (dr.Read())
{
ListItem li = new ListItem(dr.GetString(1), dr.GetString(0));
DropDownList1.Items.Add(li);
}
dr.Close();
}
}
1、dr.GetString(1), dr.GetString(0) 获取指定列的字符串的形式dr.GetString(1)=text,dr.GetString(0)=value
SQL语句
1、查询语句
select a,b,c from table_name where a='thc' or b<40 and c<>50 or a like '%XXX%' order by b desc
2、更新语句
update
table_name
set
(b
=
100
,c
=
'
thc
'
)
where
a
=
'
asp.net
'
Ps:1、不能更新主键
2、如果没有制定where语句,那么将更新所有行的数据
3、如果插入非数列指定的类型,将不会执行命令并返回错误,如将文字插入到int类型列中
4、插入到nvarchar数据类型的列中的数据将被删除所有尾随空格
3、添加新记录
insert
into
table_name(a,b,c)
values
(
'
吴有鋆
'
,
100
,
'
www.tiger9.com
'
)
insert
into
table_name
values
(
'
吴有鋆
'
,
100
,
'
www.tiger9.com
'
)
Ps:1、如果要替换现有的数据,必须先删除或者改掉
2、每个列名在字符串中只能出现一次
3、如果省略列名,则默认从按照列的序号升序依次填充数据
4、如果列名提供了三个,而值提供了四个,那么除非该列有默认值或者具有自动增量,否则会出错,如果列允许空值,那不提交数据也没关系
5、如果列列表和值列表不对应,显示指定列和值的对应关系
4、删除记录
delect
from
table_name
where
a
=
"吴有鋆"
Ps:1、如果没有指定条件,将删除所有的行
2、如果指定了条件,那么所有符合条件的行都将被删除
3、如果目标数据行任意一行违反了FOREIGN KEY约束,删除失败
5、联合查询
内部联接:内部联接包括同等联接和自然联接
外部联接:外部联接可以是左向外部联接、右向外部联接或完全外部联接
在From子句中可以用下列某一组关键字来指定外部联接:
LEFT JOIN 或 LEFT OUTER JOIN(左联接)
左边有数据右边没有的,右边用空格代替,右边有数据的,左边没有,直接不显示
RIHGT JOIN 或 RIGHT OUTER JOIN(右联接)、
右边有数据左边没有的,左边用空格代替,左边有数据的,右边没有,直接不显示
FULL JOIN 或 FULL OURER JOIN(完全外部联接)
左边有数据右边没有的,右边用空格代替,右边有数据左边没有的,左边用空格代替
ObjectDataScors对象
注意事项 1、Updata时参数名必须与查询数据的参数名,数据库字段名相同
2、Delete时数据控件必须设置主键
3、Updata防止用户输入',出错
sqlcmd.CommandText
=
"
update
Scontact
set
[
Name
]
=
@Name
,
[
Address
]
=
'
" + Address + "
'
where
[
ID
]
=
'
" + ID + "
'
";
sqlcmd.Parameters.AddWithValue("
@Name
", Name);
//用@Name替代字符串,使用sqlcmd.Parameters.AddWithValue将两者建立连接
Cammand重点加固
属性方面的
1、CommandText
注释:指定该属性将使用的SQL查询语句或者存储过程名称(字符串类型)
2、CommandType
注释:指定解释CommandText属性的值,默认为Text(枚举类型)
3、Connetion
注释:指定Command的此使用的Connection
4、Parameters
注释:获取与Command有关的所有参数以及它们各自到DataSet列的映射
方法方面的
5、Cancel
注释:试图取消Command的执行
6、Dispose
注释:释放由Component占用的资源
7、ExecuteNonQuery
注释:执行命令并且返回受影响的行数(返回int类型)
8、ExecuteReader
注释:返回一个只读且只进的这么一个数据流,每次只返回一条数据(返回对象类型)
9、ExecuteScalar
注释:执行查询,并返回查询所返回的结果集中第一行的第一列,忽略其他列或行
动态新建内存表(DataSet)
DataSet ds
=
new
DataSet(
"
one
"
);
DataTable Udt
=
new
DataTable(
"
user
"
); //user表名
DataTable Bdt
=
new
DataTable(
"
book
"
); //book表名
ds.Tables.Add(Udt); //添加到表
ds.Tables.Add(Bdt);
Udt.Columns.Add(
"
dc_id
"
,
typeof
(Int32));
Udt.Columns.Add(
"
name
"
,
typeof
(
string
));
Udt.Columns.Add(
"
age
"
,
typeof
(Int32));
Bdt.Columns.Add(
"
title
"
,
typeof
(
string
));
Bdt.Columns.Add(
"
url
"
,
typeof
(
string
));
Bdt.Columns.Add(
"
dc_id
"
,
typeof
(Int32));
object
[] udt_d
=
new
object
[
3
]; //实例化对象数组
object
[] bdt_d
=
new
object
[
3
];
udt_d[
0
]
=
1
;
udt_d[
1
]
=
"
吴有鋆
"
;
udt_d[
2
]
=
28
;
bdt_d[
0
]
=
"
钢铁是怎样练成的
"
;
bdt_d[
1
]
=
"
www.qq.com
"
;
bdt_d[
2
]
=
1
;
Udt.Rows.Add(udt_d); //将数据添加到表行
Bdt.Rows.Add(bdt_d);
定义表的主键
UniqueConstraint uc
=
new
UniqueConstraint(
"
uthc
"
, ds.Tables[
"
user
"
].Columns[
"
dc_id
"
],true);
ds.Tables[
"
user
"
].Constraints.Add(uc);
PS: 1、UniqueConstraint 主键
2、"uthc" 约束的名称
3、ds.Tables["user"].Columns["dc_id"] 约束的列
4、True 表示约束为主键,如果无true,约束的列的数据不能重复,但不约束为主键
5、Constraints 该表约束的集合
定义表的外键(外键约束)
ForeignKeyConstraint fkc
=
new
ForeignKeyConstraint(
"
fthc
"
,ds.Tables["user"].Columns["dc_id"],ds.Tables["book"].Columns["dc_id"]
);
ds.Tables[
"
book
"
].Constraints.Add(fkc);
PS: 1、ForeignKeyConstraint 外键
2、"fthc" 外键约束名
3、ds.Tables["user"].Columns["dc_id"] 约束中的父级
4、ds.Tables["book"].Columns["dc_id"] 约束中的子级
5、ds.Tables["book"].Constraints.Add(fkc) 外键约束添加到子级
ds.Relations.Add(
"
fck_au
"
, ds.Tables[
"
ta
"
].Columns[
"
id
"
], ds.Tables[
"
tb
"
].Columns[
"
id
"
]);
PS:1、外键约束的另一种方式
2、Relations 链接起来父表与子表关系的集合
外键约束删除数据
DataSet ds
=
(DataSet)Session[
"
ds
"
];
string
key
=
GridView1.DataKeys[e.RowIndex].Value.ToString();
DataRow dr
=
ds.Tables[
"
ta
"
].Rows.Find(key);
ds.Tables[
"
ta
"
].Rows.Remove(dr); //移除数据行
PS: 1、DataKeys[e.RowIndex].Value e.RowIndex行的主键的值
2、ds.Tables["ta"].Rows.Find(key) Find获取由主键值指定的行
合并数据(DataSet)
ds.Tables[
"
t1
"
].Merge(ds.Tables[
"
t2
"
]);
GridView1.DataSource
=
ds.Tables[
"
t1
"
];
GridView1.DataBind();
PS: 1、Merge 合并数据表
2、两个表的列名相同(区分大小写)只保留一个(ID,ID true)(ID,id false)
将数据表写入缓存提高系统性能
cds.ExtendedProperties.Add(
"
ad_t1
"
, DateTime.Now.ToLongTimeString());
Cache.Insert(
"
ds_cache
"
, cds,
null
, DateTime.Now.AddMinutes(
2
), TimeSpan.Zero);
PS: 1、"ds_cache" 缓存名称
2、cds 插入缓存的对象名称
3、null 对象依赖于某个项,不依赖为null,如果依赖于某个项,依赖项更改时,该对象即无效,并移除缓存
4、DateTime.Now.AddMinutes(2) 添加缓存过期时间
5、TimeSpan.Zero 间隔时间(最后一次访问后,多久自动移除缓存)
移除缓存
Cache.Remove(
"
ds_cache
"
);
存储过程
public
DataTable Tdt()
{
Tsda.SelectCommand = new SqlCommand("Myselect", Tconn);
Tsda.SelectCommand.CommandType = CommandType.StoredProcedure;
Tsda.Fill(Tds, "Student");
return Tds.Tables["Student"];
}
PS: Tsda.SelectCommand = new SqlCommand("Myselect", Tconn); //Myselect存储过程名称
Tsda.SelectCommand.CommandType = CommandType.StoredProcedure; //Command类型为存储过程
PS: Tcmd.Parameters.AddWithValue("@id",ID); //Tcmd存储过程的Parameter(参数)添加对应的值或对象
public
void
Update(
string
ID,
string
Name,
string
Phone)
{
Tcmd.CommandText = "MyUpdate";
Tcmd.CommandType = CommandType.StoredProcedure;
Tcmd.Parameters.AddWithValue("@id",ID);
Tcmd.Parameters.AddWithValue("@name", Name);
Tcmd.Parameters.AddWithValue("@phone", Phone);
Tcmd.Parameters.AddWithValue("@Original_id",ID);
Tcmd.Connection = Tconn;
}
ALTER PROCEDURE dbo.MyUpdate
(
@ID nvarchar(
10
),
@Name nvarchar(
4
),
@phone
float
,
@Original_ID nvarchar(
10
)
)
AS
SET NOCOUNT OFF;
UPDATE [Scontact] SET [ID]
=
@ID, [Name]
=
@Name, [phone]
=
@phone WHERE (([ID]
=
@Original_ID));
SELECT ID, Name, phone FROM Scontact WHERE (ID
=
@ID)
可移植数据访问程序
Web.config添加一段配置节
<
appSettings
>
<
add key
=
"
dbType
"
value
=
"
SqlServer
"
/>
<!--
这里可选值必须是SqlServer或者Access在或者Oracle
-->
</
appSettings
>
调用获取其值
ConfigurationSettings.AppSettings[
"
dbType
"
]
数据库连接
SQL Server
<
add name
=
"
mydbconn
"
connectionString
=
"
Data Source=.;Initial Catalog=mydb;Persist Security Info=True;User ID=sa;Password=123
"
providerName
=
"
System.Data.SqlClient
"
/>
<add name="数据库连接名称" connectionString="Data Source=数据源;Initial Catalog=数据库名称 Persist Security Info(持续性安全信息)=true;User ID=用户名;Password=密码" providerName(数据提供程序名称)="命名空间" />
Access
<
add name
=
"
mystudent
"
connectionString
=
"
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\Projects\THC ADO\Student.mdb
"
providerName
=
"
System.Data.OleDb
"
/>
<add name="数据库连接名称" connectionString="Provider=数据提供程序;Data Source=数据库文件" providerName(数据提供程序名称)="命名空间" />
Enum.Parse 方法 (Type, String)
1:将字符串型转化为(Enum)枚举类型。
例如:现在有个字符串sString,一个枚举EnumName,希望把String类型转换成EnumName类型格式如下:
(EnumName)EnumName.Parse(
typeof
(EnumName),String)
实例:
public
enum
Week
{
星期一,星期二,星期三
}
protected
void
Page_Load(
object
sender, EventArgs e)
{
Response.Write((Week)Enum.Parse(
typeof
(Week),
"
2
"
));
//
运行结果为"星期三" Week枚举数据类型
lblMeg.Text
=
((Week)Enum.Parse(
typeof
(Week),
"
星期二
"
)).ToString();
//
运行结果为"星期二" Week枚举数据类型转换为字符串
}
IDbConnection,IDbCommand,IDbDataAdapter
1、IDbconnection 可以存储多种数据提供程序的Connection
2、IDbCommand 可以存储多种数据提供程序的Command
3、IDbDataAdapter 可以存储多种数据提供程序的DataAdapter