我对存储过程非常新。 我没有更多的想法。
我正在尝试使用存储过程在我的数据库中插入数据。
如果存在,则返回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 :(得分:2)
您在Default.aspx中使用ExecuteNonQuery
如果没有受查询影响的记录,则ExecuteNonQuery返回-1。
您在存储过程中设置了nocounton。这就是为什么在你的执行中,没有记录影响值(意味着-1)即将到来。
设定你的计数,你会得到理想的结果。
您可以通过以下链接了解更多详情 -
答案 1 :(得分:1)
同样适用于Insert,update和Delete。如果您设置了NOCOUNT,那么通常通过执行查询返回的整数将始终为-1。你已经强制它总是返回false,因为你有SET NOCOUNT ON。这就是为什么在插入时SET NOCOUNT ON是常见的。进行插入时,您感兴趣的返回值通常是新插入文章的ID,而不是受影响的行数。
提示。
如果要返回新插入项目的ID,通常可以为插入设置NOCOUNT。
对于更新和删除,您不应该设置为NOCOUNT。你应该让sproc返回受影响的行数。
答案 2 :(得分:0)
这似乎是一个映射错误,检查是否有一个类反映了sp的返回类型,如果不是,则需要创建一个。
使用示例
http://msdn.microsoft.com/en-us/library/bb386975.aspx