C#でExecuteNonQueryを実装しようとしています。 SQLで実行すると、storedProcedure自体が正常に動作しています。 SubmissionIdのGUIDとSubmitSequenceのテキスト「submit sequence」を返します。しかし、.NETで、それはSubmitSequenceexecutenonqueryから切り捨てられた出力パラメータ
ALTER PROC [dbo].[test_SP]
(
@FormId uniqueidentifier,
@FormCode varchar(10),
@FormTitle nvarchar(200),
@User nvarchar(50),
@Url nvarchar(255) = NULL,
@Host nvarchar(50),
@RemoteHost nvarchar(50) = NULL,
@UserAgent nvarchar(255) = NULL,
@Referrer nvarchar(255) = NULL,
@SubmissionId uniqueidentifier out,
@SubmitSequence varchar(30) out
) AS
BEGIN
SET @SubmissionId = newid();
set @SubmitSequence = 'submit sequence'
-- INSERT Query
SELECT
@SubmissionId as SubmissionId, @SubmitSequence as SubmitSequence
END
のための出力として一つの文字を返すだが.NETで、私は(正しい)SubmissionIdためのGUIDとテキスト「S」SubmitSequenceのために取得しています。
public SubmissionHeaderDTO GetRefNo()
{
var inPrms = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase)
{
{"FormId", Guid.NewGuid()},
{"FormCode", "TST"},
{"FormTitle", "Test form"},
{"User", "test"},
{"Host", "iisserver"}
};
var outPrms = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase) {
{ "SubmissionId", Guid.NewGuid() },
{ "SubmitSequence", "two"}
};
var result = DBHelper.ExecSP(Constants.SPNames.SubmissionHeaderInsert, inPrms, outPrms);
SubmissionHeaderDTO refNo = DictionaryToObject<SubmissionHeaderDTO>(result);
return refNo;
}
DBHelper.cs
public static Dictionary<string, object> ExecSP(string sp, Dictionary<string, object> paramIn, Dictionary<string, object> paramOut)
{
var dbAccess = new DBAccess();
var results = dbAccess.ExecuteQuery(sp, paramIn, paramOut);
return results;
}
DBAccess.cs
public class DBAccess
{
public Dictionary<string, object> ExecuteQuery(string storedProcedure, Dictionary<string, object> parameters,
Dictionary<string, object> outParameters)
{
using (var sqlConn = new SqlConnection(Configuration.DBConnection))
{
sqlConn.Open();
using(var transaction = sqlConn.BeginTransaction("Results"))
{
using(var sqlcmd = new SqlCommand(storedProcedure, sqlConn, transaction))
{
sqlcmd.CommandType = CommandType.StoredProcedure;
foreach(var kv in parameters)
{
sqlcmd.Parameters.AddWithValue(kv.Key, kv.Value);
}
foreach(var kv in outParameters)
{
sqlcmd.Parameters.AddWithValue(kv.Key, kv.Value).Direction = ParameterDirection.Output;
}
try
{
sqlcmd.ExecuteNonQuery();
var result = GetOutputParameters(sqlcmd.Parameters);
transaction.Commit();
return result;
}
catch(Exception)
{
transaction.Rollback();
throw;
}
}
}
}
}
private Dictionary<string, object> GetOutputParameters(SqlParameterCollection paramCollection)
{
var returnParameters = new Dictionary<string, object>();
foreach (SqlParameter par in paramCollection)
{
if ((par.Direction == ParameterDirection.Output) || (par.Direction == ParameterDirection.ReturnValue))
{
returnParameters.Add(par.ParameterName, par.Value);
}
}
return returnParameters;
}
}
出力paramsをプロシージャの結果セットの一部であるために仮定されていない - あなたがすべきではない 'SELECT'ingそれら。 'SET'文はそのままにしておき、' SELECT'文を削除して違いがあるかどうか確認してください。 – Crowcoder
いいえ、違いはありませんでした。私はちょうどSETステートメントを残しました。 Submission Sequenceの出力パラメータ値は、最初の文字にすぎません。 – Rama