PDA

View Full Version : سوال: استفاده از transaction در تابعی که قرار است یک مقدار برگرداند به چه صورت است؟



hastiam
شنبه 06 خرداد 1391, 16:49 عصر
سلام
من یک تابعی دارم که عمل Insert را انجام میدهد می خواهم بعد از اینکه یک رکورد ثبت کرد ID آن رکورد را برگرداند یعنی دارم :

return id

حالا وقتی از Transaction استفاده می کنم error زیر را می دهد:

. not all code paths return a value


مشکل از کجاست؟ آیا نمی توان از transaction در مواقعی که قرار است یک مقداری return شود استفاده کرد؟:متعجب:

amir3321
دوشنبه 08 خرداد 1391, 17:38 عصر
بهتر که نمونه تابع رو اینجا قرار بدهی تا هر کسی خواست کمک کنه با دیدن تابع مشکل رو متوجه بشه
نه این مشکل ربطی به Transaction نداره

hastiam
سه شنبه 09 خرداد 1391, 09:43 صبح
بهتر که نمونه تابع رو اینجا قرار بدهی تا هر کسی خواست کمک کنه با دیدن تابع مشکل رو متوجه بشه

این هم تابعی که من نوشتم بدون transaction کار می کنه اما وقتی از transation استفاده می کنم error میده:



public static int Insert(string Name)
{
string connString = ConfigurationManager.ConnectionStrings["DbContext"].ConnectionString;
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction transaction;
transaction = conn.BeginTransaction();
cmd.Transaction = transaction;
cmd.CommandText = "Insert into dbo.TblMeasurementUnit (Name) Values (@name)";
cmd.Parameters.AddWithValue("@name", Name);

try
{
conn.Open();
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.CommandText = "SELECT @@IDENTITY";
transaction.Commit();
// Get the last inserted id.
int id = Convert.ToInt32(cmd.ExecuteScalar());
return id;
}
catch (Exception ex)
{
transaction.Rollback();
}
finally
{
conn.Close();
}
}

mohamad.zakery
پنج شنبه 11 خرداد 1391, 00:11 صبح
try
{
conn.Open();
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.CommandText = "SELECT @@IDENTITY";
transaction.Commit();
// Get the last inserted id.
int id = Convert.ToInt32(cmd.ExecuteScalar());
return id;
}
catch (Exception ex)
{
transaction.Rollback();
}
finally
{
conn.Close();
}



مشكل در قسمت catch و فاينالي است!!!

اگر در زمان اجرا برنامه در صورت بروز خطا برنامه به اين قسمت بره، مقداري براي خروجي تابع مشخص نكرديد!!!

mahdi.bagheri
جمعه 12 خرداد 1391, 22:47 عصر
سلام دوست عزیز
این دوستمون درست گفتن، کد زیر باید مشکل شما رو حل کنه:


public static int Insert(string Name)
{
string connString = ConfigurationManager.ConnectionStrings["DbContext"].ConnectionString;
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
SqlTransaction transaction;
transaction = conn.BeginTransaction();
cmd.Transaction = transaction;
cmd.CommandText = "Insert into dbo.TblMeasurementUnit (Name) Values (@name)";
cmd.Parameters.AddWithValue("@name", Name);
int id = 0;

try
{
conn.Open();
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
cmd.CommandText = "SELECT @@IDENTITY";
transaction.Commit();
// Get the last inserted id.
id = Convert.ToInt32(cmd.ExecuteScalar());
}
catch (Exception ex)
{
transaction.Rollback();
id = 0;
}
finally
{
conn.Close();
id = 0;
}
return id;
}


بعد تو کدت غیر صفر بودن بازگشت رو چک می کنی.