【问题标题】:Why stored procedure return -1为什么存储过程返回-1
【发布时间】:2014-06-18 17:42:03
【问题描述】:

我对存储过程很陌生。 我没有更多的想法。

我正在尝试使用存储过程在我的数据库中插入数据。

如果存在则返回0,否则插入数据并返回1。

这样我就可以在标签上打印插入数据或数据已经存在的文本。

每个条目都返回 -1。

这是我的存储过程。对不对?

    USE [HRMS]
    GO
    /****** Object:  StoredProcedure [dbo].[hrm_AddLanguages2]    Script Date:   05/02/2014 10:19:38 ******/
   SET ANSI_NULLS ON
   GO
  SET QUOTED_IDENTIFIER ON
  GO
  ALTER PROCEDURE [dbo].[hrm_AddLanguages2]
    -- Add the parameters for the stored procedure here

    @Name varchar(120),
    @CreatedOn datetime,
    @UpdatedOn datetime=0,
    @CreatedBy bigint=0,
    @UpdatedBy bigint=0,
    @IsDeleted bit=0
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    BEGIN TRANSACTION
        DECLARE @ID int;
        SELECT @ID = coalesce((select max(ID) + 1 from Languages), 1)
    COMMIT   
    -- Insert statements for procedure here
    IF EXISTS(SELECT Name FROM [dbo].[Languages] WHERE Name = @Name)
    Begin
    Return 0
    End
    Else
        INSERT INTO [dbo].[Languages](Name, CreatedOn,UpdatedOn,CreatedBy,UpdatedBy,IsDeleted) VALUES(@Name,@CreatedOn,@UpdatedOn,@CreatedBy,@UpdatedBy,@IsDeleted)
        Return 1
END

这是我的 Default.aspx.cs 代码-

protected void btnSave_Click(object sender, EventArgs e)
{

if (Page.IsValid)
    {  
    btnAdd.Visible = true;
    btnDelete.Visible = true;
    Label2.Visible = true;
    tblAdd.Visible = false;
    int valueReturn = add();
    if (valueReturn == 1)
    {
        Label2.Text = "Successfully Added";
    }
    else
    {
        Label2.Text = "Already Exist";
    }
    }
    GridView1.DataBind();
    txtName.Text = "";
}

public int add()
{
    string strcon =  ConfigurationManager.ConnectionStrings["Dbconnection"].ConnectionString;
    SqlConnection sqlConnection = new SqlConnection(strcon);

    SqlCommand command = new SqlCommand("hrm_AddLanguages2", sqlConnection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@Name", SqlDbType.VarChar).Value = txtName.Text;
    command.Parameters.Add("@CreatedOn", SqlDbType.DateTime).Value = DateTime.Now;
    command.Parameters.Add("@UpdatedOn", SqlDbType.DateTime).Value = DateTime.Now;
    command.Parameters.Add("@CreatedBy", SqlDbType.BigInt).Value = 1;
    command.Parameters.Add("@UpdatedBy", SqlDbType.BigInt).Value = 1;
    command.Parameters.Add("@IsDeleted", SqlDbType.Bit).Value = 0;
    sqlConnection.Open();
    return command.ExecuteNonQuery();
}

【问题讨论】:

  • 您的插入可能失败,因为您没有通过您刚刚制定的@ID。但是 MAX+1 策略不是 IMO 的好主意(尽管将其包装在事务中 :-)- 而是使用 IDENTITY
  • id 是自动生成的。我正在检查名称是否不存在然后插入

标签: asp.net sql-server stored-procedures


【解决方案1】:

同样的事情也适用于插入、更新和删除。如果您将 NOCOUNT 设置为 ON,则通常通过执行查询返回的整数将始终为 -1。您已强制它始终返回 false,因为您已 SET NOCOUNT ON。这就是为什么在执行插入时通常使用 SET NOCOUNT ON。在进行插入时,您感兴趣的返回值通常是新插入文章的 ID,而不是受影响的行数。

提示。

  1. 如果您要返回新插入项目的 ID,通常可以为插入设置 NOCOUNT ON。

  2. 对于更新和删除,不应将 NOCOUNT 设置为 ON。您应该让存储过程返回受影响的行数。

【讨论】:

  • 我已经写了存储过程如果存在则返回0 else 1。如果else阻塞不进去吗?
  • 是的,因为你已经设置了“SET NOCOUNT ON”,所以它会分开并成功执行,这就是它返回-1的原因。您可以在 IF 之前将 NONCOUNT 设置为 OFF。
【解决方案2】:

您在 Default.aspx 中使用 ExecuteNonQuery

如果没有记录受您的查询影响,ExecuteNonQuery 将返回 -1。

在这里,您在存储过程中设置了 nocounton。这就是为什么在您的 executenonquery 中没有记录影响的值(意味着 -1)即将到来。

相信你会得到想要的结果。

您可以通过以下链接了解更多详情-

http://blogs.msdn.com/b/spike/archive/2009/01/27/sqlcommand-executenonquery-returns-1-when-doing-insert-update-delete.aspx

【讨论】:

    【解决方案3】:

    好像是映射错误,检查是否有反映sp返回类型的类,如果没有则需要创建一个。

    使用示例

     http://msdn.microsoft.com/en-us/library/bb386975.aspx
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      相关资源
      最近更新 更多