C# 在C语言中使用存储过程输出参数
将Sql Server存储过程中的输出参数返回到C变量时遇到问题。我已经阅读了其他关于这一点的帖子,不仅在这里,而且在其他网站上,我无法让它工作。这是我目前拥有的。目前我只是想打印返回的值。下面的代码返回一个空值。我试图返回的是主键。我已尝试使用@IDENTITY和SCOPE\u标识,即设置@NewId=SCOPE\u标识 存储过程:C# 在C语言中使用存储过程输出参数,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,将Sql Server存储过程中的输出参数返回到C变量时遇到问题。我已经阅读了其他关于这一点的帖子,不仅在这里,而且在其他网站上,我无法让它工作。这是我目前拥有的。目前我只是想打印返回的值。下面的代码返回一个空值。我试图返回的是主键。我已尝试使用@IDENTITY和SCOPE\u标识,即设置@NewId=SCOPE\u标识 存储过程: CREATE PROCEDURE usp_InsertContract @ContractNumber varchar(7), @NewId i
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),
@NewId int OUTPUT
AS
BEGIN
INSERT into [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber
END
打开数据库:
pvConnectionString = "Server = Desktop-PC\\SQLEXPRESS; Database = PVDatabase; User ID = sa;
PASSWORD = *******; Trusted_Connection = True;";
try
{
pvConnection = new SqlConnection(pvConnectionString);
pvConnection.Open();
}
catch (Exception e)
{
databaseError = true;
}
执行命令:
pvCommand = new SqlCommand("usp_InsertContract", pvConnection);
pvCommand.Transaction = pvTransaction;
pvCommand.CommandType = CommandType.StoredProcedure;
pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
SqlParameter pvNewId = new SqlParameter();
pvNewId.ParameterName = "@NewId";
pvNewId.DbType = DbType.Int32;
pvNewId.Direction = ParameterDirection.Output;
pvCommand.Parameters.Add(pvNewId);
try
{
sqlRows = pvCommand.ExecuteNonQuery();
if (sqlRows > 0)
Debug.Print("New Id Inserted = ",
pvCommand.Parameters["@NewId"].Value.ToString());
}
catch (Exception e)
{
Debug.Print("Insert Exception Type: {0}", e.GetType());
Debug.Print(" Message: {0}", e.Message);
}
}
存储过程
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7)
AS
BEGIN
INSERT into [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
END
C
编辑:我仍然返回一个DBNull值…对象不能从DBNull转换为其他类型。我明天再谈这个。我要去另一份工作了
我相信SQL表中的Id列不是标识列
我稍微修改了您的存储过程以使用SCOPE\u IDENTITY,它如下所示: 创建程序usp\U InsertContract @合同编号varchar7, @NewId int输出 像 开始 插入[dbo].[Contracts]合同编号 值@ContractNumber 选择@NewId=SCOPE\u IDENTITY 终止 我尝试了这个,它与修改后的存储过程配合得很好: //定义连接和命令,在使用块时确保处理 usingSqlConnection conn=新建SqlConnectionpvConnectionString usingSqlCommand cmd=new SqlCommanddbo.usp\u InsertContract,conn { cmd.CommandType=CommandType.storedProcess; //设置参数 cmd.Parameters。Add@ContractNumber,SqlDbType.VarChar,7;
cmd.Parameters。Add@NewId,SqlDbType.Int.Direction=参数Direction.Output; //设置参数值 cmd.Parameters[@ContractNumber].Value=ContractNumber; //打开连接并执行存储过程 康涅狄格开放大学; cmd.ExecuteNonQuery; //从@NewId读取输出值 int construcd=Convert.ToInt32cmd.Parameters[@NewId].Value; 康涅狄格州关闭; } 这在您的环境中也起作用吗?我不能说为什么您的原始代码不能工作-但当我在这里做这件事时,VS2010和SQL Server 2008 R2,它可以完美地工作
如果您没有返回一个值,那么我怀疑您的表协定可能没有一个包含IDENTITY属性的列。更改存储过程之前,请检查当前存储过程的输出。在SQL Server管理中,运行以下命令: 声明@NewId int EXEC@return\u value=[dbo].[usp\u插入合同] N'Gary', @新ID输出 选择@NewId
看看它会返回什么。这可能会给您一些提示,说明为什么out参数没有填写。在您的C代码中,您使用的是transaction命令。 只需提交事务,然后访问您的参数值,就可以得到该值。
为我工作 但这并不能回答为什么新id的输出参数返回null的问题。使用ExecuteScalar,您可以检索返回值,而不是输出参数。在进行此更改时,我还收到以下错误…对象引用未设置为对象的实例。这是因为该参数在SQL中称为SCOPE\u IDENTITY;C仍在寻找一个名为@ContractNumber的参数。ContractNumber是添加到表中的值。主键名为Id。ExecuteScalar返回一个对象,而不是int。我在执行代码时收到一个异常。我还将使用SCOPE_IDENTITY,而不是重新查询同一个表。如果在分配给单个输出变量时出现“query can return multiple results”错误,我是否使用set命令来执行此操作?设置NewId=SCOPE\u标识?我用下面的…SET@NewId=SCOPE\u IDENTITY替换了select语句,但我仍然收到一个空值。是的,我可以看到数据库中的行。我已经在代码中添加了打开连接和创建命令的功能。您能在读取输出参数之前尝试提交事务吗?这几乎可以作为回答,但可能应该是一个注释,但我无法转换它,因为使用了多个@character,甚至连mods都被拒绝了这一权利,我也不想费心编辑它以使其正常工作非常感谢。我很感谢你花时间为我们这些多年后在谷歌上搜索的人回答这个问题-@marc_s如果Varchar输出的大小未知,那么如何解决这个问题。cmd.Parameters。Add@NewId,SqlDbType.Int.Direction=参数Direction.Output;需要更改为cmd.Parameters。AddWithValue@NewId,SqlDbType.Int.Direction=参数Direction.Output;这是因为它有depreciated@user3569147:绝对不是!!您应该签出并停止使用.AddWithValue-它可能会导致意外的结果。。。
pvCommand.CommandType = CommandType.StoredProcedure;
pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
object uniqueId;
int id;
try
{
uniqueId = pvCommand.ExecuteScalar();
id = Convert.ToInt32(uniqueId);
}
catch (Exception e)
{
Debug.Print(" Message: {0}", e.Message);
}
}