2014-05-02 191 views
0

我是非常新的存储过程。 我没有更多的想法。为什么存储过程返回-1

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

如果存在则返回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(); 
} 
+0

你的插件可能失败,因为你没有通过'@ ID'您刚才制定。但是MAX + 1策略并不是一个好主意IMO(尽管将它包装在一个事务中: - ) - 而是使用一个'IDENTITY'。 – StuartLC

+0

id是自动生成的。我检查名称是否存在,然后插入 –

回答

2

您使用的ExecuteNonQuery在你的Default.aspx

的ExecuteNonQuery返回-1,如果没有记录受到查询。

这里你已经在存储过程中设置了nocounton。这就是为什么在你的执行查询中没有记录影响值(意味着-1)即将到来。

设置你的计数将得到你想要的结果。

你可以通过下面的链接了解更多详情 -

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

1

同样的道理也适用于与插入,更新和删除。如果SET NOCOUNT ON,那么执行查询通常会返回的整数将始终为-1。您已经强制它始终返回false,因为您的SET NOCOUNT ON。这就是为什么通常在插入时SET NOCOUNT ON。在执行插入操作时,您感兴趣的返回值通常是新插入文章的ID,而不是受影响的行数。

提示。

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

  2. 对于更新和删除,您不应设置NOCOUNT ON。你应该让sproc返回受影响的行数。

+0

如果存在,我已经写入存储过程,然后返回0否则1.是否不进入if else块? –

+0

是的,它会去其他部分,并成功执行,因为你已经设置了“SET NOCOUNT ON”,这就是为什么它返回-1。在IF之前,您可以将NONCOUNT设置为OFF。 –

0

这似乎是一个映射错误,检查是否有反映SP的返回类型的类,如果不是你需要创建一个。

使用示例

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