热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL存储过程入门(流程控制3

SQL存储过程入门(流程控制)(三)这里我们讲一下存储过程的流程控制,ifelse,case,while,这里没有for循环的,这些跟c,c++,c#等语言都差不过的。一,首先

SQL 存储过程入门(流程控制)(三)

这里我们讲一下存储过程的流程控制, if else,case ,while,这里没有for循环的 ,这些跟c,c++,c#等语言都差不过的。

 

一,首先来看if  else使用

     

if 条件
begin
sql 语句
end
else begin
sql语句
end

 

看个简单例子

declare @id int           --声明个变量
set @id=5                 --设置厨初始值
if(@id=1)
    begin
        print 'right'
    end
else if(@id=0)
    begin
        print 'error'
    end
else
    begin 
         print 'default'
    end

结果我想大家都该晓得了,就不写出来了,这里的begin ,end 也可以不写,不过建议写,这个像c++代码的{},表示一块,写出来层次更加清晰。

当然if 嵌套也是可以的。

  

二,While的使用


我们来计算下1到100的求和运算

Declare @i int,@sum int
set @i=0
set @sum=0
while @i<=100   --开始循环
begin
set @i=@i+1  --自增一
set @sum=@sum+@i
end
print @sum
结果
-----------
5151

 

    三,Case 多重选择的使用

Declare @iret int,@var varchar(10)
set @var='A'
select @iret=
case when @var='A' then 0
 when @var='B' then 1
 when @var='C' then 2
 when @var='D' then 3
 else -1
 print @iret

结果
-------
0

上面的这些基本流程控制,基本能满足我们日常的开发需求了,暂时想到的就这么多了,哪天想起其他情况,会适当补充。

 

未完待续......

 

 

Windows 8 应用商店应用开发 之 响应运动的传感器
 

传感器技术的发展增强了移动设备用户的体验。传感器的种类有很多,常见的有加速计、陀螺仪、测斜仪、方向传感器等。本章将介绍如何利用传感器API获得设备旋转的角速度、线性运动的加速度、设备倾斜角度、设备方向、氛围光、地理位置以及近场通信等,开发人员可以综合使用传感器提供的数据开发出内容丰富的Windows应用商店应用。

1响应运动的传感器

程序员可根据设备的运动来开发应用程序,例如通过晃动设备对屏幕截图,使用加速计捕获设备的晃动可以实现此功能。本节将介绍能测量设备角速度的陀螺仪、可用来测量设备加速运动的加速计以及可获取设备倾斜度的测斜仪,这些传感器由Windows.Devices.Sensors命名空间提供支持。

1.1陀螺仪

陀螺仪传感器能测量设备在空间坐标中围绕X轴、Y轴和Z轴的旋转角速度。陀螺仪可以用于协助GPS定位,导航软件使用陀螺仪显示偏转角速度,若GPS信号丢失,陀螺仪能够快速测出方向和角速度的改变,从而使导航软件及时修改导航路线。下面通过示例介绍陀螺仪API的使用。

新建一个Windows应用商店的空白应用程序项目,并命名为GyrometerExample,在MainPage.xaml文件的Grid元素中添加如下代码。

    

    

    

在上面的代码中,放置了多个显示信息的TextBlock控件,其中有3个用于显示陀螺仪数据。然后又添加了4个按钮,并为这4个按钮定义了事件处理方法,其中有两个用于启动陀螺仪数据获取,另外两个按钮则用于停止数据获取。

前台运行效果如图12-1所示。

 

 

图12-1 显示陀螺仪读数的界面

布局好前台界面后,接下来介绍如何从陀螺仪传感器获取读数。首先在后台定义几个全局变量并在构造方法中初始化,以便在后续代码中使用。代码如下所示:

private Gyrometer gyrometer;

//期望的时间间隔

private uint desiredReportInterval;

//定义一个计数器

private DispatcherTimer dispatcherTimer;

public MainPage()

{

    this.InitializeComponent();

    gyrometer = Gyrometer.GetDefault();

    if (gyrometer != null)

    {

      //获取报告间隔

        uint minReportInterval = gyrometer.MinimumReportInterval;

        desiredReportInterval = minReportInterval > 16 ? minReportInterval : 16;

       //设置按钮为不可交互状态

        CloseButton.IsEnabled = false;

        CloseDispatcherButton.IsEnabled = false;

//初始化一个计时器

dispatcherTimer = new DispatcherTimer();

    }

else

    {

        InfoText.Text = "未发现陀螺仪设备";

    }

}

在上面的代码中,使用Gyrometer.GetDefault方法获得陀螺仪传感器的引用对象gyrometer,如果gyrometer对象为空,在前台界面提示“未发现陀螺仪设备”。

陀螺仪传感器以一个时间间隔来报告读数,这个间隔称为当前报告间隔,此间隔以毫秒为单位,使用gyrometer对象的MinimumReportInterval属性能获得陀螺仪的最小报告间隔,然后将它与16毫秒进行比较,如果大于16毫秒,则将desiredReportInterval变量设置成设备所支持的最短间隔,否则,将它设置为16毫秒。值得注意的是当前报告间隔设置的越长,设备的改变灵敏度就会越大,开发者可根据应用的需要设置报告间隔,选择合适的灵敏度数据,表12-1列出了报告间隔与改变灵敏度的关系对照。

表12-1陀螺仪当前报告间隔与改变灵敏度的关系

当前报告间隔(毫秒)

改变灵敏度(度/秒)

1 ms ~ 16 ms

0.1(度/秒)

17 ms ~ 32 ms

0.5(度/秒)

>= 33 ms

                              1.0(度/秒)

接下来对Name属性为“StartButton”按钮添加GetData_Click事件处理方法,单击这个按钮启动陀螺仪读数捕获。代码如下所示:

private void GetData_Click(object sender, RoutedEventArgs e)

{

    if (gyrometer != null)

    {

        //设置报告间隔

        gyrometer.ReportInterval = desiredReportInterval;

//注册方法

        gyrometer.ReadingChanged += new TypedEventHandler(GetChangedData);

       //设置按钮的状态

        StartButton.IsEnabled = false;

        CloseButton.IsEnabled = true;

    }

    else

    {

        InfoText.Text = "陀螺仪设备不可用";

    }

}

在上面的事件处理程序中,为gyrometer对象的ReadingChanged事件添加了事件处理方法GetChangedData,当陀螺仪传感器驱动程序捕获到设备的旋转动作发生改变时,会触发ReadingChanged事件进而执行GetChangedData方法,下面来看一下GetChangedData方法的实现代码。

在GetChangedData方法中,定义了获取陀螺仪数据并将数据显示到前台界面的过程,具体代码如下所示:

async private void GetChangedData(object sender, GyrometerReadingChangedEventArgs e)

{

    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>

    {

//陀螺仪数据对象

        GyrometerReading reading = e.Reading;

//获取设备X轴的角速度

        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);

//获取设备Y轴的角速度

ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);

//获取设备Z轴的角速度

  ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);

    });

}

