存储过程未返回值-C#
我有一个存储过程:存储过程未返回值-C#,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我有一个存储过程: ALTER PROCEDURE [dbo].[DeleteFromSchoolMain] @TblName VARCHAR(50), @MainID VARCHAR(10), @TblCol VARCHAR(50), @rowsCount INT OUTPUT AS BEGIN SET NOCOUNT ON; DECLARE @RelTbl AS Nvarchar(50) DECLARE @ColForFK AS Nv
ALTER PROCEDURE [dbo].[DeleteFromSchoolMain]
@TblName VARCHAR(50),
@MainID VARCHAR(10),
@TblCol VARCHAR(50),
@rowsCount INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @RelTbl AS Nvarchar(50)
DECLARE @ColForFK AS Nvarchar(50)
DECLARE @TblMaterial AS NVARCHAR(50)
DECLARE @ColMaterialID AS NVARCHAR(50)
DECLARE @ColMaterialFK AS NVARCHAR(50)
DECLARE @cmdForMaterial AS NVARCHAR(max)
DECLARE @TblSubject AS NVARCHAR(50)
DECLARE @ColSubjectID AS NVARCHAR(50)
DECLARE @ColSubjectFK AS NVARCHAR(50)
DECLARE @cmdForSubject AS NVARCHAR(max)
Set @ColForFK = SUBSTRING(@TblCol,1, DATALENGTH(@TblCol)-2)
Set @ColForFK = @ColForFK+'FK'
DECLARE @cmd AS NVARCHAR(max)
DECLARE @TempCount int
SET @MainID = ''''+@MainID+ ''''
SET @RelTbl = 'ClassSubMatRelation'
--For Class Material
SET @TblMaterial = 'ClassMaterial'
SET @ColMaterialID = 'ClassMaterialID'
SET @ColMaterialFK = 'ClassMaterialFK'
SET @cmd = N'UPDATE ' + @RelTbl + ' SET Status_Info = 0 WHERE ' + @ColForFK + ' = ' + @MainID -- Delete from ClassRelation Table
EXEC(@cmd)
SET @TempCount = @@ROWCOUNT
SET @rowsCount = @TempCount + @rowsCount;
SET @cmd = N'UPDATE ' + @TblName + ' SET Status_Info = 0 WHERE ' + @TblCol + ' = ' + @MainID -- Delete from Main Table
EXEC(@cmd)
SET @TempCount = @@ROWCOUNT
SET @rowsCount = @TempCount + @rowsCount;
-------------------------------------Board-----------------------------------
IF (@TblName = 'Board')
BEGIN
SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from '+@RelTbl+' s where s.' + @ColForFK + ' = ' + @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+' is not null )'
EXEC(@cmdForMaterial)
SET @TempCount = @@ROWCOUNT
SET @rowsCount = @TempCount + @rowsCount;
SET @TempCount = 0;
--For Class Subject
SET @TblMaterial = 'ClassSubject'
SET @ColMaterialID = 'ClassSubjectID'
SET @ColMaterialFK = 'ClassSubjectFK'
SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set Status_Info = 0 where '+@ColMaterialID+' in ( Select s.'+@ColMaterialFK+' from '+@RelTbl+' s where s.' + @ColForFK + ' = ' + @MainID + ' AND s.ClassSubjectFK IN ( SELECT T.ClassSubjectFK FROM ' + @RelTbl + ' T WHERE T.'+@ColForFK+' = '+ @MainID + ') and s.ClassSubjectFK NOT IN ( SELECT E.ClassSubjectFK FROM ' +@RelTbl+' E WHERE E.'+@ColForFK+' != '+ @MainID +') and s.'+@ColMaterialFK+' is not null )'
EXEC(@cmdForMaterial)
SET @TempCount = @@ROWCOUNT
SET @rowsCount = @TempCount + @rowsCount;
SET @TempCount = 0;
END
------------------------------ Class Subject ------------------------------------
ELSE IF (@TblName = 'ClassSubject')
BEGIN
SET @cmdForMaterial = N'UPDATE '+@TblMaterial+' Set '+@TblMaterial+'.Status_Info = 0 from '+@TblMaterial+' tm join '+@RelTbl+' rt on rt.'+@ColMaterialFK+' = tm.'+@ColMaterialID+' where rt.'+@ColForFK+ ' = '+ @MainID
EXEC(@cmdForMaterial)
SET @TempCount = @@ROWCOUNT
SET @rowsCount = @TempCount + @rowsCount;
SET @TempCount = 0;
END
END
GO
我用C#执行它,如下所示:
var rowsAffected = 0;
using (SqlConnection conn = new SqlConnection(Constants.Connection))
{
conn.Open();
SqlCommand cmd = new SqlCommand("DeleteFromSchoolMain", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@TblName", abundleBoard.TempName);
cmd.Parameters.AddWithValue("@MainID", abundleBoard.MainID.ToString());
cmd.Parameters.AddWithValue("@TblCol", abundleBoard.TblCol);
SqlParameter outputParam = new SqlParameter();
outputParam.ParameterName = "@rowsCount";
outputParam.SqlDbType = System.Data.SqlDbType.Int;
outputParam.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(outputParam);
object o = cmd.ExecuteScalar();
if (!outputParam.Value.Equals(DBNull.Value))
{
rowsAffected = Convert.ToInt32(outputParam.Value);
string q = o.ToString();
}
conn.Close();
}
但我的问题是,我在输出参数中没有得到任何东西。我不理解这个问题,而且我觉得我的存储过程没有得到优化。我可以做些什么来加快查询的执行速度吗?索引和分区我已经尽了最大的努力
编辑:
在@SurjitSD和@PeterB的帮助下,我得到了一个解决方案:-
在我的程序中,我在顶部添加了一行:-
SET @rowsCount=0
在c#中,我将代码更改为:-
cmd.ExecuteNonQuery();
if (!cmd.Parameters["@rowsCount"].Value.Equals(DBNull.Value))
{
rowsAffected = Convert.ToInt32(cmd.Parameters["@rowsCount"].Value);
}
现在这个很好用 您正在用c#调用
ExecuteScalar
ExecuteScalar
将为您提供过程中的Select
语句返回的第一行和第一列值
您需要使用ExecuteNonQuery
在ExecuteNonQuery
之后,您可以获得如下值
cmd.Parameters["@rowsCount"].Value
如果在设置@rowscont
之后使用选择@rowscont
,也可以使用ExecuteScalar
获取值。然后,您不需要在sql和c中对任何参数提及输出方向
#
ExecuteScalar示例
Sql过程
Alter procedure SomeProcedure
(
@someVariable int
:
:
)
Begin
/*Some processing logic of procedure*/
Select @SomeVariable //any variable Or Value from procedure needed as output in c#
End
C#
---编辑--
在c#中没有得到值的实际原因是(附说明)
参数@rowscont
在使用之前未初始化。的确如此
null
在执行SET@rowscont=@TempCount+@rowscont
时,实际上是在null
中添加了一些内容。向null
添加任何内容都将成为null
所以
@rowscont
总是null
。在过程开始时设置@rowscont=0
有帮助 “输出参数中没有任何内容”是什么意思?它是0?是的,它是0。但我的过程应该返回受影响的行数。否?如果使用SET@rowscont=0启动程序,请尝试helps@PeterB你是个男人!!那件简单的事就像我脑袋里的斧头。非常感谢!您应该签出并停止使用.AddWithValue()
-这可能会导致意外的结果…我也使用过ExecuteOnQuery。它给了我0。编辑和包括如何获得价值@但我在SP或C#中没有使用TempRowCount。是吗?这给了我错误@TempRowCount未声明。当您接受某种回报时,使用输出参数是很好的。对吧?哇。美好的快速查看您的过程嵌套子查询,告诉我慢的原因。在多个级别嵌套子查询不是很好使用。
var result = cmd.ExecuteScalar();