出力パラメータを使用してデータベースから値を取得しています。
これは私のストアドプロシージャです:
ALTER PROCEDURE [dbo].[sp_GetCustomerMainData]
-- Add the parameters for the stored procedure here
@Reference nvarchar(100),
@SubscriptionPIN nvarchar(100) OUTPUT,
@SignupDate nvarchar(100) OUTPUT,
@ProductCount int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET @SubscriptionPIN = 'N/A'
SET @SignupDate = 'N/A'
SET @ProductCount = 0
-- Insert statements for procedure here
IF EXISTS(SELECT [SubscriptionPIN] FROM [Norton].[dbo].[Customers] WHERE [Reference] = @Reference)
BEGIN
SELECT TOP 1 @SubscriptionPIN = [SubscriptionPIN], @SignupDate = SignUpDate FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference
SET @ProductCount = (SELECT COUNT(*) FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference)
END
RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)
END
最後のリターンについてはわかりません:
RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)
反対側の c# コードは次のとおりです。
using (SqlConnection con = new SqlConnection(connectionInfo))
{
using (SqlCommand cmd = new SqlCommand("sp_GetCustomerMainData", con) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.Add("@Reference", SqlDbType.NVarChar).Value = CustomerReferenceID;
SqlParameter SubscriptionPIN = new SqlParameter("@TheCustomerID", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SubscriptionPIN);
SqlParameter SignupDate = new SqlParameter("@SignupDate", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SignupDate);
SqlParameter ProductCount = new SqlParameter("@ProductCount", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(ProductCount);
con.Open();
try
{
cmd.ExecuteNonQuery();
if (cmd.Parameters["@TheCustomerID"].Value.ToString() != "N/A")
{
aStatus.SubscriptionPIN = cmd.Parameters["@TheCustomerID"].Value.ToString();
aStatus.SignupDate = cmd.Parameters["@SignupDate"].Value.ToString();
aStatus.ProductCount = int.Parse(cmd.Parameters["@ProductCount"].Value.ToString());
aStatus.Result = "0: Reference ID Found";
}
else
{
aStatus.Result = "1: Reference ID does not exists";
return aStatus;
}
}
catch (SqlException sqlExc)
{
foreach (SqlError error in sqlExc.Errors)
{
aStatus.Result = string.Format("{0}: {1}", error.Number, error.Message);
return aStatus;
}
}
}
}
このコードを実行すると、次のエラーが発生します。
System.InvalidOperationException: String[1]: Size プロパティのサイズが無効
です
。 Int32 startCount、Boolean inSchema、SqlParameterCollection パラメーター)
System.Data.SqlClient.SqlCommand.BuildRPC (Boolean inSchema、SqlParameterCollection パラメーター、_SqlRPC& rpc)
で System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior run、Boolean returnBehavior、Boolean非同期)
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior、RunBehavior runBehavior、ブール型 returnStream、String メソッド、DbAsyncResult 結果) で
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult 結果、文字列 methodName、ブール型 sendToPipe)
で System.Data.SqlClient.SqlCommand.ExecuteNonQuery() で
ストアド プロシージャから多くの出力パラメータを送信する正しい方法がわかりません。誰か助けてください。