ADO.NET---ExcuteScalar()方法复习

2018-06-18 02:45:03来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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

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

存储过程:

1   IF OBJECT_ID('GetStudentsCountNum','P') IS NOT NULL
2   DROP PROCEDURE GetStudentsCountNum
3   GO 
4   CREATE PROCEDURE GetStudentsCountNum
5   AS 
6   SELECT COUNT (*) FROM dbo.T_USERS
7   GO 
8  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8 
 9 namespace ADO.NET查询结果集的第一行第一列
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //连接字符串
16             string sqlConStr = "server=.;database=DB_USERS;uid=sa;pwd=Password_1";
17 
18             //1.创建连接对象
19             SqlConnection scon = new SqlConnection(sqlConStr);
20 
21             //2.创建命令对象
22             SqlCommand scmd = new SqlCommand();
23             scmd.CommandText = "GetStudentsCountNum";
24             scmd.CommandType = CommandType.StoredProcedure;
25             scmd.Connection = scon;
26 
27             //3.打开连接
28             scon.Open();
29 
30             //4,执行命令
31             int result = (int)scmd.ExecuteScalar();
32 
33             //5.处理数据
34             Console.WriteLine("查询到的数据行总数是{0}", result);
35 
36             //6。关闭连接
37             scon.Close();
38 
39 
40             Console.ReadKey();
41 
42 
43 
44         }
45     }
46 }
ExcuteScalar()方法测试

 程序执行效果图:

 

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

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

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

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

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

 1 IF OBJECT_ID('Insert_Users','P') IS NOT NULL
 2  DROP PROCEDURE Insert_Users
 3  GO 
 4  CREATE PROCEDURE Insert_Users
 5  @name NVARCHAR(10) ,
 6  @pwd NVARCHAR (10),
 7  @age INT ,
 8  @errorTimes INT
 9  AS 
10  INSERT INTO dbo.T_USERS
11          ( T_NAME, T_PWD, T_AGE, T_ErrorTimes )
12  OUTPUT Inserted.T_ID VALUES  ( '@name', -- T_NAME - nvarchar(10)
13            '@pwd', -- T_PWD - nvarchar(10)
14             '@age', -- T_AGE - int
15            '@errorTimes' -- T_ErrorTimes - int
16            )
17  GO
18            
错误实例,:age和errorTimes字段在数据库中是int类型的,在创建存储过程的时候,不能给参数加引号,不然在编写程序的时候,报错

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

正确的存储过程实例:

 1 IF OBJECT_ID('Insert_Users','P') IS NOT NULL
 2  DROP PROCEDURE Insert_Users
 3  GO 
 4  CREATE PROCEDURE Insert_Users
 5  @name NVARCHAR(10) ,
 6  @pwd NVARCHAR (10),
 7  @age INT ,
 8  @errorTimes INT
 9  AS 
10  INSERT INTO dbo.T_USERS
11          ( T_NAME, T_PWD, T_AGE, T_ErrorTimes )
12  OUTPUT Inserted.T_ID VALUES  ( @name, -- T_NAME - nvarchar(10)
13            @pwd, -- T_PWD - nvarchar(10)
14            @age, -- T_AGE - int
15            @errorTimes -- T_ErrorTimes - int
16            )
17  GO
18            
正确的存储过程实例

代码实现如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8 
 9 namespace 当主键是自动增长的时候_我们要查询每次插入的时候的主键值的时候用ExcuteScalar
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             string sqlConStr = "server=.;database=DB_USERS;uid=sa;pwd=Password_1";
16 
17             //1.创建连接对象
18             SqlConnection scon = new SqlConnection(sqlConStr);
19 
20             //2.创建命令对象
21             SqlCommand scmd = new SqlCommand();
22             scmd.CommandText = "Insert_Users";
23             scmd.CommandType = CommandType.StoredProcedure;
24             scmd.Connection = scon;
25 
26 
27             //3.打开连接
28             scon.Open();
29 
30             //设置参数
31             scmd.Parameters.Add(new SqlParameter("@name", "Test"));
32             scmd.Parameters.Add(new SqlParameter("@pwd", "123456"));
33             scmd.Parameters.Add(new SqlParameter("@errorTimes", 2));
34 
35 
36             SqlParameter parameters = new SqlParameter();
37             parameters.Value = 2;
38             parameters.DbType = DbType.Int32;
39             parameters.ParameterName = "@age";
40             scmd.Parameters.Add(parameters);
41 
42             //4执行命令
43             int id= (int)scmd.ExecuteScalar();
44 
45             Console.WriteLine("你这次插入的数据的主键是{0}", id);
46             Console.ReadKey();
47 
48 
49             
50         }
51     }
52 }
编码实现

程序运行的效果图:

 

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

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:C#复制数组的两种方式,以及效率比较

下一篇:ADO.NET学习系列(二)