PDA

View Full Version : سوال: عدم ثبت اطلاعات در Visual Studio 2008 با بانک SQL Server



aminghaderi
سه شنبه 15 دی 1388, 18:51 عصر
با سلام و درود خدمت اسادید محترم و دوستان گرامی
مشکل پیش امده مربوط می شه به ثبت اطلاعات در جدول اسکیو ال.
زبان برنامه نویسم C#‎‎ هست و بانک اطلاعاتم هم SQLServer 2000 هستش که البته با 2005 هم همین مشکل رو دارم.
زمانی که دستور Insert برای SQL از طریق کدی که در VS2008 نوشتم ارسال می کنم ، SQL دستور رو 2 بار انجام می دهد ، یعنی دوبار عمل ثبت اطلاعات صورت می گیرد.
تمامی متود های PostBack هم False هستند ، اما دلیل این ثبت مجدد رو متوجه نشدم؟؟!!
ممنون می شم اگه در حل این مشکل راهنماییم کنید.
ناگفته نماند که من از این کدی که می نویسم به کرات در VS2005 با بانک SQL2005 هم وب و هم ویندوز استفاده کردم و جواب گرفتم.

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

public partial class Image_Theme_Default : System.Web.UI.Page
{
//===============Sql Variable================
SqlConnection cnn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sda = new SqlDataAdapter();
DataSet ds = new DataSet();
DataRow dr;
//===========================================
String Commandtext = "";
int Total;
int i;
protected void connect()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = "Data Source=.;Initial Catalog=T1;Integrated Security=True";
cmd.Connection = cnn;
cmd.CommandText = Commandtext;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "Amin");
cmd.ExecuteReader();
cnn.Close();
}
protected void connect_reg()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = "Data Source=.;Initial Catalog=Amin;Integrated Security=True";
cmd.CommandText = Commandtext;
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "Amin");
cmd.ExecuteNonQuery();
cnn.Close();
}

protected void Button1_Click(object sender, EventArgs e)
{
cmd.Parameters.Clear();
cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = TextBox1.Text;
cmd.Parameters.Add("@Family", SqlDbType.NVarChar).Value = TextBox2.Text;
Commandtext = "insert into T1 (Name,Family)Values(@Name,@Family)";
connect_reg();
}
}

aminghaderi
پنج شنبه 01 بهمن 1388, 03:24 صبح
مثل اینکه این مشکل ما حل شدنی نیست؟؟؟!!!:افسرده:
بعد می گن دات نت رو ول نکنید!!!:عصبانی++:

daffy_duck376
پنج شنبه 01 بهمن 1388, 08:07 صبح
چیز غیر عادی به نظر نمیاد اما یه سوال شما چرا از از dataset استفاده نمی کنی تا به جای این همه کد با 2 خط کد سروته کار هم بیاد ؟
یه نمونه کد واست میگذارم اگه خواستی استفاده کن . این روش شما به علت اینکه همه چیز رو برنامه نویس مینویسه میتونه دارای خطا باشه و تا اونجا که من میدونم این روش تا vs2003 ازش استفاده میشد از vs2005 به بعد dataset به صورت ویژوال به vs اضافه شد و دیگه بهتره از اون استفاده بشه .(البته نظر شخصی بنده هست )

jingiliboyz
پنج شنبه 01 بهمن 1388, 08:57 صبح
مرسی از سورسی که گذاشتید من میخواستم بپرسم چطور فلش گوشه منو رو به سمت چپ انتقال دادید چون منو برای زبان انگلیسی طراحی شده ولی شما اونو به فارسی تبدیل کردید منظورم اینه که با اینکه به سمت چپ باز میشه فلش نشان دهنده به سمت چپ اشاره داره برای دقیق نشان دادنش عکسش رو براتون میزارم

daffy_duck376
پنج شنبه 01 بهمن 1388, 10:47 صبح
خوب من در واقع اونو انتقال ندادم :قهقهه: اون فقط یه عکسه که در قسمت image url اون آیتم از منو گذاشتم و dir v, مساور rlt کردم همین

