C# SqlCommand.ExecuteScalar() は常に値 0 のオブジェクトになるようです。SQL Server 2012 を使用しています。これはすべてのストアド プロシージャで発生しています。非常に簡単な例を次に示します。
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT COUNT(serial_number)
FROM dbo.t_pql_contents
WHERE serial_number = @Serial
END
GO
@Serial に既知の既存の値を指定して SSMS でこれを直接実行すると、期待どおりの結果が得られます。
(No column name)
1
Return Value
0
次のコードを使用して C# アプリで実行すると、result
以下は常に 0 になります。
string unit_serial = "something"; // The same known existing value
SqlCommand comm = new SqlCommand("sp_IsUnitPackaged");
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.Add(new SqlParameter("@Serial", SqlDbType.VarChar)
{
Value = unit_serial,
Direction = ParameterDirection.Input,
Size = 20
});
int result = 0;
using (SqlConnection conn = Utils.CONN)
{
conn.Open();
using (comm)
{
comm.Connection = conn;
Int32.TryParse(comm.ExecuteScalar().ToString(), out result);
}
}
これと非常によく似た質問が他にもいくつか見られました。私が見つけた最良の答えは、ストアドプロシージャRETURN
をExecuteScalar
. ご覧のとおり、私はそうではありません。
それで、私はここで何が欠けていますか?
RETURN 0
更新: SSMSで実行したときに結果が1つしかないように、手順の最後にステートメントを追加しようとしました:
CREATE PROCEDURE [dbo].[sp_IsUnitPackaged]
@Serial varchar(20)
AS
BEGIN
SET NOCOUNT ON
SELECT COUNT(serial_number)
FROM dbo.t_pql_contents
WHERE serial_number = @Serial
RETURN 0
END
GO
これを SSMS で実行すると、次の結果のみが得られます。
(No column name)
1
ただし、この手順の更新により、引き続きアプリで 0 のスカラー結果が得られます。