ExcuteScalar(),返回的是查询结果的第一行第一列,返回值是object类型,一般用来查询表中有多少条数据,求最大值等

现在我们用ExcuteScalar()做个测试,需求:我要查询学生表里面有多少条数据.

存储过程:

   IF OBJECT_ID('GetStudentsCountNum','P') IS NOT NULL
   DROP PROCEDURE GetStudentsCountNum
   GO
   CREATE PROCEDURE GetStudentsCountNum
   AS
   SELECT COUNT (*) FROM dbo.T_USERS
   GO 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Data;
 using System.Data.SqlClient;

 namespace ADO.NET查询结果集的第一行第一列
 {
     class Program
     {
         static void Main(string[] args)
         {
             //连接字符串
             string sqlConStr = "server=.;database=DB_USERS;uid=sa;pwd=Password_1";

             //1.创建连接对象
             SqlConnection scon = new SqlConnection(sqlConStr);

             //2.创建命令对象
             SqlCommand scmd = new SqlCommand();
             scmd.CommandText = "GetStudentsCountNum";
             scmd.CommandType = CommandType.StoredProcedure;
             scmd.Connection = scon;

             //3.打开连接
             scon.Open();

             //4,执行命令
             int result = (int)scmd.ExecuteScalar();

             //5.处理数据
             Console.WriteLine("查询到的数据行总数是{0}", result);

             //6。关闭连接
             scon.Close();

             Console.ReadKey();

         }
     }
 }

ExcuteScalar()方法测试

程序执行效果图:

然而ExcuteScalar还有一个特别的应用。

比如,我有一个数据库表,主键是自动增长的,大家都知道,这个时候,向表里面插入数据,不能插入自动增长的主键字段,但是我现在有这样一个需求:

我要得到每次插入到表中的数据的主键值。。这个时候,就轮到ExcuteScalar出马了。所以这个时候,我们可以得出结论:我们不要以为只有select操作的时候才去用ExcuteScalar,像这个Insert操作由于输出的是一行一列的值,也可以使用ExcuteScalar方法。

具体的使用方法是。在插入语句的values关键字前面加上 output inserted.ID   ,这里的ID指的是主键字段。

创建存储过程:(等等我们这里创建两个,一个是错误的实例,一个是正确的实例)

 IF OBJECT_ID('Insert_Users','P') IS NOT NULL
  DROP PROCEDURE Insert_Users
  GO
  CREATE PROCEDURE Insert_Users
  @name NVARCHAR() ,
  @pwd NVARCHAR (),
  @age INT ,
  @errorTimes INT
  AS
  INSERT INTO dbo.T_USERS
          ( T_NAME, T_PWD, T_AGE, T_ErrorTimes )
  OUTPUT Inserted.T_ID VALUES  ( )
            )
             '@age', -- T_AGE - int
            '@errorTimes' -- T_ErrorTimes - int
            )
  GO
            

错误实例,:age和errorTimes字段在数据库中是int类型的,在创建存储过程的时候,不能给参数加引号,不然在编写程序的时候,报错

即使在程序中,单独对这个参数,申明int类型的参数,也还是报错。所以要特别注意。

正确的存储过程实例:

 IF OBJECT_ID('Insert_Users','P') IS NOT NULL
  DROP PROCEDURE Insert_Users
  GO
  CREATE PROCEDURE Insert_Users
  @name NVARCHAR() ,
  @pwd NVARCHAR (),
  @age INT ,
  @errorTimes INT
  AS
  INSERT INTO dbo.T_USERS
          ( T_NAME, T_PWD, T_AGE, T_ErrorTimes )
  OUTPUT Inserted.T_ID VALUES  ( @name, -- T_NAME - nvarchar()
            @pwd, -- T_PWD - nvarchar()
            @age, -- T_AGE - int
            @errorTimes -- T_ErrorTimes - int
            )
  GO
            

正确的存储过程实例

代码实现如下:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Data;
 using System.Data.SqlClient;

 namespace 当主键是自动增长的时候_我们要查询每次插入的时候的主键值的时候用ExcuteScalar
 {
     class Program
     {
         static void Main(string[] args)
         {
             string sqlConStr = "server=.;database=DB_USERS;uid=sa;pwd=Password_1";

             //1.创建连接对象
             SqlConnection scon = new SqlConnection(sqlConStr);

             //2.创建命令对象
             SqlCommand scmd = new SqlCommand();
             scmd.CommandText = "Insert_Users";
             scmd.CommandType = CommandType.StoredProcedure;
             scmd.Connection = scon;

             //3.打开连接
             scon.Open();

             //设置参数
             scmd.Parameters.Add(new SqlParameter("@name", "Test"));
             scmd.Parameters.Add("));
             scmd.Parameters.Add());

             SqlParameter parameters = new SqlParameter();
             parameters.Value = ;
             parameters.DbType = DbType.Int32;
             parameters.ParameterName = "@age";
             scmd.Parameters.Add(parameters);

             //4执行命令
             int id= (int)scmd.ExecuteScalar();

             Console.WriteLine("你这次插入的数据的主键是{0}", id);
             Console.ReadKey();

         }
     }
 }

