PDA

View Full Version : سوال: خطا در درج گروهی رکورد ها



mohamadlvs
چهارشنبه 21 تیر 1391, 11:45 صبح
سلام
برا درج چند رکورد در یک جدول آن را در یک حلقه گذاشتم ولی اگر تعداد رکوردها(r>2) بیشتر از یکی باشه خطا میده.
متن خطا:

Error:The variable name '@BuyID' has already been declared. Variable names must be unique within a query batch or stored procedure.


کد:
SqlConnection con = new SqlConnection(ObjGeneral.CN);
SqlCommand com;
SqlTransaction tran;
con.Open();
com.Connection = con;
tran = con.BeginTransaction();
com.Transaction = tran;
for (int i = 0; i < r; i++)
{
com.CommandText = "Insert into DetailSales(SaleID,ProductID,Quantity,Weight)value s(@SaleID,@ProductID,@Quantity,@Weight)";
com.Parameters.Add(new SqlParameter("@SaleID", SaleCode));
com.Parameters.Add(new SqlParameter("@ProductID", productid));
com.Parameters.Add(new SqlParameter("@Quantity", Convert.ToInt16(nudNumberSale.Value)));
com.Parameters.Add(new SqlParameter("@Weight", Convert.ToDouble(txtWeightSale.Text)));
com.ExecuteNonQuery(); //Error
}
tran.Commit();
con.Close();

tooraj_azizi_1035
چهارشنبه 21 تیر 1391, 12:01 عصر
سلام
شما می خوای هر پارامتر رو به تعداد r مرتبه تعریف کنی!

برای درج چندین رکورد ابتدا همه رکوردها رو در جدول درج می کنی:


DataRow workRow; for (int i = 0; i <= 9; i++)
{ workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}


بعد یکبار متد TableAdapter.Update رو صدا می زنی.

// Save the updated row to the database.
this.regionTableAdapter.Update(this.northwindDataS et.Region);

mohamadlvs
چهارشنبه 21 تیر 1391, 13:35 عصر
کد رو اینطور تغییر دادم اما باز هم به مشکل برخوردم (خطا را مشاهده کنید)
SqlDataAdapter da = new SqlDataAdapter("Select BuyID,ProductID,Quantity,Weight,Price from DetailBuy", con);
DataSet ds = new DataSet();
da.Fill(ds, "Group");
DataTable dt = ds.Tables["Group"];

//تراکنش
SqlTransaction tran;
con.Open();
com.Connection = con;
tran = con.BeginTransaction();
com.Transaction = tran;


for (int i = 0; i < r; i++)
{
DataRow datarow = dt.NewRow();
datarow["BuyID"] = BuyCode;
datarow["ProductID"] = productid;
datarow["Quantity"] = Convert.ToInt16(grdPreview.Rows[i].Cells["Quantity"].Value);
datarow["Weight"] = Convert.ToDouble(grdPreview.Rows[i].Cells["Weight"].Value);
datarow["Price"] = Convert.ToInt32(lblPriceQuick.Text);
}
}
SqlCommandBuilder builder = new SqlCommandBuilder(da);
da.Update(ds, "Group"); //Error: ExecuteReader requires the command to have a transaction when the connection assigned
//Error: to the command is in a pending local transaction. The Transaction property of the command has not been initialized.
tran.Commit();
con.Close();

در داخل حلقه یک کوئری درج دیگر نیز دارم که فقط یک بار انجام می شود و از sqlcommand استفاده کرده ام . العان چطوری باید از این درج همگانی که با sqldataAdapter انجام شده باید commit بگیرم.

Mahmoud.Afrad
چهارشنبه 21 تیر 1391, 21:23 عصر
for (int i = 0; i < r; i++)
{
com.CommandText = "Insert into DetailSales(SaleID,ProductID,Quantity,Weight)value s(@SaleID,@ProductID,@Quantity,@Weight)";
com.Parameters.AddWithValue("@SaleID", SaleCode);
com.Parameters.AddWithValue("@ProductID", productid);
com.Parameters.AddWithValue("@Quantity", Convert.ToInt16(nudNumberSale.Value));
com.Parameters.AddWithValue("@Weight", Convert.ToDouble(txtWeightSale.Text));
com.ExecuteNonQuery(); //Error
com.Parameters.Clear();
}

mohamadlvs
چهارشنبه 21 تیر 1391, 21:43 عصر
نیازی به تعریف دوباره پارامتر نیست.
این دیگه چیه! من توی پست اول همین طور نوشته بودم که به مشکل برخوردم . فک کنم اگه چند پست بالاتر رو ببیندی متوجه می شید
این رو
کد رو اینطور تغییر دادم اما باز هم به مشکل برخوردم (خطا را مشاهده کنید) خطا رو هم داخل کدها گذشتم العان مشکل من این خطاست

mohamadlvs
پنج شنبه 22 تیر 1391, 12:02 عصر
نمی دونم چرا کسی جواب نداد؟!
ولی خطا با چند دستور زیر حذف شد :

da.SelectCommand.Transaction = tran;
da.SelectCommand.Transaction = tran;