带SQL Server存储过程的C应用程序

带SQL Server存储过程的C应用程序,sql,Sql,我的C Windows窗体有一个组合框和文本框。组合框有两条记录,分别是“小说”和“诗歌” 我需要编写代码,如果我选择‘Poem’,它应该是自动生成‘PO-00001’,如果我选择‘Novel’,它应该是自动生成‘NV-00001’ 然后我编写了一个存储过程来实现这一点,它如下所示: ALTER PROCEDURE [dbo].[Proc_New_LoadTest] AS BEGIN DECLARE @MaxNo int, @No Varchar(50); SELECT @Ma

我的C Windows窗体有一个组合框和文本框。组合框有两条记录,分别是“小说”和“诗歌”

我需要编写代码,如果我选择‘Poem’,它应该是自动生成‘PO-00001’,如果我选择‘Novel’,它应该是自动生成‘NV-00001’

然后我编写了一个存储过程来实现这一点,它如下所示:

ALTER PROCEDURE [dbo].[Proc_New_LoadTest]
AS
BEGIN
    DECLARE @MaxNo int, @No Varchar(50);

    SELECT @MaxNo = ISNULL(MAX(CAST(RIGHT(ISBN, 5) AS int)), 0) + 1 
    FROM bookstock 
    WHERE category = @No            

    SELECT RIGHT('00000' + CAST(@MaxNo AS varchar(50)), 5);
    RETURN @MaxNo
END
ALTER PROCEDURE [dbo].[Proc_New_LoadTest]
    @No Varchar(50);
AS
BEGIN 
    DECLARE @MaxNo int;

    SELECT @MaxNo = ISNULL(MAX(CAST(RIGHT(ISBN, 5) AS int)), 0) + 1 
    FROM bookstock 
    WHERE category = @No            

    SELECT RIGHT('00000' + CAST(@MaxNo AS varchar(50)), 5);

    RETURN @MaxNo
END
这是我的C代码:

void loadisbn()
{
    Connection con = new Connection();

    SqlCommand cmd = new SqlCommand("[Proc_New_LoadTest]", con.ActiveCon());
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@No", SqlDbType.VarChar).Value = cmbcategory.Text.Trim();

    cmd.ExecuteNonQuery();
}
在这里,我试着用组合框来选择“小说”,这样它就可以从isbn列中找到最大isbn数,如果是“诗”,那么与之相关的最大isbn数,这两条记录包含在一列中

但我的代码抛出了一个错误:

过程Proc_New_LoadTest没有参数,并且提供了参数

请帮助我调试此错误我的SQL Server版本是SQL Server 2005 Express

如果希望@no作为存储过程的参数,则需要如下定义它:

ALTER PROCEDURE [dbo].[Proc_New_LoadTest]
AS
BEGIN
    DECLARE @MaxNo int, @No Varchar(50);

    SELECT @MaxNo = ISNULL(MAX(CAST(RIGHT(ISBN, 5) AS int)), 0) + 1 
    FROM bookstock 
    WHERE category = @No            

    SELECT RIGHT('00000' + CAST(@MaxNo AS varchar(50)), 5);
    RETURN @MaxNo
END
ALTER PROCEDURE [dbo].[Proc_New_LoadTest]
    @No Varchar(50);
AS
BEGIN 
    DECLARE @MaxNo int;

    SELECT @MaxNo = ISNULL(MAX(CAST(RIGHT(ISBN, 5) AS int)), 0) + 1 
    FROM bookstock 
    WHERE category = @No            

    SELECT RIGHT('00000' + CAST(@MaxNo AS varchar(50)), 5);

    RETURN @MaxNo
END
在您的C代码中,您有一种有趣的方式,将两种方法结合起来以提供价值-最佳实践是使用以下代码行:

cmd.Parameters.Add("@No", SqlDbType.VarChar, 50).Value = cmbcategory.Text.Trim();

使用.Add方法not.AddWithValue,并显式定义varchar参数的长度。

错误很明显-您正在创建并传递一个参数,而存储的进程没有任何参数。如果希望它包含返回值,请查看如何从存储过程返回值。有两种方法可以很好地证明这一点。另外:SQLServer2005已经失去了支持,不应该再用于任何开发——2008年和2008年R2也是如此。您真的应该使用更新的工具—例如SQL Server 2017或2019C代码没有任何响应,SQL Server将ma错误消息作为“过程或函数”Proc_New_LoadTest1“预期参数”@No”,但未提供该参数