编码实现

程序运行的效果图:

注意:如果想要还原主键字段,可以使用truncate table 表名,把数据清空,然后执行的时候,就是从主键1开始的

ADO.NET---ExcuteScalar()方法复习的更多相关文章

  1. PHP面向对象之魔术方法复习

    魔术方法复习 2014-9-2 10:08:00 NotePad++ By jiancaigege 飞鸿影~========================= 1.__construct() 构造方法 ...

  2. 使用相对路径导入ado库的方法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 常用的导入ado库的语句: #import "c:\program files\common files\s ...

  3. 个人常用jq方法复习

    $("#elem").on({ mouseover:function(){}, mouseout:function(){}, }); $(ele).closest("di ...

  4. ADO.NET 学习笔记 入门教程

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63 这是本人在 ...

  5. ADO.net基础学习总结(二)

    将连接字符串放入配置文件中 1.添加一个“应用程序配置文件:app.config” <?xml version="1.0" encoding="utf-8" ...

  6. ado.net的简单数据库操作(二)之封装SqlHelperl类

    今天我书接上回,接着昨天的ado.net的数据库操作的相关知识来讲哈! 从上篇文章给出的实例来看,你一定会发现,操作数据库其实还挺麻烦的,就连一个最简单的数据库操作语句都要包括 定义数据库连接字符串. ...

  7. vc++用ADO方式连接oracle问题

    今天装了个oracle客户端,准备写个访问远程oracle的程序.用的是vs2010,采用ADO的连接方法连接oracle,结果运行的时候总是报下面的错: 从提示可以看出是没有找到OraOLEDBup ...

  8. ADO.NET知识汇总

    这又是一篇记录平常工作笔记的博客,无论是在排版还是解说上都不会有太多要求.同时这也是一篇不上博客园首页的博客,Just记录一些工作笔记. vSelect返回单个值 string connSQL = @ ...

  9. vc6.0 通过ADO(udl)连接sql 2008

    转载声明:本文转自http://blog.sina.com.cn/s/blog_7328b9dd0100pkbw.html茗之的博客   首先声明:本文是针对vc与sql菜鸟的,高人请让路. 本文讲解 ...

随机推荐

  1. Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  2. 解决微信浏览器无法使用reload()刷新页面

    场景是这样子的,页面在初始化时有一个ajax请求,在页面上有一个按钮,点击的时候执行window.location.reload(),正常情况reload()后页面依然会向后台发出请求,但在安卓的微信 ...

  3. 判断big endian和little endian的方法

    http://blog.sina.com.cn/s/blog_6ab0b9a80101awzr.html   不同体系的CPU在内存中的数据存储往往存在着差异.例如,Intel的x86系列处理器将低序 ...

  4. 开发WebApp之PC客户端

    HTML5的跨平台性还是很好的,苹果.Android手机都可以用,所在最近使用Jquery Mobile开发了一个手机端应用程序,一次开发,多个平台使用. 但我们的很多客户使用的是还是IE浏览器,有的 ...

  5. ffrpc相关文章列表

    ffrpc 是异步c++通信库.可以说是传统rpc模式和zeromq模式的一个结合,采用broker模式封装client和server之间的拓扑关系,而client和server的通信仍然按照请求应答 ...

  6. TSPL学习笔记(4):数组相关练习

    最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现. 本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题 ...

  7. 从今天起,记录CEF使用开发心得经验

    已经使用CEF来呈现桌面程序界面大半年了,从来没有写过相关博文.发现网上的中文资料甚至英文已经无法满足我的开发需求,不少问题只得自己探索.在此先谢过网络上各位CEF使用开发博文的贡献者,没有你们我也难 ...

  8. WinStore控件之Button

    1 Buton入门简单应用 <StackPanel > <Button Content="按钮1" Height="80" Name=&quo ...

  9. 最近一直在搞CAE,发现Eplan p8真的好强大。

    最近一直在搞CAE,发现Eplan p8真的好强大. 标准化的意义在与提高工作效率,减少重复. 标准化后,不容易出错,项目更改容易.事件都能及时跟踪.

  10. 查询修改linux 打开文件句柄数量

    查询系统支持最大可打开文件句柄数量: #vi /proc/sys/fs/file-max 查询当前连接用户最大可打开文件句柄数量: #ulimit -a 修改当前连接用户最大可打开文件句柄数量: #u ...