C#의 저장 프로시저 출력 파라미터 사용
SQL Server 저장 프로시저의 출력 매개 변수를 C# 변수로 되돌리는 데 문제가 있습니다.저는 이와 관련된 다른 게시물들을 이곳뿐만 아니라 다른 사이트에서 읽었는데, 작동이 되지 않습니다.이것이 제가 현재 가지고 있는 것입니다.현재 저는 돌아오는 값을 인쇄하려고 노력하고 있습니다.다음 코드는 null 값을 반환합니다.내가 반환하려는 것은 기본 키입니다.사용해 보았습니다.@@IDENTITY그리고.SCOPE_INDENTITY()(즉,SET @NewId = SCOPE_IDENTITY()).
저장 프로시저:
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),
@NewId int OUTPUT
AS
BEGIN
INSERT into [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
Select @NewId = Id From [dbo].[Contracts] where ContractNumber = @ContractNumber
END
데이터베이스 열기:
pvConnectionString = "Server = Desktop-PC\\SQLEXPRESS; Database = PVDatabase; User ID = sa;
PASSWORD = *******; Trusted_Connection = True;";
try
{
pvConnection = new SqlConnection(pvConnectionString);
pvConnection.Open();
}
catch (Exception e)
{
databaseError = true;
}
명령 실행:
pvCommand = new SqlCommand("usp_InsertContract", pvConnection);
pvCommand.Transaction = pvTransaction;
pvCommand.CommandType = CommandType.StoredProcedure;
pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
SqlParameter pvNewId = new SqlParameter();
pvNewId.ParameterName = "@NewId";
pvNewId.DbType = DbType.Int32;
pvNewId.Direction = ParameterDirection.Output;
pvCommand.Parameters.Add(pvNewId);
try
{
sqlRows = pvCommand.ExecuteNonQuery();
if (sqlRows > 0)
Debug.Print("New Id Inserted = ",
pvCommand.Parameters["@NewId"].Value.ToString());
}
catch (Exception e)
{
Debug.Print("Insert Exception Type: {0}", e.GetType());
Debug.Print(" Message: {0}", e.Message);
}
}
저장 프로시저를 약간 수정했습니다(사용하기 위해).SCOPE_IDENTITY) 다음과 같이 표시됩니다.
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7),
@NewId int OUTPUT
AS
BEGIN
INSERT INTO [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
SELECT @NewId = SCOPE_IDENTITY()
END
이것을 시도해봤는데 (수정된 저장 프로시저를 사용하면) 잘 작동합니다.
// define connection and command, in using blocks to ensure disposal
using(SqlConnection conn = new SqlConnection(pvConnectionString ))
using(SqlCommand cmd = new SqlCommand("dbo.usp_InsertContract", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// set up the parameters
cmd.Parameters.Add("@ContractNumber", SqlDbType.VarChar, 7);
cmd.Parameters.Add("@NewId", SqlDbType.Int).Direction = ParameterDirection.Output;
// set parameter values
cmd.Parameters["@ContractNumber"].Value = contractNumber;
// open connection and execute stored procedure
conn.Open();
cmd.ExecuteNonQuery();
// read output value from @NewId
int contractID = Convert.ToInt32(cmd.Parameters["@NewId"].Value);
conn.Close();
}
이것이 당신의 환경에서도 효과가 있습니까?원래 코드가 작동하지 않는 이유는 말할 수 없지만 VS2010 및 SQL Server 2008 R2에서 이 작업을 수행하면 완벽하게 작동합니다.
값을 돌려받지 못하면 테이블이 의심됩니다.Contracts실제로는 열이 없을 수도 있습니다.IDENTITY그 위에 있는 재산.
저장 프로시저를 변경하기 전에 현재 사용 중인 프로시저의 출력을 확인하십시오.SQL Server 관리에서 다음을 실행합니다.
DECLARE @NewId int
EXEC @return_value = [dbo].[usp_InsertContract]
N'Gary',
@NewId OUTPUT
SELECT @NewId
무엇이 반환되는지 확인합니다.이를 통해 out 매개변수가 채워지지 않는 이유에 대한 힌트를 얻을 수 있습니다.
저도 비슷한 문제가 있어서 먼저 연결을 닫은 후 매개변수를 읽어보니 잘 작동했습니다.사용할 수 있습니다.pvConnection.Close();출력 매개 변수를 읽기 전에 {pvConnection = newSqlConnection(pvConnectionString); pvConnection을 시도하십시오.열기(); } catch(예외) {databaseError = true; }
pvCommand = new SqlCommand("usp_InsertContract", pvConnection);
pvCommand.Transaction = pvTransaction;
pvCommand.CommandType = CommandType.StoredProcedure;
pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
SqlParameter pvNewId = new SqlParameter();
pvNewId.ParameterName = "@NewId";
pvNewId.DbType = DbType.Int32;
pvNewId.Direction = ParameterDirection.Output;
pvCommand.Parameters.Add(pvNewId);
try
{
sqlRows = pvCommand.ExecuteNonQuery();
pvConnection.Close();
if (sqlRows > 0)
Debug.Print("New Id Inserted = ",
pvCommand.Parameters["@NewId"].Value.ToString());
}
catch (Exception e)
{
Debug.Print("Insert Exception Type: {0}", e.GetType());
Debug.Print(" Message: {0}", e.Message);
}
}
저장 프로시저.......
CREATE PROCEDURE usp_InsertContract
@ContractNumber varchar(7)
AS
BEGIN
INSERT into [dbo].[Contracts] (ContractNumber)
VALUES (@ContractNumber)
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
END
C#
pvCommand.CommandType = CommandType.StoredProcedure;
pvCommand.Parameters.Clear();
pvCommand.Parameters.Add(new SqlParameter("@ContractNumber", contractNumber));
object uniqueId;
int id;
try
{
uniqueId = pvCommand.ExecuteScalar();
id = Convert.ToInt32(uniqueId);
}
catch (Exception e)
{
Debug.Print(" Message: {0}", e.Message);
}
}
편집: "저는 여전히 DBNull 값을 돌려받습니다...DBNull에서 다른 형식으로 개체를 캐스트할 수 없습니다.저는 내일 다시 이 일을 맡겠습니다.저는 다른 일을 하러 갑니다."
SQL Table의 Id 열이 ID 열이 아닌 것 같습니다.
C# 코드에서 명령에 트랜잭션을 사용하고 있습니다.트랜잭션을 커밋하기만 하면 매개 변수 값에 액세스할 수 있습니다.저를 위해 일했습니다 :)
언급URL : https://stackoverflow.com/questions/10905782/using-stored-procedure-output-parameters-in-c-sharp
'programing' 카테고리의 다른 글
| MongoDB 3.6.2 2008 R2 Plus가 설치되지 않음 (0) | 2023.06.21 |
|---|---|
| 모두 제거모두 제거쿼리가 있는 태그 (0) | 2023.06.21 |
| 왼쪽 조인의 가장 최근 레코드 (0) | 2023.06.21 |
| WPF에서 종속성 속성과 연결된 속성의 차이점은 무엇입니까? (0) | 2023.06.21 |
| 원격 저장소의 특정 버전 GitClone (0) | 2023.06.21 |