利用游标更新数据库中的数据,存储进度的采取

ALTER PROCEDURE [dbo].[POR_CURSOR_FOR_UPDATE]    --创建存储过程
AS
BEGIN
  SET nocount ON                   --忽略行数显示
  DECLARE UpdateSHEBEI CURSOR              --声明游标
  FOR SELECT X_D_TJSL,X_G_JSL FROM FACT_MX  --要查询的结果集

  OPEN UpdateSHEBEI          --打开游标 
  DECLARE @X_D_TJ VARCHAR(128),@X_G_J VARCHAR(128);  --声明变量

 FETCH NEXT FROM UpdateSHEBEI INTO @X_D_TJ,@X_G_J     
 WHILE @@FETCH_STATUS = 0       --开始循环
 BEGIN 
   SELECT @X_D_TJ=CEILING(rand()*50);
    SELECT @X_G_J=CEILING(rand()*6);    --给变量赋值
    UPDATE FACT_SHEBEI_MX SET X_D_TJSL=@X_D_TJ,X_G_JSL=@X_G_J WHERE CURRENT OF UpdateSHEBEI  --更新表数据
   FETCH NEXT FROM UpdateSHEBEI INTO @X_D_TJ,@X_G_J     --下一行数据
  END
  CLOSE UpdateSHEBEI;   --关闭游标
 DEALLOCATE UpdateSHEBEI    
  SET nocount OFF      --打开计数

END

为何分层?代码复用,维护方便(不用牵一发而动全身)

储存进程的亮点:
1、快 2、省流量 3、安全 4、易管理

指南针的利用,指针使用

 
 上学时学的事物,都忘了,用到了,就翻出来学习了一下。使用存储进度编写,可径直运行该存储进程注释都写好了,变量赋值也相比清楚,须要的可以直接复制下来然后替换就好。

在BLL层传调用存储进程(传存储进程名),仍然在BLL中写sql代码?

1 、有参数存储的进度的创建:
(注:带参数的仓储过程当参数相比少时可写在仓储进度名称后)

指南针的语法

声圣元(Ausnutria Hyproca)个指南针变量的语法:

<type>  *<ptr_name>;

注:该语法不仅仅提议一个变量为指针,同时申明指针所针对的内存的系列。

 

 
     1)更好的护卫和可读性。

create proc 存储进度名
@参数名 类型 //可有可无两个用都好隔开
@ag int
as
begin //代表要进行的长河,例如:
SELECT * FROM Users WHERE Age=@ag
end //代表存储进程的截至,

指南针的针对:变量的地址

指南针既可以直接针对新分配的内存,也足以本着一个一度存在的变量。

为了得到变量地址(即变量在内存中的地点),要把符号&放在变量名前。&称为取地址操作符,因为它能回到变量的内存地址:

    int x;
    int *p_x = &x;
    *p_x = 2;
    cout << x << endl;  //输出x的值等于2

 

&的效果是得到变量的地点。

(回忆方法:字符“&”的单词 ampersand 和“地址” address 都是以 a
打头的,使用&符号就如通过网站的地址栏得到该网站的URL)

 

指南针的利用普通可以用来做下列两件事:

  • 得到指针中贮存的内存地址;
  • 赢得内存单元中蕴藏的值。

譬如说,输出指针 p_pointer_to_利用游标更新数据库中的数据,存储进度的采取。integer 指向(存储)的地址:

    int x = 5;
    int *p_pointer_to_integer = &x;
    cout << p_pointer_to_integer;  //输出x的地址
    //等价于 cout << &x

 997755.com澳门葡京 1

 

本条代码片段打印输出变量x的内存地址,而这些变量存储在
p_pointer_to_integer 中。

 

只要要访问内存单元中蕴藏的值,可以选用 操作符,例如:

    int x = 5;
    int *p_pointer_to_integer = &x;
    cout << *p_pointer_to_integer;  //输出5
    //等价于 cout << x

 

代码 *p_pointer_to_integer
表示“到指针所指向的内存,去取出存储在内部的值”。在这一个事例中,指针
*997755.com澳门葡京 ,p_pointer_to_integer 指向了变量x,而x的值是5,所以输出了数值5。

 

使用*来取得指针变量指向的地方的值,这一进度称为直接引用指针(为了拿到地点中存储的值,大家是由此一个到该内存地址的引用,使用它,直接地到达目标地)。

由此直接引用指针,还是可以修改指针地址所指向的变量的值,例如:

    int x;
    int *p_pointer_to_integer = &x;
    *p_pointer_to_integer = 5;  //x的值现在修改为5
    cout << x;  //输出5

 

 

那么,何时理应在变量名前丰裕*号(或&号)?那么些很不难失误,为此整治了刹那间,如下表所示:

操作目的

需要的操作符

示例

声明指针

*

Int *p_x

获得指针所指向的地址

不需要

Cout << p_x

调整指针所指向的地址

不需要

Int *p_x; p_x = /*address*/

获得指针所指向的地址中的值

*

Cout << *p_x

调整指针所指向的地址中的值

*

*p_x = 5;

声明变量

不需要

Int y;

获得变量的值

不需要

Int y; cout << y;

调整变量的值

不需要

Int y; y=5;

获得变量的地址

&

Int y; int *p_x; p_x = &y;

调整变量的地址

不可行

