مشکل با کلاس SqlCommandbuilder

csharp2015

New Member
سلام دوستان
به کد زیر توجه کنید :
کد:
private void button1_Click(object sender, EventArgs e)
{
    SqlConnection connection = new SqlConnection();
    connection.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;"
                                + @"AttachDbFilename=|DataDirectory|\University.mdf;  "
                                + "Integrated Security=True;"
                                + "Connect Timeout=30";
    SqlCommand command = new SqlCommand();                      
    command.CommandText = "SELECT * FROM Students";
    command.Connection = connection;
            
    DataSet dataset = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = command;
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    adapter.Fill(dataset, "Students");
    DataRow row = dataset.Tables["Students"].NewRow();
    row["FirstName"] = firstNameTextBox.Text;
    row["LastName"]  = lastNameTextBox.Text;
    row["Gender"]    = genderTextBox.Text;
    row["Age"]       = Int32.Parse(ageTextBox.Text);
    row["Address"]   = addressTextBox.Text;
    dataset.Tables["Students"].Rows.Add(row);
    try
    {
        int result = adapter.Update(dataset, "Students");
        if (result > 0)
            MessageBox.Show("Success!");
        else
            MessageBox.Show("Failed!");
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
}
کد بالا مربوط به اضافه کردن یک رکورد به بانک اطلاعاتی هس و درست کار می کنه. مشکل من اینه که دقیقا کاربرد کلاس SqlCommandbuilder رو متوجه نشدم. جایی خوندم که این کلاس به طور خودکار دستوارت ثبت و حذف و ویرایش رو تولید میکنه. حالا سوال بنده در باره کد بالا :
این شیء adapter حامل چیه؟ یعنی چی داخلشه که به کلاس builder پاس داده شده؟ کلاس builder از این شیء چه استفاده ای می کنه؟ کلا کلاس builder چطور میفهمه که باید چه دستوری تولید کنه؟ آیا رویدادی چیزی رخ میده؟
 

the_king

مدیرکل انجمن
سلام دوستان
به کد زیر توجه کنید :
کد:
private void button1_Click(object sender, EventArgs e)
{
    SqlConnection connection = new SqlConnection();
    connection.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;"
                                + @"AttachDbFilename=|DataDirectory|\University.mdf;  "
                                + "Integrated Security=True;"
                                + "Connect Timeout=30";
    SqlCommand command = new SqlCommand();                     
    command.CommandText = "SELECT * FROM Students";
    command.Connection = connection;
           
    DataSet dataset = new DataSet();
    SqlDataAdapter adapter = new SqlDataAdapter();
    adapter.SelectCommand = command;
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
    adapter.Fill(dataset, "Students");
    DataRow row = dataset.Tables["Students"].NewRow();
    row["FirstName"] = firstNameTextBox.Text;
    row["LastName"]  = lastNameTextBox.Text;
    row["Gender"]    = genderTextBox.Text;
    row["Age"]       = Int32.Parse(ageTextBox.Text);
    row["Address"]   = addressTextBox.Text;
    dataset.Tables["Students"].Rows.Add(row);
    try
    {
        int result = adapter.Update(dataset, "Students");
        if (result > 0)
            MessageBox.Show("Success!");
        else
            MessageBox.Show("Failed!");
    }
    catch (SqlException ex)
    {
        MessageBox.Show(ex.Message);
    }
}
کد بالا مربوط به اضافه کردن یک رکورد به بانک اطلاعاتی هس و درست کار می کنه. مشکل من اینه که دقیقا کاربرد کلاس SqlCommandbuilder رو متوجه نشدم. جایی خوندم که این کلاس به طور خودکار دستوارت ثبت و حذف و ویرایش رو تولید میکنه. حالا سوال بنده در باره کد بالا :
این شیء adapter حامل چیه؟ یعنی چی داخلشه که به کلاس builder پاس داده شده؟ کلاس builder از این شیء چه استفاده ای می کنه؟ کلا کلاس builder چطور میفهمه که باید چه دستوری تولید کنه؟ آیا رویدادی چیزی رخ میده؟
اون adapter که از نوع SqlDataAdapter است مجموعه فرمان های Select و Update و Insert و Delete رو با Connection در کنار هم داره و این امکان رو بهتون میده که بین DataSet تون و پایگاه داده ارتباط برقرار بشه.
هر کدوم از این اجزاء به تنهایی کارکرد خودشون رو دارند ولی این تجمع شون در SqlDataAdapter ئه که ارتباط بین DataSet و پایگاه داده رو آسون می کنه.
زمانی که سطری توسط SqlDataAdapter آپدیت میشه ابتدا رخداد RowUpdating رخ میده که این دقیقا همون رخدادی است که SqlCommandBuilder منتظرشه و بهش روتین متصل کرده. وقتی RowUpdating رخ داد، SqlCommandBuilder وارد عمل میشه. در حالت عادی و بدون وجود SqlCommandBuilder شما باید برای فرمان های Select و Update و Insert و Delete مقادیر مشخصی نوشته باشید وگرنه مقداری ندارند.
فرضا اگر شما بخواهید با SqlCommandBuilder فرمان Update رو اجرا کنید باید قبلا مقدار دهی اش کرده باشید وگرنه با خطا متوقف میشه.
SqlCommandBuilder این قابلیت رو داره که بر اساس Select ای که باید حتما مقدار دهی شده باشه فرمان های Update و Insert و Delete رو ایجاد کنه و شما رو از نوشتن شون بی نیاز کنه.
در این میان رخداد RowUpdating پل ارتباطی بین SqlDataAdapter و SqlCommandBuilder است.
 

csharp2015

New Member
بسیار ممنون بابت توضیحاتتون، فقط دو سوال،
1- آیا این شیء adapter که به سازنده کلاس SqlCommandBuilder پاس داده شده حاوی Datatable ی که یه سطر بهش اضافه شده ؟
2- آیا رویداد RowUpdating بعد از فراخوانی متد Update اتفاق میوفته؟
3 - دستورات SqlCommandBuilder بر روی بانک اصلی اجرا میشن یا فراخوانی متد Update باعث بروزرسانی نهایی بانک میشه؟
 

the_king

مدیرکل انجمن
بسیار ممنون بابت توضیحاتتون، فقط دو سوال،
1- آیا این شیء adapter که به سازنده کلاس SqlCommandBuilder پاس داده شده حاوی Datatable ی که یه سطر بهش اضافه شده ؟
نه، SqlDataAdapter شامل داده نیست، وظیفه اش اینه که فقط ارتباط رو برقرار می کنه که فرضا اون DataTable رو با داده پر کنید یا ویرایش اش رو در پایگاه داده اعمال کنید،
خودش یک فیلد داده رو هم نگه نمی داره، چه برسه به یک DataTable. اون چیزی که شامل DataTable ئه DataSet ئه.
2- آیا رویداد RowUpdating بعد از فراخوانی متد Update اتفاق میوفته؟
3 - دستورات SqlCommandBuilder بر روی بانک اصلی اجرا میشن یا فراخوانی متد Update باعث بروزرسانی نهایی بانک میشه؟
درست در ابتدای متد Update، قبل از اینکه بخواد تغییری رخ بده. برعکس RowUpdated که بعد اتمام متد Update رخ میده.
SqlCommandBuilder فقط دستور رو میسازه خودش هیچ دخالتی در اجرا شدن هیچ دستوری نداره
 

جدیدترین ارسال ها

بالا