ऐसा लगता है कि ExecuteNonQuery
के रिटर्न मान भले ही प्रलेखन स्पष्ट रूप से कहा गया है कि करता है एक रोलबैक से अप्रभावित है। यहां कुछ संभावित कामकाज हैं।
1) का प्रयोग करें ExecuteScalar
सपा:
DECLARE @RowCount INT
DECLARE @Error INT
BEGIN TRAN
UPDATE Table1 SET Value1 = NULL
SELECT @RowCount = @@ROWCOUNT, @Error = @@ERROR
IF @Error <> 0 BEGIN
ROLLBACK TRAN
SELECT -1
END ELSE BEGIN
COMMIT TRAN
SELECT @RowCount
END
सी #
using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True"))
{
dbConnection.Open();
using (SqlCommand command = dbConnection.CreateCommand())
{
command.CommandText = "QuickTest";
command.CommandType = CommandType.StoredProcedure;
rowsAffected = command.ExecuteScalar();
}
}
2) एक वापसी/आउटपुट पैरामीटर का उपयोग
सपा: घोषित @RowCount INT घोषणा @Error INT
BEGIN TRAN
UPDATE Table1 SET Value1 = NULL
SELECT @RowCount = @@ROWCOUNT, @Error = @@ERROR
IF @Error <> 0 BEGIN
ROLLBACK TRAN
RETURN -1
END ELSE BEGIN
COMMIT TRAN
RETURN @RowCount
END
सी #
using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True"))
{
dbConnection.Open();
using (SqlCommand command = dbConnection.CreateCommand())
{
command.Parameters.Add(new SqlParameter() {Direction = ParameterDirection.ReturnValue });
command.CommandText = "QuickTest";
command.CommandType = CommandType.StoredProcedure;
command.ExecuteNonQuery();
rowsAffected = command.Parameters[0].Value;
}
}
3) रोलबैक/ले जाएँ कोड में तर्क प्रतिबद्ध
थी एस आपको यह निर्धारित करने की क्षमता देगा कि क्या रोलबैक हुआ और आवश्यक होने पर -1 का मान आउटपुट करें। लेनदेन विवरण को स्पोक से हटा देना होगा।
सपा:
UPDATE Table1 SET Value1 = NULL
सी #:
using (SqlConnection dbConnection = new SqlConnection("Data Source=.;Initial Catalog=Database1;Integrated Security=True;MultipleActiveResultSets=True"))
{
dbConnection.Open();
using (SqlTransaction tran = dbConnection.BeginTransaction())
{
using (SqlCommand command = dbConnection.CreateCommand())
{
command.Transaction = tran;
try
{
command.Parameters.Add(new SqlParameter() {Direction = ParameterDirection.ReturnValue });
command.CommandText = "QuickTest";
command.CommandType = CommandType.StoredProcedure;
rowsAffected = command.ExecuteNonQuery();
}
catch (Exception)
{
rowsAffected = -1;
throw;
}
tran.Commit();
}
}
}
जैसा कि पहले बताया गया है, @@ ROWCOUNT मूल्य और ExecuteNonQuery परिणाम दोनों चलाता से प्रभावित हैं।
रेस का मूल्य क्या है? "1 पंक्ति (यों) प्रभावित" इस मामले में – Peter
@peer यह प्रभावित पंक्तियों – coffeeyesplease
दिलचस्प बात यह है कि अगर तुम सिर्फ SSMS में इस कोड को चलाने की संख्या 2., आप मिलेगा या इसी तरह की। (या 2, या जो कुछ भी है - लेकिन नहीं 0 भले ही यह वापस लुढ़का है।) समारोह rowcount संदेशों संक्षेप है की तरह – Rawling