不可以,变量地址不能更改

 

要牢记那张表,切记多少个规则:

  • 指南针存储的是地点。因而,直接使用“裸”指针(即不带任何标志的指针)拿到的就是地点。要获取或调整存储在该地点中的值,必须添加额外的*。
  • 变量存储的是数据值。由此,直接选取变量得到的就是数据值。而要得到变量的地方,就务须附加添加&。

 

今天,大家通过一个粗略的次第来演示下那些职能:

#include <iostream>

using namespace std;

int main()
{
    int x;  //x为普通变量
    int *p_int;  //p_int为指向一个整型数的指针

    p_int = &x;  //将x的地址赋值给p_int
    cout << "Please enter a number: ";
    cin >> x;  //读入一个值并赋给变量x,这里的x也可以用*p_int来代替
    cout << *p_int << '\n';  //使用*来获得指针所指向的变量的值
    *p_int = 10;
    cout << x;  //再次输出10
}

 997755.com澳门葡京 2

 

率先个cout输出变量x的值。让大家来逐步地举办顺序,观看内存是何许变化的。大家用箭头来表示指针指向的地点,方框中的数字代表非指针变量在内存中的值。

(1)刚初阶,我们有一个整型变量x,以及一个针对性整型的指针变量p_int。直观上,可以认为现行有三个值未知的变量:

997755.com澳门葡京 3

 

(2)接着,代码通过运用取地址符(&)得到变量x的地点,并将该地点存储到指针p_int
中。

    p_int = &x;  //将x的地址赋值给p_int

 

所以,大家可以画一条从变量p_int到变量x的箭头,表示指针p_int指向变量x。

997755.com澳门葡京 4

 

(3)然后用户输入一个数字,存储在变量x中,该存储地点也是p_int所指向的岗位。

    cin >> x;  //读入一个值并赋给变量x,这里的x也可以用*p_int来代替

 

简言之起见,大家假诺用户输入数字5.现行内存的情事成为了这么:

997755.com澳门葡京 5

 

(4)接着,下一行代码将*p_int传给cout。p_int直接引用了p_int,它会检查p_int中的地址,并且到该地点中取出其变量值。

    cout << *p_int << '\n';  //使用*来获得指针所指向的变量的值

 

 

(5)最终的两行语句表面,通过指针可以修改变量原来的值。这些讲话将值10仓储到p_int所针对的内存中,相当于储存着变量x的值的内存。

    *p_int = 10;

997755.com澳门葡京 6

 

它集中在一个地点,可以使三层架构的兑现更为简约(存储进度将组成数据层)

储存进程的调用:

 总结

 在学习数据结构的时候,发现对指针那块如故有点模糊,于是回想了一晃指针,将其获取和感受写了下来。

这一次学习使作者打听了使用指针的益处之一就是便民修改其所指向内存的值;清楚了怎么时候理应在变量名前添加*号(或&号);当搞不清楚使用指针时内存的变迁历程时,可以先绘制出内存的发端状态,合营箭头图逐步实施顺序,内存的转移历程也就一目明白了,每当指针的针对改变时,便绘制新的箭头,每当变量的值暴发变化时,更新它的值。

 

指针的语法
声美素佳儿(Beingmate)个指南针变量的语法: type *ptr_name;
注:该语法不仅仅指出一个变量为指针,同时注脚指针所针对的…

布署到客户时,要修改逻辑只需修改存储进程,无需重新编译BLL组件。除非扩展存储进程选拔到程序中

EXEC kai @ag=19

变动数据库时,比如换成oracle,mysql。只需重建所有存储进程,无需再次编译BLL组件。

 

可读性:如果生写sql代码在BLL中,那么c#代码与sql代码混杂在联名,修改起来很难定位,不难失误

2 、有出口参数的仓储进程的始建:
(注:有参数的储存进度的调用直接在前面写参数,注意顺序,有出口参数的囤积进程可
概念变量接收。)

     
 2)更好的品质。因为sqlserver在它首先次举行时就变更并缓存了蕴藏进程的实施安顿。

create proc 存储进程名
@参数名 类型 //可有可无八个用都好隔开
@ag int
@name varchar output
as
begin //表示要实施的长河,例如:
if(exists(select * from Users where ID=@ID))
set @Have =1
else
set @Have =0
end //表示存储进度的终结,

  
   
3)安全。sqlserver可以为每个储存进度设置区其他新余批准;而在c#代码中创设的sql查询,更易于遭受sql注入攻击

仓储进程的调用:

不应用三层,在表现层中直接嵌入sql代码?

declare @Have int
exec SelectUser 111 ,@Have output
select @Have

根本未曾代码复用,修改起来牵一发而动全身,重复n次一样的sql语句

3 、修改存储进度

而三层:重用,可爱抚,移植,架构清晰,方便了分工合营

alter proc 存储进度名
as
修改后的蕴藏进度

据此,应该严刻的利用三层,并在BLL全体调用存储进度,而不是生写sql代码

 

4 、带通配字符的存储进程

存储进度的创始:
CREATE PROC jia(@name VARCHAR(6)=’%j%’)
AS
SELECT * FROM dbo.Users WHERE Name LIKE @name
储存进程的调用:
EXEC jia ‘%赵%’

 

4 、在上述进度中exists表示得知的表是或不是有多少。(用false和true表示)

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website