aminghaderi
یک شنبه 04 بهمن 1388, 06:28 صبح
ممنونم ازت daffy_duck376 (http://barnamenevis.org/forum/member.php?u=28691) جان:لبخندساده:.
ولی یه بحثی که هست من برنامه هام رو تحت کد می نویسم و هیچ وقت راضی نمی شم برنامه ام با ویزارد ساخته شده باشه و یا حتی یه پروسه بدون اطلاع من داخل برنامه لود بشه یا اینکه ندونم کار اون کد دقیقا چی هستش ، دلیل هم دارم چون من تا ندونم پروسه دقیقا چه کار می کنه نمی تونم یه الگریتم بهینه داشته باشم و همچنین استفاده از ویزارد ها و عملیاتی شبیه به انها دست برنامه نویس رو در طراحی پروسه های سنگین و پیچیده می بنده . (و البته که این نظر شخصی منه)
من داخل کد بالا از شی ای به نام Dataset استفاده کردم ولی ظاهرا این دیتا ست با دیتاستی که مد نظر شماست فرق می کرد برای همین برنامه رو دانلود کردم (بابت قرار دادن کد بسیار ممنونم) و کامل کد ها رو دیدم ولی من تا به حال با این کد کار نکردم ، ممنون می شم در باره این کد یه توضیح کاملی بدین.
DataSet1TableAdapters.simanTableAdapter siman = new DataSet1TableAdapters.simanTableAdapter();

و یه خواهشی از دوستان دیگر که بزرگواری کنند بحث رو به بی راهه نکشند تا به نتیجه برسه.:لبخندساده:

و یه خواهش دیگه که دوستان صاحب نظر هم در حل این مشکل مشارکت کنند تا بلکه ایراد مشخص شه؟!:افسرده:

با تشکر

corona
یک شنبه 04 بهمن 1388, 10:01 صبح
aminghaderi زعزیز کاملا واضحه چرا داره دویار توی بانک شما اطلاعات درج میشه. ایم سبک کد نویسی برای درج اطلاعات توی db رو نمیدونم چجوری یاد گرفتی . ببین دوست من وقتی قراره یک رکورد توی دیتابیس درج کنی دیگه هیچ نیازی به SqlDataAdapter و Dataset اینا نداری دوست من . کافیه مستقیم دستور رو اجرا کنی. وقتی میایم از sqldataadapter , dataset,datatable اینا استفاده می کنیم که بخوایم اطلاعاتی رو از db بگیریم ، به یک کنترل توی برناممون بایندش کنیم و کارهایی مشابه . دلیل اینکه الان داره دوبار رکورد درج میشه توی برنامه شما این خط هستش


sda.Fill(ds, "Amin");
cmd.ExecuteNonQuery();



یک بار متد Fill کوئری شما رو اجرا میکنه و یک بار هم خودت باز میای Executenonquery میکنی. اگه به ماهیت دستوری که میخوای اجرا کنی نگاه کنی میبینی که دستور insert رو ایجاد می کنی ، پس چه معنی داره که اومدی تو کد نوشتی sda.SelectCommand = cmd; شما داری به خاصیت Selectcommand از data adapter یک دستور insert رو انتساب میدی که خوب مسلما کار اشتباهی هستش . شما دوست من فقط از cmd.executenonquery استفاده کن و اصلا نیازی به dataadapter , dataset اینا برای اینکه رکوردت رو توی بانک درج کنی نداری . موفق باشی .

daffy_duck376
یک شنبه 04 بهمن 1388, 20:41 عصر
ببین دوست عزیز dataset یه کلاسه . حال برای اونکه از توابعیکه در داخل اون تعریف شده استفاده کنیم باید از اون کلاس یه دونه توی فرمت تعریف کنی و بعد از توابعی که توی اون تعریف شده استفاده کنی . اون کدی که میبینی من یه متغیر از جنس اون dataset تعریف کردم تا بتونم به توابعی که توی اوت تعریف شده استفاده کنم. اما در مورد نظر دوست عزیمون corona (البته نظر من شخصی است ) من کاملا مخالف هستم . بهتر تمامی کارهایی رو که ما با دیتا بیس انجام میدیم از طریق این dataset بشه . به چند علت 1- خطا در کد نویسی را به صفر میرسونه چون کارهای سختشو خودش داره انجام میده . بهتره برنامه نویس وقتشو برای گرفتن باگ های برنامه بکنه تا اینکه حفظ کنه دستور insert رو دقیقا چطور مینویسن. چون نیازی نیست . 2- ما ممکن است از یه تابع در چند جا استفاده کنیم . اون وقت باید این دستورات رو 100 جا تعریف کنیمکه از نظر بنامه نیسی کار درستی نیست. 3- دیگر نیازی به اینکه کنترل کنیم به چه پارامتری چه نوع دیتا تایپی پاس میدیم نیست . چون به غیر از نوع اصلی دیتا تایپ دیگه رو قبول نمی کنه ولی در روش کدنویسی ....... البته باز هم میگم این نظر شخصی بنده میاشد و من مخلص جناب corona هم هستم. در مورد ویزارد ها هم خدمت شما بگم هیچ محدودیتی به شما اعمال نمی کنه و اتفاقا در یه کد نویسی پیچیده کلی بهت کمک میکنه . فقط یه محدودیت داره اینکه نمی گذاره کدهای اشتباه رو تئ سیستم ذخیره کنی همین!

corona
دوشنبه 05 بهمن 1388, 01:08 صبح
daffy_duck376 عزیز ، من به هیچ عنوان از ابراز نظر کسی در مورد حرفی که می زنم ناراحت نمیشم. نمی دونم شما با کدوم قسمت حرف من مخالف هستی که نوشتی کاملا مخالفم . من خودم به شخصه هیچ وقت از ویزارد استفاده نکردم و نخواهم کرد ، من به هیچ عنوان منکر اینکه dataset یک کلاس هستس یا اینکه خیلی بدرد بخور هستش نشدم ، من برای این سناریوی دوستمون توضیحات بالا رو نوشتم . مورد های کاربرد دیتا ست کاملا واضح هستش . من تا حالا هیچ جا ندیدم کسی برای درج یک رکورد توی دیتابیس بیاداز dataset استفاده کنه .در ضمن نظری هم که تو پست قبلیم دادم روی کد دوستمون بود که سوال کرده بودن و اصلا کدی که شما گذاشته بودین رو ندیدم که بخوام راجع بهش نظری بدم . در ضمن دوست من راجع به این قسمت از پست قبلیت که گفتی بهتر تمامی کارهایی رو که ما با دیتا بیس انجام میدیم از طریق این dataset بشه خوب فکر کن ، چون مطمئنن اینجور که شما میگی نیست دوست من ، حتما میدونی که دیتاست همه رکورد ها رو با هم توی حافظه وقتی Fetch میشن نگه میداره و اگه به قول شما بهترین باشه پس دیگه میشه بگی چه نیازی به SqlDataReader میشه ؟

aminghaderi
سه شنبه 06 بهمن 1388, 02:54 صبح
از daffy_duck376 (http://barnamenevis.org/forum/member.php?u=28691) و corona (http://barnamenevis.org/forum/member.php?u=38135) عزیزم بابت راهنمایشان خیلی خیلی ممنونم.
من یه خصومت شخصی با ویزارد ها و اکثر کامپوننت ها دارم (نه کامپوننت هایی که خودم می نویسم ، اونا فرق می کنه؟!:لبخند:) که تاریخچه این خصومت طولانیه و از جایی شروع شد که قرار بود یه فیلد دیتابیس رو که پایگاهش فکر کنم اسکیوال یا شایدم اکسس بود رو داخل یه تکس باکس نمایش بدم که این کار قرار بود با ویزار انجام بشه که پدرم در اومد و انجام نشد و... چندین مورد دیگه.
اما ناگفته نماند که ویزارد ها جایگاه خودشون رو در بحث سرعت برنامه نویسی و نشان دادن عملکرد کلی برنامه و ... دارند.
-------------------------------
daffy_duck376 (http://barnamenevis.org/forum/member.php?u=28691) جان بابت توضیح کاملی که دادی ممنونم.
---------------------------------
corona (http://barnamenevis.org/forum/member.php?u=38135) جان ازت ممنونم ، متوجه اشکال کار شدم ولی این موضوع رو هنوز نتونستم برسی کنم.
درسته عملا 2 بار داره دستور اینزرت انجام می شه ولی نکته ای که خیلی جالبه اینه که این کد با vs2005 هیچ مشکلی نداره و به خاطر همین من اصلا فکر اینکه شاید کد مشکلی داشته باشه رو نکرده بودم؟!
corona (http://barnamenevis.org/forum/member.php?u=38135) جان ، اگه کد بهینه شده ای برای ارتباط با دیتابیس داری ، ممنون می شم اون کد رو اینجا قرار بدی تا از این به بعد از این کد استفاده کنیم.