标签:
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出马了。所以这个时候,我们可以得出结论:我们不要以为只有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
即使在程序中,单独对这个参数,申明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开始的
标签:
原文地址:http://www.cnblogs.com/caofangsheng/p/4558492.html