2017-11-03 27 views
0

私のテーブルには、自動インクリメントの主キー列ProductIdがあります。ここで私のコードはどこにストアドプロシージャを使用して製品を挿入する - 私は挿入された行の最初の列の値は何もありませんがproductIdしかし、ExecuteScalarは常に0を返します - なぜですか?ExecuteScalarが現在の行の最初の列を返さない

Command = new SqlCommand("spInsertProduct", Connection); 
Command.CommandType = CommandType.StoredProcedure; 

Command.Parameters.AddRange(aSqlParameter); 

Connection.Open(); 
Int32 productId = Convert.ToInt32(Command.ExecuteScalar()); 
+1

あなたのストアドプロシージャであなたはIDを返していますか? – nikunjM

+0

いいえ商品情報を挿入してください。 –

+2

したがって、 'spInsertProduct'ストアドprocが何も返さない場合、' ExecuteScalar'がなぜ期待されますか? – Igor

答えて

1

ストアドプロシージャ:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[AddEmployeeReturnIDwithoutput] 
     @FirstName varchar(50), 
     @LastName varchar(50), 
     @BirthDate datetime, 
     @City varchar(50), 
     @Country varchar(50), 
     @id int output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Employees (FirstName, LastName, BirthDate, City, Country) 
    VALUES (@FirstName, @LastName, @BirthDate, @City, @Country) 

    SET @id = SCOPE_IDENTITY() 

    RETURN @id 
END 

データを取得するためのロジック:

// Using Output parameter 
String strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString; 
SqlConnection con = new SqlConnection(strConnString); 

SqlCommand cmd = new SqlCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.CommandText = "AddEmployeeReturnIDwithoutput"; 

cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text.Trim(); 
cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text.Trim(); 
cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value = txtBirthDate.Text.Trim(); 
cmd.Parameters.Add("@City", SqlDbType.VarChar).Value = txtCity.Text.Trim(); 
cmd.Parameters.Add("@Country", SqlDbType.VarChar).Value = txtCountry.Text.Trim(); 
cmd.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output;  

cmd.Connection = con; 

try 
{ 
    con.Open(); 
    cmd.ExecuteNonQuery() ; 
    string id = cmd.Parameters["@id"].Value.ToString() ; 
    lblMessage.Text = "Record inserted successfully. ID = " + id; 
} 
catch (Exception ex) 
{ 
    throw ex; 
} 
finally 
{ 
    con.Close(); 
    con.Dispose(); 
} 

これはあなたがストアドプロシージャから何も返さない場合..行うことになってどのようです、あなたは何も値を取得しません

関連する問題