在上面的方法中,首先从参数e中获得GyrometerReading类型的对象reading,根据reading对象的AngularVelocityX属性获取设备围绕X轴的角速度,将它显示在ScenarioOutput_X控件中,接着使用reading对象的AngularVelocityY和AngularVelocityZ属性获取设备在Y轴、Z轴的旋转角速度,方法中调用了String.Format方法设置输出数据的格式以增加数据的可读性。为了避免UI线程的阻塞,使用调度器Dispatcher的RunAsync方法异步实现上述过程。

为“停止”按钮添加单击事件处理方法CloseData_Click(),当单击“停止”按钮时停止陀螺仪数据获取,CloseData_Click方法的代码如下所示:

private void CloseData_Click(object sender, RoutedEventArgs e)

{

    if (gyrometer != null)

    {

      //移除事件处理程序

        gyrometer.ReadingChanged -= new TypedEventHandler(GetChangedData); 

       //设置“开始“按钮为可激活状态,“停止”按钮不可用   

        StartButton.IsEnabled = true;

        CloseButton.IsEnabled = false;

    }

    else

    {

        InfoText.Text = "未发现陀螺仪设备";

    }

}

在之前介绍获取传感器数据时,通过为gyrometer对象的ReadingChanged事件添加了一个GetChangedData方法来捕获陀螺仪改变时的数据,在上面的CloseData_Click事件方法中只是简单的将此事件处理方法移除掉,这样便可以停止传感器数据的捕获。

