Ich versuche, ExecuteNonQuery in C# zu implementieren. Die gespeicherte Prozedur selbst funktioniert einwandfrei, wenn ich in SQL ausführe. Es gibt eine GUID für SubmissionId und den Text 'submit sequence' für SubmitSequence zurück. Aber in .net, es ist ein Zeichen der Rückkehr als Ausgang für SubmitSequencegekürzter Ausgabeparameter von exuctenonquery
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
Aber in der .net, erhalte ich die GUID für SubmissionId (was richtig ist) und der Text ‚s‘ für 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;
}
}
Output params nicht Teil des Verfahrens der Ergebnismenge sein sollen - Sie sollten nicht 'SELECT'ing Sie. Behalten Sie die SET-Anweisungen bei, entfernen Sie aber die SELECT-Anweisung und sehen Sie, ob dies einen Unterschied macht. – Crowcoder
Nein, es machte keinen Unterschied. Ich habe gerade die SET-Anweisungen verlassen. Der Ausgabeparameterwert für die Übermittlungssequenz ist nur das erste Zeichen. – Rama