‘壹’ 如何接收sql语句执行.的返回值
获取存储过程返回值及代码中获取返回值
1.OUPUT参数返回值
例: 向Order表插入一条记录,返回其标识
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
END
END
存储过程中获得方法:
DECLARE @o_buyerid int
DECLARE @o_id bigint
EXEC [nb_order_insert] @o_buyerid ,o_id bigint
2.RETURN过程返回值
CREATE PROCEDURE [dbo].[nb_order_insert](
@o_buyerid int ,
@o_id bigint OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT * FROM [Shop] WHERE [s_id] = @o_shopid))
BEGIN
INSERT INTO [Order](o_buyerid )
VALUES (@o_buyerid )
SET @o_id = @@IDENTITY
RETURN 1 — 插入成功返回1
END
ELSE
RETURN 0 — 插入失败返回0
END
存储过程中的获取方法
DECLARE @o_buyerid int
DECLARE @o_id bigint
DECLARE @result bit
EXEC @result = [nb_order_insert] @o_buyerid ,o_id bigint
3.SELECT 数据集返回值
CREATE PROCEDURE [dbo].[nb_order_select](
@o_id int
)
AS
BEGIN
SET NOCOUNT ON;
SELECT o_id,o_buyerid FROM [Order]
WHERE o_id = @o_id
GO
存储过程中的获取方法
(1)、使用临时表的方法
CREATE TABLE [dbo].[Temp](
[o_id] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[o_buyerid] [int] NOT NULL
)
INSERT [Temp] EXEC [nb_order_select] @o_id
– 这时 Temp 就是EXEC执行SELECT 后的结果集
SELECT * FROM [Temp]
DROP [Temp] — 删除临时表
(2)、速度不怎么样.(不推荐)
SELECT * from openrowset(’provider_name','Trusted_Connection=yes’,'exec nb_order_select’)
1.获取Return返回值
程序代码
//存储过程
//Create PROCEDURE MYSQL
// @a int,
// @b int
//AS
// return @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcere;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 10;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
MyCommand.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@return"].Value.ToString());
2.获取Output输出参数值
程序代码
//存储过程
//Create PROCEDURE MYSQL
// @a int,
// @b int,
// @c int output
//AS
// Set @c = @a + @b
//GO
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
conn.Open();
SqlCommand MyCommand = new SqlCommand("MYSQL", conn);
MyCommand.CommandType = CommandType.StoredProcere;
MyCommand.Parameters.Add(new SqlParameter("@a", SqlDbType.Int));
MyCommand.Parameters["@a"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@b", SqlDbType.Int));
MyCommand.Parameters["@b"].Value = 20;
MyCommand.Parameters.Add(new SqlParameter("@c", SqlDbType.Int));
MyCommand.Parameters["@c"].Direction = ParameterDirection.Output;
MyCommand.ExecuteNonQuery();
Response.Write(MyCommand.Parameters["@c"].Value.ToString());
C#接收存储过程返回值:
public static int User_Add(User us)
{
int iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("User_Add", conn);
cmd.CommandType = CommandType.StoredProcere;
cmd.Parameters.AddWithValue("@UName", us.UName);
cmd.Parameters.AddWithValue("@UPass", us.UPass);
cmd.Parameters.AddWithValue("@PassQuestion", us.PassQuestion);
cmd.Parameters.AddWithValue("@PassKey", us.PassKey);
cmd.Parameters.AddWithValue("@Email", us.Email);
cmd.Parameters.AddWithValue("@RName", us.RName);
cmd.Parameters.AddWithValue("@Area", us.Area);
cmd.Parameters.AddWithValue("@Address", us.Address);
cmd.Parameters.AddWithValue("@ZipCodes", us.ZipCodes);
cmd.Parameters.AddWithValue("@Phone", us.Phone);
cmd.Parameters.AddWithValue("@QQ", us.QQ);
cmd.Parameters.Add("@RETURN_VALUE", "").Direction = ParameterDirection.ReturnValue;
try
{
conn.Open();
cmd.ExecuteNonQuery();
iRet = (int)cmd.Parameters["@RETURN_VALUE"].Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
conn.Close();
}
return iRet;
}
C#接收存储过程输出参数:
public static decimal Cart_UserAmount(int UID)
{
decimal iRet;
SqlConnection conn = new SqlConnection(Conn_Str);
SqlCommand cmd = new SqlCommand("Cart_UserAmount", conn);
cmd.CommandType = CommandType.StoredProcere;
cmd.Parameters.AddWithValue("@UID", UID);
cmd.Parameters.Add("@Amount", SqlDbType.Decimal).Direction=ParameterDirection.Output;
try
{
conn.Open();
cmd.ExecuteNonQuery();
iRet = (decimal)cmd.Parameters["@Amount"].Value;
}
catch (SqlException ex)
{
throw ex;
}
finally
{
conn.Close();
}
return iRet;
}
//////////////////////////////////////////////////////////////
SQL 2000用户自定义函数 一。SQL Server 的三种自定义函数
“自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL Server 中书面的说法。
SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值。
自定义函数分为:标量值函数或表值函数
•如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数。
•如果 RETURNS 子句指定 TABLE,则函数为表值函数。
表值函数又可分为:内嵌表值函数(行内函数)或多语句函数
•如果 RETURNS 子句指定的 TABLE 不附带列的列表,则该函数为内嵌表值函数。
•如果 RETURNS 子句指定的 TABLE 类型带有列及其数据类型,则该函数是多语句表值函数。
标量值函数示例
CREATE FUNCTION dbo.Foo()
RETURNS int
AS
BEGIN
declare @n int
select @n=3
return @n
END
create function GetSex(@sex int)
returns varchar(2)-- 用nvarchar(1)
as -- nvarchar:不管是一个字符还是一个汉字,都存为2个字节
begin -- varchar:汉字是2个字节,其他字符存为1个字节
declare @ssex varchar(2)-- 用nvarchar(1)
if(@sex=1)
set @ssex='男'
else
set @ssex='女'
return (@ssex)
end
调用:
select id,username,dbo.GetSex(Sex) as sex ,loginnum from t_user
内嵌表值函数示例
CREATE FUNCTION dbo.Foo()
RETURNS TABLE
AS
return select id, title from msgs
内嵌表值函数只有一个 select 语句。
多语句表值函数示例(部分)
CREATE FUNCTION FindUsers (@userid int )
RETURNS @FindUser TABLE (id int primary key, UserName varchar(30), RegDateTime DateTime,LoginNum int)
as
begin
insert into @FindUser Select ID, UserName,RegDateTime,LoginNum From T_User Where ID=@userid
return
end
调用:
SELECT * FROM FindUsers(6)
注意其 RETURNS 部分。
多语句函数的主体中允许使用以下语句。未在下面的列表中列出的语句不能用在函数主体中。
•赋值语句。
•控制流语句。
•DECLARE 语句,该语句定义函数局部的数据变量和游标。
•SELECT 语句,该语句包含带有表达式的选择列表,其中的表达式将值赋予函数的局部变量。
•游标操作,该操作引用在函数中声明、打开、关闭和释放的局部游标。只允许使用以 INTO 子句向局部变量赋值的 FETCH 语句;不允许使用将数据返回到客户端的 FETCH 语句。
•INSERT、UPDATE 和 DELETE 语句,这些语句修改函数的局部 table 变量。
•EXECUTE 语句调用扩展存储过程。
二.如何调用自定义函数
调用自定义函数(用户定义的函数)和调用内置函数方式基本相同,
•当调用标量值函数时,必须加上“所有者”,通常是 dbo(但不是绝对,可以在企业管理器中的“用户定义的函数”中查看所有者)。
•当调用表值函数时,可以只使用函数名称。
示例
SELECT *
select dbo.Sta(cnt) from tbl
示例
SELECT *
FROM fn_MyTableFunc( 123.09, N'O''Neill' )
三。存储过程和自定义函数的区别
存储过程(用户定义的存储过程)和自定义函数(用户定义的函数)的区别,在网上已经有讨论过,但有些显得过于零散,有些又篇幅过长不能保证每个人都细心阅读。这里作一个归纳,当然只是应用层面的,可能不全面。
•存储过程,功能强大,可以执行包括修改表等一系列数据库操作,也可以创建为 SQL Server 启动时自动运行的存储过程。
•自定义函数,用户定义函数不能用于执行一组修改全局数据库状态的操作。
•存储过程,可以使用非确定函数。
•自定义函数,不允许在用户定义函数主体中内置非确定函数。
•存储过程,可返回记录集。
•自定义函数,可以返回表变量。
•存储过程,其返回值不能被直接引用。
•自定义函数,其返回值可以被直接引用。
•存储过程,用 EXECUTE 语句执行。
•自定义函数,在查询语句中调用。
‘贰’ ExecuteNonQuery()返回值的几种情况
ExecuteNonQuery()方法主要用户更新数据,通常它使用Update,Insert,Delete语句来操作数据库,其方法返回值意义:对于 Update,Insert,Delete语句执行成功是返回值为该命令所影响的行数,如果影响的行数为0时返回的值为0,如果数据操作回滚得话返回值为-1。
(回滚的意思:删除由一个或多个部分完成的事务执行的更新。为在应用程序、数据库或系统错误后还原数据库的完整性,需要使用回滚。回滚泛指程序更新失败, 返回上一次正确状态的行为)
对于这种更新操作 用我们平时所用的是否大于0的判断操作应该没有问题而且比较好,但是对于其他的操作如对数据库结构的操作,如果操作成功时返回的却是-1,这种情况跟我们平时的思维方式有点差距所以应该好好的注意了。
例如对数据库共添加一个数据表的Create操作,当创建数据表成功时返回-1,如果操作失败的话(如数据表已经存在)往往会发生异常,所以执行这种操作时最好用try--catch--语句来容错。
简单意思是用sql语句创建数据库,创建数据表等等一些对数据库结构的操作最好不要用大于0来判断是否操作成功。
(2)sqlexecute返回值扩展阅读
c#数据执行方法:
1、使用ExecuteReader()操作数据库,执行查询操作的非常好的方法。
ExecuteReader比DataSet而言,DataReader具有较快的访问能力,并且能够使用较少的服务器资源。DataReader对象提供了游标形式的读取方式,当从结果行中读取了一行,则游标会继续读取到下一行。
通过read方法可以判断数据是否还有下一行,如果存在数据,则继续运行返回true,如果没有数据,则返回false。DataReader可以提高执行效率,基于序号的查询可以使用DataReader。
使用ExecuteReader()操作数据库,通常情况下是使用ExecuteReader()进行数据查询操作,使用ExecuteReader()查询数据能够提升查询效率,而如果需要进行数据库事务处理的话,ExecuteReader()并不是一个理想的选择。
2、使用ExecuteNonQuery(),ExecuteScalar()操作数据库,执行增删改操作的利器
ExecuteNonQuery()通常情况下为数据库事务处理的首选,当需要执行插入,删除,修改等操作时,首选ExecuteNonQuery(),ExecuteNonQuery()执行成功返回的是一受影响的行数,对于"Create Table"和"Drop Table"语句,返回值是0。
而对于其他类型的语句,返回值是-1,ExecuteNonQuery()操作数据时,可以不使用DataSet直接更改数据库中的数据。
ExecuteScalar()方法也可以用来执行SQL语句,但是executescalar()执行SQL语句后返回值与ExecuteNonQuery()并不相同,executescalar()方法的返回值的数据类型是object。
如果执行的SQL语句是查询语句,则返回结果是查询后的第一行第一列,如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型装换来显示。
一般情况下,ExecuteNonQuery()操作后返回的是一个值,而executescalar()操作后则会返回一个对象,executescalar()经常使用当需要返回单一值时的情况。例如当插入一条数据信息时,需要马上知道刚才插入的值,则可以使用executescalar()方法。
‘叁’ 如何判定这条sql语句的返回值
<%
sql = "select max(tptime) as onw from tpip where ip ='127.0.01' and id=12"
set rs = conn.execute(sql)
if isnull(rs("onw")) then
response.Write("没有对应的tptime")
else
response.Write("id为12,ip为127.0.01的最晚tptime是" & rs("onw"))
end
set rs = nothing
%>
假设conn是已经定义的数据连接
‘肆’ sql动态查询返回值的意义是什么呢
@name只是返回一个标量值,它的有无并不影响sp那个扩展存储过程的执行
如果你这个执行后,无论是否得到一个表集,都会将@name这个标量值输出
当然需要在程序中额外的方法接收
当然如果你不想用这种方式,你就想用表集的形式接收也可以
sql语句拼接时,直接select name from即可,最后一句select @out_name去掉就可以了
没有@name变量,相应的接收变量@out_name都去掉就好
这个sp_executesql存储过程的输出参数主要是为了解决拼接sql语句时,不能将拼接为字符的变量定义或输出到外面的问题,举个简单的例子
比如你要查询一个表的数量,那么where条件是动态的,这时就必须使用动态拼接sql语句
而查询得到的这个数量你需要赋值到一个变量中,用来进一步的计算或使用
这时,你用exec 执行的结果如何赋值到变量中呢?答案就是图中所示的方法
‘伍’ sql 删除语句 返回值
楼主确定这段代码没问题吗?SqlHelper.ExecuteSqlGet返回值是影响的记录数,当操作失败时,返回null。
/// <summary>
/// 执行带一个存储过程参数的的SQL语句。
/// </summary>
/// <param name="SQLString">SQL语句</param>
/// <param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
/// <returns>影响的记录数</returns>
public static object ExecuteSqlGet(string SQLString, string content)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(SQLString, connection);
System.Data.SqlClient.SqlParameter myParameter = new System.Data.SqlClient.SqlParameter("@content", SqlDbType.NText);
myParameter.Value = content;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
object obj = cmd.ExecuteScalar();
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
return null;
}
else
{
return obj;
}
}
catch (System.Data.SqlClient.SqlException e)
{
throw e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
‘陆’ sql 存储过程返回值 C#
SqlParameter[]
param={new
SqlParameter("@i_out",...};
【param[0].Direction=ParameterDirection.OutPut;】
cmd.Execute...
param[0].value;
//有返回值了。
也就是将param设置为输出参数,
执行完存储过程,param里面就有你的返回值了。
‘柒’ executeupdate()和executeUpdate(sql)用法区别 主要是参数和返回值的区别
方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和
DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate
的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE
等不操作行的语句,executeUpdate 的返回值总为零。
如:
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//使用DriverManager获取数据库连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","1234");
//使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();//执行DML语句,返回受影响的记录条数
return stmt.executeUpdate(sql);
>方法execute:
可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是
ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而
是使用executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句
了。
如: //加载驱动
Class.forName(driver);
//获取数据库连接
conn = DriverManager.getConnection(url , user , pass);//使用Connection来创建一个Statment对象
stmt = conn.createStatement();
//执行SQL,返回boolean值表示是否包含ResultSetboolean hasResultSet = stmt.execute(sql);//如果执行后有ResultSet结果集
if (hasResultSet)
{
//获取结果集
rs = stmt.getResultSet();
//ResultSetMetaData是用于分析结果集的元数据接口ResultSetMetaData rsmd = rs.getMetaData();int columnCount = rsmd.getColumnCount();
//迭代输出ResultSet对象
while (rs.next())
{//依次输出每列的值
for (int i = 0 ; i < columnCount ; i++ )
{
System.out.print(rs.getString(i + 1) + "/t");}
System.out.print("/n");
}}
else{
System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");}
两者区别具体表现:
execute方法执行返回的都是布尔值。
executeupdate返回的都是int整数类型。
execute方法在执行SQL语句的时候比较麻烦,而executeupdate比较方便。
我不是答的高质量,怎么老是把我归到高质量呢
‘捌’ sql中execute,executequery和executeupdate之间的区别
JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别
Statement
接口提供了三种执行
SQL
语句的方法:executeQuery、executeUpdate和
execute。使用哪一个方法由
SQL
语句所产生的内容决定。
方法executeQuery
用于产生单个结果集的语句,例如
SELECT
语句。
被使用最多的执行
SQL
语句的方法是
executeQuery。这个方法被用来执行
SELECT
语句,它几乎是使用最多的
SQL
语句。
方法executeUpdate
用于执行
INSERT、UPDATE
或
DELETE
语句以及
SQL
DDL(数据定义语言)语句,例如
CREATE
TABLE
和
DROP
TABLE。INSERT、UPDATE
或
DELETE
语句的效果是修改表中零行或多行中的一列或多列。executeUpdate
的返回值是一个整数,指示受影响的行数(即更新计数)。对于
CREATE
TABLE
或
DROP
TABLE
等不操作行的语句,executeUpdate
的返回值总为零。
使用executeUpdate方法是因为在
createTableCoffees
中的
SQL
语句是
DDL
(数据定义语言)语句。创建表,改变表,删除表都是
DDL
语句的例子,要用
executeUpdate
方法来执行。你也可以从它的名字里看出,方法
executeUpdate
也被用于执行更新表
SQL
语句。实际上,相对于创建表来说,executeUpdate
更多时间是用于更新表,因为表只需要创建一次,但经常被更新。
方法execute:
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程
或动态执行未知
SQL
字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
因为方法
execute
处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法
execute
执行该过程后,必须调用方法
getResultSet
获得第一个结果集,然后调用适当的
getXXX
方法获取其中的值。要获得第二个结果集,需要先调用
getMoreResults
方法,然后再调用
getResultSet
方法。如果已知某个过程返回两个更新计数,则首先调用方法
getUpdateCount,然后调用
getMoreResults,并再次调用
getUpdateCount。
对于不知道返回内容,则情况更为复杂。如果结果是
ResultSet
对象,则方法
execute
返回
true;如果结果是
Java
int,则返回
false。如果返回
int,则意味着结果是更新计数或执行的语句是
DDL
命令。在调用方法
execute
之后要做的第一件事情是调用
getResultSet
或
getUpdateCount。调用方法
getResultSet
可以获得两个或多个
ResultSet
对象中第一个对象;或调用方法
getUpdateCount
可以获得两个或多个更新计数中第一个更新计数的内容。
‘玖’ 如何获取sql select语句的返回值
1、使用sp或者function;
2、将cmd绑定到一个控件(如grid),然后访问控件的单元值
‘拾’ sql语句 execute,executeQuery和executeUpdate之间的区别
PreparedStatement接口提供了三种执行
SQL
语句的方法:executeQuery、executeUpdate
和
execute。使用哪一个方法由
SQL
语句所产生的内容决定。
1、方法executeQuery
用于产生单个结果集的语句,例如
SELECT
语句。
被使用最多的执行
SQL
语句的方法是
executeQuery。这个方法被用来执行
SELECT
语句,它几乎是使用最多的
SQL
语句。
2、方法executeUpdate
用于执行
INSERT、UPDATE
或
DELETE
语句以及
SQL
DDL(数据定义语言)语句,例如
CREATE
TABLE
和
DROP
TABLE。INSERT、UPDATE
或
DELETE
语句的效果是修改表中零行或多行中的一列或多列。executeUpdate
的返回值是一个整数,指示受影响的行数(即更新计数)。对于
CREATE
TABLE
或
DROP
TABLE
等不操作行的语句,executeUpdate
的返回值总为零。
使用executeUpdate方法是因为在
createTableCoffees
中的
SQL
语句是
DDL
(数据定义语言)语句。创建表,改变表,删除表都是
DDL
语句的例子,要用
executeUpdate
方法来执行。你也可以从它的名字里看出,方法
executeUpdate
也被用于执行更新表
SQL
语句。实际上,相对于创建表来说,executeUpdate
用于更新表的时间更多,因为表只需要创建一次,但经常被更新。