在上面的示例中,是通过在设备状态改变事件中添加事件处理方法的方式,被动的实现角速度信息的捕获。除了这种方法外,我们还可以利用计时器,通过每隔一段时间定时读取设备数据的方式,一次或者多次获得传感器数据,下面来看一下这种方法是如何实现的。

向 Name属性为“DispatcherButton”的按钮的单击事件添加事件处理方法Dispatcher_Click(),在该方法中为声明好的全局计时器对象dispatcherTimer的Tick事件添加一个事件处理方法DisplayCurrentReading,接着使用TimeSpan类定义一个时间段,用于设置计时器的时间间隔,然后调用dispatcherTimer对象的Start方法启动计时器。代码如下所示:

private void Dispatcher_Click(object sender, RoutedEventArgs e)

{

//给计时器添加处理程序

    dispatcherTimer.Tick += DisplayCurrentReading;

   //设置计时器的时间间隔为desiredReportInterval毫秒

    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, (int)desiredReportInterval);

   //启动时器

    dispatcherTimer.Start();

    DispatcherButton.IsEnabled = false;

    CloseDispatcherButton.IsEnabled = true;

}

接下来定义Tick事件的处理方法DisplayCurrentReading,用来在每次Tick事件触发时,获取陀螺仪数据并将数据显示在前台界面,代码如下所示:

//获取传感器读数

private void DisplayCurrentReading(object sender, object args)

{

   //初始化GyrometerReading类的reading属性

    GyrometerReading reading = gyrometer.GetCurrentReading();

    if (reading != null)

    {

//获得读数

        ScenarioOutput_X.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);

        ScenarioOutput_Y.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);

        ScenarioOutput_Z.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);

    }

}

在上面的代码中,使用gyrometer对象的GetCurrentReading方法获得代表当前传感器状态的GyrometerReading类型的对象reading,然后将获取到的数据显示到应用界面。这种方法通过dispatcherTimer对象定期触发Tick事件主动读取传感器状态的数据。下面来看一下停止主动读取传感器数据的方法。

为Name属性为“CloseDispatcherButton”的按钮添加单击事件处理方法CloseDispatcher_Click,在这个方法中调用dispatcherTimer对象的Stop方法关闭计时器,这样便可以停止获取陀螺仪数据,代码如下所示:

//关闭计时器

private void CloseDispatcher_Click(object sender, RoutedEventArgs e)

{

    dispatcherTimer.Stop();

    DispatcherButton.IsEnabled = true;

    CloseDispatcherButton.IsEnabled = false;

}

启动调试,便可以看到运行界面,下面以“基于事件的被动获取”为例介绍操作过程。

单击“获取”按钮后,“获取”按钮将转变为不可用状态,界面上显示当前设备陀螺仪传感器的角速度信息。“停止”按钮变为可激活状态。

单击“停止”按钮,将停止更新角速度信息,此时“停止”按钮变为不可用,“获取”按钮变为可激活。二者相互配合像“开关”一样控制数据的显示。程序运行效果如图12-2所示。

 

 

图12-2 获取陀螺仪读数的效果图

    上面的示例用两种方法实现了陀螺仪传感器数据的捕获,程序员根据应用的需求选择合适的方法。另外还要注意,在测试本示例时应确保测试设备支持陀螺仪传感器。

 

 

       注:本文选自自机械工业出版社3月出品的《Windows 8 应用开发权威指南》第12章 传感器

 
 
分类:  [26] Windows 8

 

 

共同学习,共同进步!
 
分类:  SqlSever
标签:  sql,  存储过程,  procedure,  流程控制

推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 湍流|低频_youcans 的 OpenCV 例程 200 篇106. 退化图像的逆滤波
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了youcans的OpenCV例程200篇106.退化图像的逆滤波相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 最近百度了好几种方式都没有效果针对这种a标签直接open的方式我也是醉了 因为要对这个导出文件大小进行限制,当文件大于100mb的时候,就会有提示并且不让下载对于这种前端计算是很难 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
zf72ayw
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有