ADO連接數(shù)據(jù)庫
1)獲取連接字符串
方式一: 記住連接字符串
connectionString=" Integrated Security=True; server=. ; database=DBName"
方式二:在visual studio中,點(diǎn)擊”視圖”à服務(wù)資源管理器à右擊左側(cè)的”數(shù)據(jù)連接”,選擇”添加連接”à服務(wù)名: 為一個(gè)點(diǎn).選擇數(shù)據(jù)庫名,然后點(diǎn)擊”高級(jí)”,然后復(fù)制底部的連接字符串
2)在web.config中配置連接字符串
復(fù)制代碼 代碼如下:
connectionStrings>
addname="SQLconnectionStr"connectionString="Data Source=.;Initial Catalog=NetShopDB;Integrated Security=True"providerName="System.Data.SqlClient"/>
/connectionStrings>
3)在DAL層新建SqlConnection類,包含靜態(tài)方法:
記得先添加Configuration引用和 using System.Configuration;命名空間
復(fù)制代碼 代碼如下:
public static string getConnectionStr()
{
return ConfigurationManager.ConnectionStrings["SQLconnectionStr"].ToString();
}
4)在DAL層其他類中調(diào)用getConnectionStr()靜態(tài)方法
復(fù)制代碼 代碼如下:
string conStr= SqlConnection.getConnectionStr();
DAL層執(zhí)行SQL語句的方法
ADO操作SQL語句:方式一
復(fù)制代碼 代碼如下:
public Liststudent> getData1(string myid, string myname)
{
//這里用using靈活方便,用完con不需手動(dòng)關(guān)閉,會(huì)自動(dòng)關(guān)閉當(dāng)前連接
using(SqlConnection con=new SqlConnection(conStr) )
{
//打開連接
con.Open();
string cmdStr = "select * from ns_user where userID=@myid and userName=@myname";
SqlCommand cmd = new SqlCommand(cmdStr,con);
//這里用參數(shù)序列化防止注入式攻擊
cmd.Parameters.Add(new SqlParameter("@myid", myid));
cmd.Parameters.Add(new SqlParameter("@myname", myname));
//執(zhí)行查詢,并返回查詢所返回的結(jié)果集中第一行的第一列。忽略其他列或行
//object myResult = cmd.ExecuteScalar();
// 對(duì)連接執(zhí)行 Transact-SQL 語句并返回受影響的行數(shù)。(負(fù)責(zé)執(zhí)行語句, 例如增insert,刪delete,改update)
//int ResultRowCount = cmd.ExecuteNonQuery();
SqlDataReader sdr = cmd.ExecuteReader();
Liststudent> ls = new Liststudent>();
while (sdr.Read())
{
student s = new student();
s.Sid = sdr["sid"].ToString();
s.Sname = sdr["sname"].ToString();
ls.Add(s);
}
return ls;
}
}
Dataset(記得)
#region 獲取教師的詳細(xì)信息
public DataSet GetTeacherInfo()
{
using (SqlConnection conn = new SqlConnection(dbapp))
{
SqlDataAdapter sda = new SqlDataAdapter("select * from table1 ", conn);
DataSet ds = new DataSet(); //定義一個(gè)表的集合
sda.Fill(ds, "teacher");
return ds;
}
}
#endregion
ADO操作存儲(chǔ)過程:
復(fù)制代碼 代碼如下:
#region
public int UserCheck(string userID,string userName)
{
using(SqlConnection con=new SqlConnection (conStr))
{
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "sp_MYLogin"; //sp_MYLogin是存儲(chǔ)過程名稱
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
//為存儲(chǔ)過程賦值
//賦值方式一(賦第一個(gè)值括號(hào)里面的 "@name"必須和存儲(chǔ)過程里的"@name"一模一樣)
cmd.Parameters.Add(new SqlParameter("@userID", userID));
//賦值方式二(賦第二個(gè)值)
SqlParameter pwd = new SqlParameter("@pwd", SqlDbType.NVarChar, 50);
pwd.Value = userName;
pwd.Direction = ParameterDirection.Input;
cmd.Parameters.Add(pwd);
//定義一個(gè)變量來接受存儲(chǔ)過程的返回值
SqlParameter result = new SqlParameter("@return", SqlDbType.Int);
result.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(result);
cmd.ExecuteNonQuery(); //執(zhí)行存儲(chǔ)過程
//取得SQL變量@result中存放的存儲(chǔ)過程的返回值
int num = Convert.ToInt32(cmd.Parameters["@return"].Value); //Parameters是一個(gè)集合["@return"]就是他的索引
return num;
}
}
#endregion
錯(cuò)誤日志
復(fù)制代碼 代碼如下:
catch (Exception ex)
{ //錯(cuò)誤日志
error.ErrorWrite("UserInsert", ex.Message, DateTime.Now.ToString());
return null;
}
數(shù)據(jù)庫技術(shù)
建修庫表
建庫語句
復(fù)制代碼 代碼如下:
create database student --創(chuàng)建的數(shù)據(jù)庫名稱
on primary ---指定數(shù)據(jù)文件的各個(gè)參數(shù)
(
name='studnet3_data', --所有的字符串都以' 間隔
filename='E:\lx\student4_data.mdf', --文件名包含路徑和名字.擴(kuò)展名
size=3MB, ----默認(rèn)大小,如果不寫大小,則默認(rèn)是MB
maxsize=100MB, ----最大容量
filegrowth=1MB ---自動(dòng)增長量/擴(kuò)容,如果為,則不自動(dòng)擴(kuò)容
)
log on -----日志文件的各個(gè)參數(shù)
(
name='student5_log',
filename='E:\lx\student4_data.ldf',
size=1MB,
maxsize=10MB,
filegrowth=10% --10%是最大容量的%)
)
sp_helpdb student ---查詢數(shù)據(jù)庫名稱
sp_renamedb student,stu --重命名數(shù)據(jù)庫
drop database student --刪除數(shù)據(jù)庫
建表語句
復(fù)制代碼 代碼如下:
drop table person --刪除表
create table person --創(chuàng)建表
(
---注意:下面是屬性(字段名稱)在前,數(shù)據(jù)類型在后
ID int primary key identity(2,1) not null, -- primary key是設(shè)置主鍵,保證該列值唯一且不為空,identity(2,1)起始值是,步長為
Name nvarchar(10) not null, ---not null是指不能為空
Sex bit not null, --bit是bool類型
age int default 18 , -- default 18是指自動(dòng)取默認(rèn)值
scroe decimal(4,1) check(score=100) --4指小數(shù)點(diǎn)前后加起來總共位,代表小數(shù)點(diǎn)后位數(shù) check是檢查限制約束
cardid int unique --unique 指唯一鍵,在表中有多列數(shù)據(jù)需要保證唯一時(shí)除了主鍵以外的列需要設(shè)置為唯一列
)
對(duì)表的操作
修改表結(jié)構(gòu),添加刪除約束
alter table person --修改表結(jié)構(gòu)
--add NameID int --添加屬性\字段NameID列,添加列
--drop column NameID --刪除列
--alter column ID int not null ---添加字段不為空
--add constraint 約束名(pk_表名_列名| pk_列名)
--add constraint pk_ID primary key(ID) --修改表時(shí)添加主鍵約束
--add constraint ck_score check(score150) --修改表時(shí)添加檢查約束
--add constraint uk_cardi unique(cardid) --修改表時(shí)添加唯一鍵約束
--add constraint df_age default 19 for age --修改表時(shí)添加默認(rèn)約束
--drop constraint CK__person__score__15502E78 --刪除約束(格式:drop constraint 約束名)
修改表信息,增(insert) 刪(delete) 改(update) 查(select)
--添加記錄insert 表名values(參數(shù))> 1>字符串或日期類型加'' 2>bit用或 2>自動(dòng)增長列不需要添加值
insert person values(12,'wang',0,23,32,34)
insert person(sex,age,cardid) values(0,23,32) --有選擇性的插入數(shù)據(jù)((sex,age,cardid) )指要手動(dòng)添加的數(shù)據(jù)
--修改記錄 update 表名set 修改對(duì)象where 條件> 1>修改多個(gè)字段,中間以逗號(hào)間隔
update person set age=19,sex=0 where ID=1
update person set age=19,age=12 where ID=2 ---1>
update person set age=19+1 where ID=2---修改信息時(shí)進(jìn)行算術(shù)運(yùn)算
update person set age=19+1 --如果不寫where,則對(duì)所有數(shù)據(jù)進(jìn)行修改
update person set age=SUBSTRING(age,1,1) where ID=1 --substring 是字符的截取
--刪除記錄 delete 表名where 條件> (如果不加where則刪除所有記錄)
delete person where ID=1
對(duì)表的查詢
單表查詢
復(fù)制代碼 代碼如下:
select * from tableName --查找顯示整個(gè)表(所有列)
select列名1,列名2 from tableName --顯示部分列
select列名1='編號(hào)',列名2='品牌' from Product1 --把其中一列的信息統(tǒng)一修改
--修改顯示時(shí)列標(biāo)題(方法一)
select '編號(hào)'=ProCode,'品牌'=ProTypeName from Product1
--修改顯示時(shí)列標(biāo)題(方法二)
Select 列名1 '編號(hào)',列名2 '品牌' from Product1
--顯示時(shí)對(duì)列進(jìn)行算數(shù)運(yùn)算, 顯示時(shí)添加列
select列名1,列名2,列名3*0.5 '打折后',Number from Product1
select distinct 列名1 from tableName --顯示時(shí)刪除該列的重復(fù)行
select top 3 * from Product1 --顯示前三列
select top 50 percent * from Product1 --顯示總行數(shù)的前%行
--and是并且, or是或者 , 條件非: not 列名='值'
select * from tableName where Number=15 and not age=12 and Name='aa' or sex=1
--查找score范圍為0到100的數(shù)據(jù)
select * from Product1 where score100 and score >=1
select * from Product1 where score between 1 and 100
--in,not in (包含不包含) 以下都是查找number為,,的數(shù)據(jù)
select * from Product1 where Number=10 or Number=15 or Number=20
select * from Product1 where Number in(10,15,20)
select * from Product1 where not Number in(10,15,20)
--1>like模式匹配符%可以代替任意個(gè)數(shù)量的字符2> _可以代替一個(gè)字符 3>[]是一個(gè)查找范圍
select * from Product1 where ProCode like 'D%' --查找首字母為D的ProCode的數(shù)據(jù)
select * from Product1 where ProCode like '_S%' --查找第二個(gè)字符是S的procode數(shù)據(jù)
select * from Product1 where 列名1 like '1%' --即使是float型也要加''
select * from Product1 where 列名1 like '_4_' --查找第二個(gè)字符是且字符個(gè)數(shù)為的3數(shù)據(jù)
select * from Product1 where 列名1 like '_[5-9]%' --查找第二個(gè)字符是5到9的列名1數(shù)據(jù)
--查找為空,不為空的數(shù)據(jù)
select *from Product1 where proValue is not null
select *from Product1 where proValue is null
go --排序( desc降序 asc升序 什么都不寫就默認(rèn)升序 )
select * from Product1 order by proValue desc --將provalue按降序排列
select * from Product1 order by proValue asc --將provalue按升序排列
select * from Product1 order by Number --將Number按默認(rèn)(升序)排列
select * from Product1 order by Number desc,proValue asc --第二個(gè)條件在第一個(gè)條件相同時(shí)才執(zhí)行
go --聚合函數(shù)
select MAX(proValue) from Product1 --查找proValue中的最大值
select min(proValue) from Product1 --查找proValue中的最小值
select sum(proValue) from Product1 --查找proValue中數(shù)據(jù)的和
select avg(proValue) from Product1 --查找proValue中的平均值
select count(*) from Product1 --查找表中的行數(shù)*也可以用列名代替
--group by分組(where在group by 之前,having分組之后的篩選條件,where和having都是篩選條件)
--分組:可以顯示分組列的信息和分組后的信息分別進(jìn)行統(tǒng)計(jì)
select列名1,max(列名2),min(列名3) from tableName where proTypeName='電視機(jī)' group by 列名1
select proTypeName,max(proValue),min(proValue) from Product1 group by proTypeName having count(proValue)>1
多表查詢
復(fù)制代碼 代碼如下:
--內(nèi)連接inner join 查詢兩表共有的信息
--from查詢列名1.Name=列名2.Name 是關(guān)聯(lián)條件(關(guān)聯(lián)條件中列的內(nèi)容要一致)
select * from tableName inner join Product2 on列名1.Name=列名2.Name
--顯示查詢后的部分列,p1.*意思是顯示p1的所有列
select p1.*,proArea,proBrand from Product1 as p1 inner join Product2 on p1.ProCode=Product2.ProCode
--Product1 as p1 意思是給Product1起了個(gè)別名p1 ,as 可以省略
select * from Product1 as p1 inner join Product2 as p2 on p1.ProCode=p2.ProCode
--where查詢,省略了as 格式:select * from 表,表where 關(guān)聯(lián)條件>
select * from Product1 p1,Product2 p2 where p1.ProCode=p2.ProCode
--外連接 --先顯示兩表關(guān)聯(lián)到的數(shù)據(jù),再顯示關(guān)聯(lián)不到的數(shù)據(jù)
go --格式:select * from 表left\right\full outer join 表on 關(guān)聯(lián)條件>
select * from Product1 p1 left outer join Product2 p2 on p1.ProCode=p2.ProCode --左外連接
select * from Product1 p1 right outer join Product2 p2 on p1.ProCode=p2.ProCode --右外連接
select * from Product1 p1 full outer join Product2 p2 on p1.ProCode=p2.ProCode --全外連接
--交叉連接(又叫笛卡爾連接:瘋狂連接,n對(duì)n連接,沒有關(guān)聯(lián)條件)
--格式:select * from 表cross join 表
select * from Product1 cross join Product2
--自連接(自查詢:是把一張表分解成兩張表來用)
select c1.*,c2.Name from ST_class c1,ST_class c2 where c1.ID=c2.Department and c1.Name='計(jì)算機(jī)學(xué)院'
--嵌套查詢
--子查詢返回多個(gè)值
select * from product1 where ProCode in(select ProCode from Product2 where proArea='北京')
select * from product1 where ProCode not in(select ProCode from Product2 where proArea='北京')
--子查詢返回一個(gè)值
select* from Product1 where proValue=(select MAX(provalue) from Product1)
--子查詢返回多個(gè)值時(shí)可以用any(返回結(jié)果中的任何一個(gè)【最小的一個(gè)】)all(返回結(jié)果中的所有【最大值】)
--聯(lián)合查詢 union all (用union all連接兩個(gè)單獨(dú)的子查詢)
select SNAME,SSEX,SBIRTHDAY from STUDENT union all select TNAME,TSEX,TBIRTHDAY from TEACHER
存儲(chǔ)過程
復(fù)制代碼 代碼如下:
--創(chuàng)建(create)/修改(alter)一個(gè)存儲(chǔ)過程
alter proc sp_SMGetCity ---sp_SMGetCity 是存儲(chǔ)過程的名字
(
@code nvarchar(50), --數(shù)據(jù)類型要和比較的字符相同
@name nvarchar(50) output ,
@grade int=1
--'這里要注意:存儲(chǔ)過程賦初值,只能在排在最后的參量中'
---一個(gè)@ 符號(hào)是局部變量
---兩個(gè)@ 符號(hào)是全局變量
)
as
begin
select @name=Name from TBName where Code like @code+'%' and Grade=@grade --begin和end 中間是要執(zhí)行的SQL語句
print @name --帶輸出參數(shù)
end
declare @outname nvarchar(50) -- 定義一個(gè)變量
exec sp_SMGetCity'11',@outname output --@aa把變量賦值給輸出參數(shù),用來接收返回值
select @outname
sp_help sp_SMGetCity --查看名為sp_studentmanager的存儲(chǔ)過程的創(chuàng)建信息
sp_helptext sp_SMGetCity --查看名為sp_studentmanager的存儲(chǔ)過程的創(chuàng)建代碼
drop proc sp_SMGetCity --刪除存儲(chǔ)過程
--return只能返回整型數(shù)據(jù)
--刪除存儲(chǔ)過程drop proc sp_Name
-- exec(@aa)--執(zhí)行@aa(SQL語句),所以要加括號(hào),執(zhí)行字符串中的SQL語句
存儲(chǔ)過程調(diào)用存儲(chǔ)過程
as
begin
declare @return int
exec @return=sp_checkUser@id,@name --存儲(chǔ)過程調(diào)用存儲(chǔ)過程
if @return=0
print '沒有重復(fù),return只能返回整型'
else
print '用戶已注冊(cè)'
end
一些例子
數(shù)據(jù)庫聯(lián)查授權(quán)
復(fù)制代碼 代碼如下:
alter view vw_Role
as
declare @num int
declare @title nvarchar(100)
declare @ctitle nvarchar(200)
set @ctitle=''
select @num=count(*)from dbo.Operate
while(@num>0)
begin
select @title=name from (select row_number() over(order by id) 'newid' ,name from dbo.Operate )ta where newid =@num
if(@num>1)
set @ctitle+=@title+','
else
set @ctitle+=@title
set @num=@num-1
end
Declare @sql varchar(8000)
set @sql='select * from(select 1 "isture",rolename,modulename,operatename,role_ID,Module_id from vw_userrole group by rolename,modulename,operatename,role_ID,Module_id)a pivot(count(isture)for operatename in('+@ctitle+')) b'
exec(@sql)
分頁器存儲(chǔ)過程,分頁存儲(chǔ)過程
復(fù)制代碼 代碼如下:
alter proc cutpage
(
@tablename nvarchar(100),----分頁的表
@columnname nvarchar(100), ----分頁的列
@ordertype nvarchar(100)='asc', ----排序方式
@pageindex int =1,
@pagecount int =1
)
as
begin
declare @aa nvarchar(max);
set @aa= 'select * from
(select *,ROW_NUMBER() over(order by '+@columnname+' '+@ordertype+') as uprow from '+@tablename+' ) as newtable
where uprow between '+cast((@pageindex-1)*@pagecount+1 as nvarchar(100))+' and '+convert(nvarchar(100), @pageindex*@pagecount)
exec (@aa) --這里@aa必須加括號(hào)()
end
exec cutpage 'SM_Class', 'classid'
事務(wù) Transaction
復(fù)制代碼 代碼如下:
---事務(wù)關(guān)鍵語句講解----
BEGIN TRANSACTION ---事務(wù)關(guān)鍵字transaction
DECLARE @errorSum INT
SET @errorSum=0 --初始化為,即無錯(cuò)誤
update bank SET money=money+1000 where name='張三'
SET @errorSum=@errorSum+@@error
update bank SET money=money-1000 where name='李四'
SET @errorSum=@errorSum+@@error --累計(jì)是否有錯(cuò)誤(@@error是非零)
if @errorSum>0
begin
print '不成功,有錯(cuò)誤,錯(cuò)誤代號(hào)是:'
print @errorsum
rollback transaction
end
else
begin
print '成功'
select * from Bank
commit TRANSACTION
end
觸發(fā)器 Trigger
復(fù)制代碼 代碼如下:
--概念:一種特殊的存儲(chǔ)過程,將本表中的數(shù)據(jù)更改(增刪改),就會(huì)自動(dòng)執(zhí)行實(shí)現(xiàn)定義的語句
--特點(diǎn):跨越相關(guān)表的級(jí)聯(lián)修改
--關(guān)鍵字:trigger
alter trigger trigger_name_f
on SM_Class
for update --(for是在增刪改之前執(zhí)行after在增刪改之后執(zhí)行,instead of 是所有【增|刪|改】都不執(zhí)行,之前觸發(fā),但不改值)
as
begin
if update(remark) ---判斷SM_Class表中remark列是否發(fā)生數(shù)據(jù)變化
begin
select * from inserted ---存放修改的新值的表
select * from deleted ----存放修改的舊值的表
print 'remark列發(fā)生更改'
end
else
print '其他列發(fā)生變化'
print '測(cè)試觸發(fā)器,當(dāng)修改表SM_Class時(shí),顯示這句話,且for時(shí)這句話在前'
end
游標(biāo) Cursor
復(fù)制代碼 代碼如下:
--游標(biāo)類似于sql dateReader 一行一行的讀取
--一般是在萬不得已的情況下使用, 時(shí)間長,服務(wù)器壓力大,吃更多的內(nèi)存,寬帶,
--游標(biāo)是對(duì)一個(gè)集合的遍歷讀取
declare cur_test cursor
for
select pid,pname from ns_product
open cur_test
declare @id uniqueidentifier;
declare @name nvarchar(50);
--讀取一行(第一次讀取當(dāng)然是第一行了)
fetch next from cur_test into @id,@name
--判斷一下是否讀到數(shù)據(jù)了,狀態(tài)為零說明讀到數(shù)據(jù)了(@@FETCH_STATUS=0)
while @@FETCH_STATUS=0
begin
print @id
print @name
print '----------------------'
--然后讀取下一行
fetch next from cur_test into @id,@name
end
close cur_test
deallocate cur_test
零散知識(shí)點(diǎn)
1)截取字符串: substring(字段名, 起始位置(首位為1),截取的長度 )
select SUBSTRING(age,1,1) from person where ID=2
2)關(guān)于GUID:
select NEWID()
insert person values('','',NEWID())
3)將一張表(person2)插入到另一張表(person1)中( 列數(shù)要對(duì)應(yīng))
insert person1
select列,列,列 from person2
4)條件語句 (注意: C#中的大括號(hào){}在sql中用begin end 代替 )
復(fù)制代碼 代碼如下:
declare @x int ,@y int
set @x=1
set @y =2
if @x>@y
print 'x>y'
else
print 'xy'
select code,name,grade,
case Grade
when '1' then '省'
when '2' then '市'
when '3' then '縣'
end '等級(jí)'
from SM_PostCode
-------------------------------------------------------------
while (select MAX(DEGREE) from SCORE)85
begin
if (select MAX(DEGREE) from SCORE where CNO='3-105')>=100
break
end
5)判斷是否存在if exists( select * from TBName where CityName='22')
6) 添加自動(dòng)增長列row_number over(order by **) ROW_NUMBER是關(guān)鍵字 over指根據(jù)哪一列排序
select ROW_NUMBER() over(order by classID) ,* from SM_Class
select rank() over(order by classID) ,* from SM_Class ---也是自動(dòng)增長的行號(hào),如果出現(xiàn)重復(fù)會(huì)并列行號(hào),下一個(gè)值會(huì)自動(dòng)加二
--一條查詢語句返回的結(jié)果作為另外一條查詢語句的數(shù)據(jù)源表
select * from ( select ROW_NUMBER() over(order by 列名1)此處新列名, * from TBName) 此處新表名where 新列名between 1 and 3
7)臨時(shí)表
declare @table table(id uniqueidentifier,name varchar(50))
--執(zhí)行插入操作(插入條數(shù)據(jù)),并將這條數(shù)據(jù)的hid字段返回并插入到@table表id屬性中
insert images(Hname,Himage) output inserted.Hid into @table(id) values(@hname,@Himage)
declare @picid uniqueidentifier
select @picid=id from @table
------------------------------------------------------------
--下面是執(zhí)行效率的對(duì)比
--sql 語句一:執(zhí)行需要s
declare @tempTable table(id varchar(20),name int,score datetime)
insert @tempTable(id,name,score)
select userID,userName,userScore from scoreTable
select * from @tempTable
--sql 語句二:執(zhí)行只需要s
DROP TABLE #Bicycles
SELECT userID,userName,userScore
INTO #Bicycles
from scoreTable
select * from #Bicycles
8)關(guān)于日期時(shí)間的操作
--數(shù)據(jù)庫中獲取北京時(shí)間和國際時(shí)間
select getdate(), getutcdate()
--時(shí)間的增加(增加的類型[年/月/日],增量,給誰加[當(dāng)前時(shí)間/日期])dateAdd
select dateadd(YEAR,2,GETDATE()) ----將當(dāng)前的年份加上兩年
--時(shí)間的減法DateDiff
select DATEDIFF(HOUR,getdate(),getutcdate()) --國際時(shí)間的小時(shí)減去當(dāng) 前北京時(shí)間的小時(shí)(后邊減前邊)
--獲取時(shí)間中的年份, 月份, 天等同理
select year(getdate())-year(birthday())
select year(getdate())-year('1988-10-07')
9)行列轉(zhuǎn)換
select * from ( select * from TableName) a pivot(count(stuName)) for columnName in('aa','bb','cc','dd')
10) 雙引號(hào)只能用于表名和列名(不加雙引號(hào)也可以)
set @aa='select ClassName "sd" from SM_Class' --注意:'' 里面原來的'sd' 現(xiàn)在要寫成"sd"
exec (@aa)
-----------------這里要多加注意------------------------------
declare @bb nvarchar(max);
--在使用數(shù)據(jù)值時(shí)只能用''電商二班''
set @bb ='select * from SM_Class where ClassName=''電商二班''' --注意:原來的'電商二班'要寫成''電商二班''
exec (@bb)
11) --快速創(chuàng)建表結(jié)構(gòu)
select c.Cid,c.Ccount into newTB1 from ns_comment c where 1>1
12) --重點(diǎn)再記一下
declare @na nvarchar(10),@str nvarchar(max);
set @str=' select top 1 @bb=ClassID from SM_Class '
--@str包含SQL語句的變量,對(duì)@str中的變量進(jìn)行定義N標(biāo)明是字符串,用來接收@str中變量的變量(即@na=@bb)
exec sp_executesql@str, N'@bb nvarchar(10) output',@na output
select @na,@str
13) -------------并發(fā)問題--------
--概念:多個(gè)用戶同時(shí)和一個(gè)對(duì)象(庫,表)交互
--出現(xiàn)問題:臟數(shù)據(jù),非重復(fù)讀取,丟失更新,幻影讀取)
--解決:SQL Server使用鎖來確保事務(wù)完整性(共享鎖,排它鎖,更新鎖,意向鎖,架構(gòu)鎖,批量更新鎖)
14)
您可能感興趣的文章:- ASP.NET TreeView讀取數(shù)據(jù)庫實(shí)例
- C#和asp.net中鏈接數(shù)據(jù)庫中參數(shù)的幾種傳遞方法實(shí)例代碼
- ASP.NET將Session保存到數(shù)據(jù)庫中的方法
- asp.net 通用的連接數(shù)據(jù)庫實(shí)例代碼
- asp.net得到本機(jī)數(shù)據(jù)庫實(shí)例的兩種方法代碼
- Asp.net把圖片存入數(shù)據(jù)庫和讀取圖片的方法
- ASP.NET連接SQL數(shù)據(jù)庫的簡單實(shí)例代碼
- ASP.NET 連接ACCESS數(shù)據(jù)庫的簡單方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- ASP.NET web.config中數(shù)據(jù)庫連接字符串connectionStrings節(jié)的配置方法
- asp.net連接查詢SQL數(shù)據(jù)庫并把結(jié)果顯示在網(wǎng)頁上(2種方法)
- asp.net Oracle數(shù)據(jù)庫訪問操作類
- ASP.NET 6種常用數(shù)據(jù)庫的連接方法
- ASP.NET下將Excel表格中的數(shù)據(jù)規(guī)則的導(dǎo)入數(shù)據(jù)庫思路分析及實(shí)現(xiàn)
- 教你Asp.net下使用mysql數(shù)據(jù)庫的步驟
- asp.net程序優(yōu)化 盡量減少數(shù)據(jù)庫連接操作
- asp.net中Null在從數(shù)據(jù)庫讀取的時(shí)候的一點(diǎn)點(diǎn)小技巧
- asp.net連接數(shù)據(jù)庫讀取數(shù)據(jù)示例分享