حتى نشتغل مع الدوت نت نطلب هذا الكود قبل كل شي using System.Data; using System.Data.SqlClient; لعمل كونيكشن مع الداتا بيز sqlConnection con = new sqlConnection(); وهذا الوبجكت يحتاج لكونكشن سترنغ SqlConnection testConnection = new SqlConnection(); string testConnectionString = "Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI"; testConnection.ConnectionString = testConnectionString; والتطبيق الكامل للكونكشن SqlConnection testConnection = new SqlConnection(); try { testConnection.Open(); if (testConnection.State == ConnectionState.Open) { Console.WriteLine("Successfully opened a connection"); catch (Exception) { if (testConnection.State != ConnectionState.Open) { Console.WriteLine("Failed to open a connection"); } } finally { // Closing a connection ensures connection pooling. if (testConnection.State == ConnectionState.Open) { testConnection.Close(); } testConnection.Dispose(); 1
} عندما تحتاج لعمل كونيكشن بمواصفات خاصة تحددها انت أثناء عمل البرنامج فأنت إذن تتحدث عن كونيكشن سترنغ بيلدر SqlConnectionStringBuilder connstrBuilder = new SqlConnectionStringBuilder(); connstrBuilder.DataSource = "(local)"; connstrBuilder.InitialCatalog = "Test"; connstrBuilder.IntegratedSecurity = true; using (SqlConnection testConnection = new SqlConnection(connstrBuilder.ToString())) { try { testConnection.Open(); if (testConnection.State == ConnectionState.Open) { Console.WriteLine("Connection successfully opened"); Console.WriteLine("Connection string used: " + testConnection.ConnectionString); } } catch (Exception) { if (testConnection.State != ConnectionState.Open) { Console.WriteLine("Connection open failed"); Console.WriteLine("Connection string used: " + testConnection.ConnectionString); } } // Automatic dispose call on conn ensures connection is closed. Console.WriteLine("Press any key to continue .."); Console.Read(); خلل هذي المرحلة تم عمل ارتباط مع الداتا بيز والن نحتاج للكوماند اوبجكت للتعامل مع الداتا بيز وهناك عدة :طرق لنشاء الكوماند اوبجكت وهي // Instantiate Command and specify Connection in two steps SqlCommand testCommand = new SqlCommand(); testCommand.Connection = testConnection; 2
// Instantiate Comamnd and specify Connection in single step SqlCommand testCommand = new SqlCommand("<>", testConnection); // Using CreateCommand method SqlCommand testCommand = testConnection.CreateCommand(); ومن خلل الكوماند اوبجكت يتم تحديد نوع التعامل مع الداتا بيز // Instantiate Command and specify command text in two steps SqlCommand testCommand = new SqlCommand(); testCommand.CommandText = "SELECT COUNT(*) FROM TestDemo"; // Instantiate Command and specify command text in single step SqlCommand testCommand = new SqlCommand("SELECT COUNT(*) FROM TestDemo"); وهناك ميثود عديدة يحوها هذا الوبجكت int numResults = (int) testCommand.ExecuteScalar(); .الميثود هذي ترجع أوبجكت تايب فنسويله كاستينغ على حسب نوع البجكت اللي نبيه انتيغر وهذا مثال يوضح عمل الكوماند اوبجكت string connectionString = "Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI;" using (SqlConnection testConnection = new SqlConnection(connectionString)) { SqlCommand testCommand = new SqlCommand("SELECT COUNT(*) FROM TestDemo",testConnection); testConnection.Open(); int numResults = (int) testCommand.ExecuteScalar(); Console.WriteLine("Total number of rows in TestDemo: " + numResults); testConnection.Close(); } Console.Read(); وهناك ميثود أخرى تستخدم في الديسكونيكتد مودل وترجع داتا ريدر SqlDataReader sqlDr = testCommand.ExecuteReader(CommandBehavior.CloseConnection); 3
: وهذا تطبيق للداتا ريدر يوضح مفهوم للقراءة فقط – للمام فقط وحط في بالك هذا المفهوم العام IDataRecordInstance["MyColumn"]; // Using Column Name IDataRecordInstance[0] ; // Using the column ordinal if (sqlDr.HasRows) { while (sqlDr.Read()) { Console.WriteLine("TestDemo: " + sqlDr.GetInt32(0) + " and Description : " + sqlDr.GetString(1)); } } وهذا مثال آخر يوضح كيفية التعامل مع الداتا ريدر string connectionString = "Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI"; using (SqlConnection testConnection = new SqlConnection(connectionString)) { SqlCommand testCommand = new SqlCommand("SELECT * FROM TESTDEMO", testConnection); testConnection.Open(); SqlDataReader sqlDr = testCommand.ExecuteReader(CommandBehavior.CloseConnection); if (sqlDr.HasRows) { foreach (DbDataRecord rec in sqlDr) { dbRecordsHolder.Add(rec); // dbRecordsHolder is an ArrayList } } } // testConnection.Dispose is called automatically myDataGrid.DataSource = dbRecordsHolder; وهناك ميزة حلوة في الداتا ريدر تستطيع أن تنفذ سلسلة من العمليات داخل كوماند أوبجكت واحد وهذا جزء من مثال يوضح هذي الميزة SqlCommand cmd = new SqlCommand("SELECT * FROM USERBASICINFORMATION" + ";" + 4
"SELECT * FROM PERMISSIONSTABLE", conn); if (sqlDr.HasRows) { do { Console.WriteLine(" "); while (sqlDr.Read()) { Console.WriteLine(sqlDr.GetInt32(0) + " : " + sqlDr.GetString(1)); } } while (sqlDr.NextResult()); } الداتا كولمن يحدد الكولمن ونوعه داخل الداتاتابل // Adding a column using the constructor DataColumn myColumn = new DataColumn("ID", typeof(System.Int32)); // Adding a column using a DataTable productsTable.Columns.Add("ID", Type.GetType("System.Int32")) ; ويمكن بناء داتاتابل وتحديد بنيته من خلل هذا المثال // Create a new DataTable DataTable productsTable = new DataTable("Products") ; // Build the products schema productsTable.Columns.Add("ID", typeof(System.Int32)) ; productsTable.Columns.Add("Name", typeof(System.String)) ; productsTable.Columns.Add("Category", typeof(System.Int32)) ; الحين صار عندنا داتاكولمن وداتاتابل وعلشان نمله بيانات لزم نستخدم داتارو // Create a new DataRow with the same schema as the DataTable DataRow tempRow = productsTable.NewRow() ; tempRow["ID"] = 1 ; tempRow["Name"] = "Caterham Seven de Dion" ; tempRow["Category"] = 1 ; // Add the DataRow to the DataTable productsTable.Rows.Add(tempRow) ; ولتحديد برايمري كي للداتاتابل 5
// Set up the ID column as the primary key productsTable.PrimaryKey = new DataColumn[] { productsTable.Columns["ID"] }; وهذا المثال يوضح ما سبق وزيادة // Create the table DataTable productsTable = new DataTable("Products") ; // Build the Products schema productsTable.Columns.Add("ID", typeof(System.Int32)) ; productsTable.Columns.Add("Name", typeof(System.String)) ; productsTable.Columns.Add("Category", typeof(System.Int32)) ; // Set up the ID column as the primary key productsTable.PrimaryKey = new DataColumn[] { productsTable.Columns["ID"] }; productsTable.Columns["ID"].AutoIncrement = true ; productsTable.Columns["ID"].AutoIncrementSeed = 1 ; productsTable.Columns["ID"].ReadOnly = true ; ويمكن أن تغيير قيمة الكولمن في الداتاتابل productsTable.Rows[0]["Name"] = "Pinto"; داخل الداتاست اذا وجد اكثر من داتاتابل نقدر نحط ريلشن شيب بينهم على الشكل التالي //Create a relation between Customers and Orders. myDataSet.Relations.Add("CustomersToOrders", myDataSet.Tables["Customers"].Columns("CustomerID"], myDataSet.Tables["Orders"].Columns["CustomerID"]) ; أو نقدر نحلل المور اكثر // Create two DataColumns DataColumn parentColumn ; DataColumn childColumn ; // Set the two columns to instances of the parent and child columns parentColumn = myDataSet.Tables["Customers"].Columns["CustomerID"] ; childColumn = myDataSet.Tables["Orders"].Columns["CustomerID"] ; // Create a new DataRelation object DataRelation customersToOrders = New DataRelation("CustomersToOrders", parentColumn, childColumn) ; // Add the DataRelation to the DataSet.Relations collection myDataSet.Relations.Add(customersToOrders) ; 6
وتقدر تستخدم الرى كالتالي // Create arrays of DataColumns for the relevant columns DataColumn[] parentArray = new DataColumn[2]; parentArray[0] = myDataSet.Tables["Employees"].Columns["FirstName"] ; parentArray[1] = myDataSet.Tables["Employees"].Columns["LastName"] ; DataColumn[] childArray = new DataColumn[2]; childArray[0] = myDataSet.Tables["Managers"].Columns["FirstName"] ; childArray[1] = myDataSet.Tables["Managers"].Columns["LastName"] ; DataRelation empToMngr = New DataRelation("EmployeesToManagers", parentArray, childArray) ; myDataSet.Relations.Add(EmpToMngr) ; بالنسبة للديسكونكتد مودل نستخدم الداتا ادابتر وهذا ما يحتاج انك تفتح الداتا بيز او تسكرها كل شي يقوم به هو اتوماتكيلي partial class Form1 : Form { private DataTable userTable; public Form1() { InitializeComponent(); userTable = new DataTable(); } ... } private void buttonFillData_Click(object sender, EventArgs e) { // Never hard code connection strings. // Usually you would get this from a config file string connectionString = "Data Source=(local);Initial Catalog=Test;Integrated Security=SSPI;" ; using (SqlConnection testConnection = new SqlConnection(connectionString)) { SqlCommand testCommand = testConnection.CreateCommand(); testCommand.CommandText = "Select FirstName, LastName from userTable"; SqlDataAdapter dataAdapter = new SqlDataAdapter(testCommand); 7
dataAdapter.Fill(userTable); } // testConnection.Dispose called automatically. private void buttonBind_Click(object sender, EventArgs e) { datagridView.DataSource = userTable; } على مستوى الداتابيز ولكنAS أحيانا تحتاج إلى تغيير أسماء الداتاكولمن في الداتاست ويمكن ذلك باستخدام الدوت نت توفر لك بديل آخر // Define a connection object ... // Create a data adapter object to retrieve records from Db DoDataMappings(usersDataAdapter); // Fill the dataset ... // go through the records and print them using the mapped names private static void DoDataMappings(SqlDataAdapter dataAdapter) { try { // Define an array of columns to map. DataColumnMapping[] mappedColumns = { new DataColumnMapping("ID", "UserID"), new DataColumnMapping("fn", "FirstName"), new DataColumnMapping("ln", "LastName"), new DataColumnMapping("cty", "City"), new DataColumnMapping("st", "State") }; // Define the table containing the mapped columns. DataTableMapping usersTableMapping = new DataTableMapping("Table", _ "tabUsers", mappedColumns); // Activate the mapping mechanism. dataAdapter.TableMappings.Add(usersTableMapping); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
للبحث عن رو معين ببرايمري كي 8
// Base DataTable DataTable myTable = DataSetFiller.FillDataset(dataFilePath).Tables[0] ; // Set Primary Key myTable.PrimaryKey = new DataColumn[] { myTable.Columns["CustomerID"] }; DataRow dr = myTable.Rows.Find("2"); if (dr != null) { Console.WriteLine("Find a row using a base DataSet"); ShowDataRow(dr); } static void ShowDataRow(DataRow dr) { foreach (DataColumn dc in dr.Table.Columns) { Console.Write(dr[dc] + " "); } Console.Write("\n\n"); } كان المثال السابق البحث عن رو واحد فقط بدللة البرايمري كي والن البحث عن مجموعة من الروز ولكن بدللة الشرط DataRow[] drs = myTable.Select("FirstName Like 'Jo%'"); وهذا مثال كامل يوضح المر static void Main(string[] args) { DataTable myTable = DataSetFiller.FillDataset(dataFilePath).Tables[0]; DataRow[] drs = myTable.Select("LastName Like '%OfJungle'","FirstName ASC"); if (drs != null) { foreach (DataRow dr in drs) { ShowDataRow(dr); } } وإذا أردت أن تغير بعض البيانات في الرو DataTable myTable = DataSetFiller.FillDataset(dataFilePath).Tables[0]; myTable.PrimaryKey = new DataColumn[] { myTable.Columns["CustomerID"] }; 9
myTable.AcceptChanges(); DataRow janeRow = myTable.Rows.Find("5"); janeRow["LastName"] = "QueenOfJungle"; ولمعرفة الصفوف التي حصل فيها تغيير يمكن ذلك DataRow[] drs = myTable.Select("", "", DataViewRowState.ModifiedCurrent); أحيانا نحتاج داتاكولمن عبارة عن ناتج عملية حسابية معينة لكثر من داتاكولمن ويضاف هذا الداتاكولمن الجديد يمكن ذلك على النحو التالي.)المحسوب( للداتاتابل DataSet customerProducts = CreateDataSet.DataSetFiller.FillStrongDataSet(dataFilePath); DataTable productsTable = customerProducts.Tables[1]; DataColumn totalPrice = new DataColumn("Total Price"); totalPrice.Expression = "Price + Price * TaxPercent"; productsTable.Columns.Add(totalPrice); بس أحيانا يكون عندك داتاكولمن نوع بياناته سترنغ فما تقدر تسوي عليه عمليات حسابية والحل يكون قبل العمليات الحسابية نخلي نوع البيانات حق الداتاكولمن مثل انتغر productsTable.Columns["Price"].DataType = typeof(System.Int32); // Fill Data here الكلم اللي قبل شوي ينطبق على مستوي الرو الواحد ولكن أحيانا نحتاج نعمل على مستوى الداتاتابل ويمكن ذلك أيضا كالتالي private void Form1_Load(object sender, EventArgs e) { DataSet customerProducts = CreateDataSet.DataSetFiller.FillStrongDataSet(dataFilePath); // productsTable is defined as a private variable in the class. productsTable = customerProducts.Tables[1]; DataColumn totalPrice = new DataColumn("Total Price"); totalPrice.Expression = "Price + Price * TaxPercent"; productsTable.Columns.Add(totalPrice); dataGridView1.DataSource = productsTable; } private void btnSumPrices_Click(object sender, EventArgs e) { string price = productsTable.Compute("Sum(Price)", "").ToString(); lblSumPrice.Text = "The total price is : " + price; } 10
ومن خلل المثال السابق يمكن توسيع المر شوي وتحديد الشرط أكثر string price = productsTable.Compute("Sum(Price)", "Price < 500").ToString(); راح نتكلم عن أوبجكت جديد اسمه داتافيو وكيفية استخدامه DataView dv = new DataView( productsTable, "ProductID = 1", "ProductName", DataViewRowState.Unchanged); ومثال بسيط يوضح كيفية عمله DataView animalView = null; private void btnLoad_Click(object sender, EventArgs e) { Excercise8._8.DataSet1.AnimalDataTable tblAnimal = new Excercise8._8.DataSet1.AnimalDataTable(); Excercise8._8.DataSet1TableAdapters.AnimalTableAdapter adapter = new Excercise8._8.DataSet1TableAdapters.AnimalTableAdapter(); adapter.Fill(tblAnimal); animalView = new DataView(tblAnimal); dgView.DataSource = animalView; } private void btnSort_Click(object sender, EventArgs e) { animalView.Sort = "AnimalName ASC"; } private void btnRows_Click(object sender, EventArgs e) { animalView.RowFilter = "AnimalName like '%o%'"; } private void btnFind_Click(object sender, EventArgs e) { DataRowView[] drs = animalView.FindRows("Dog"); foreach (DataRowView dr in drs) { MessageBox.Show(dr["AnimalID"] + " " + dr["AnimalName"] + " " + " Selected"); } }
11
وشي ثاني بعد تقدر تحول الداتافيو إلى داتاتابل DataTable custProdTable = DataSetFiller.FillDataset(dataFilePath).Tables(2) ; DataView view = new DataView[custProdTable]; view.RowFilter = "ProductID > 2"; DataTable subsetTable = view.ToTable[]; // or DataTable subsetTable = view.ToTable["TableName"]; في سكول لما يرجع قيم فريدة فقط ويمكن عملDistinct وهناك ميزة أخرى في توتابل ميثود حيث تعمل كما يعمل ذلك ببساطة DataTable custProdTable = DataSetFiller.FillDataset(dataFilePath).Tables(2) ; DataView view = new DataView[custProdTable]; view.RowFilter = "ProductID > 2"; DataTable subsetTable = view.ToTable[true,"ProductID"]; وهذا بعد اذا حبينا تقليل عدد الداتاكولمن في الداتابل DataTable subsetTable = view.ToTable[false, "CustomerID", "ProductID"]; وهذا مثال يوضح عمل الروستات private static void DisplayRowStates(string Message, DataTable table) { Console.Clear(); Console.WriteLine("\n"); Console.WriteLine(Message); Console.WriteLine("-------------------------------------------"); foreach (DataRow dr in table.Rows) { Console.WriteLine(dr.RowState.ToString()); } Console.WriteLine("\nPress Enter to Continue ..") ; Console.Read() ; } static void Main(string[] args) { using (SqlConnection testConnection = new SqlConnection(connectionString)) { SqlCommand testCommand = testConnection.CreateCommand(); testCommand.CommandText = "Select * from Animals"; 12
SqlDataAdapter sqlDa = new SqlDataAdapter(testCommand); DataTable animalsTable = new DataTable("Animals"); sqlDa.Fill(animalsTable); DisplayRowStates( "Row states for a freshly filled DataTable:",animalsTable); } } DataRow rowInQuestion; // Make Changes - Modify the puppy rowInQuestion = animalsTable.Rows[0]; rowInQuestion["AnimalName"] = "Dog"; // Make Changes - Delete the cat rowInQuestion = animalsTable.Rows[1]; rowInQuestion.Delete(); // Leave the Horse untouched. // Make Changes - Insert a camel rowInQuestion = animalsTable.NewRow(); rowInQuestion["AnimalID"] = 4; rowInQuestion["AnimalName"] = "Camel"; animalsTable.Rows.Add(rowInQuestion); DisplayRowStates("Row states for a modified DataTable:", animalsTable); rowInQuestion = animalsTable.NewRow(); rowInQuestion["AnimalID"] = 5; rowInQuestion["AnimalName"] = "Monkey"; // Update the changes back to the database. SqlCommandBuilder cmbldr = new SqlCommandBuilder(sqlDa); // Setup Update Command sqlDa.UpdateCommand = cmbldr.GetUpdateCommand(); Console.WriteLine("Update Command: " + sqlDa.UpdateCommand.CommandText); // Setup Insert Command sqlDa.InsertCommand = cmbldr.GetInsertCommand(); Console.WriteLine("Insert Command: " + sqlDa.InsertCommand.CommandText); // Setup Delete Command sqlDa.DeleteCommand = cmbldr.GetDeleteCommand() ; Console.WriteLine("Delete Command: " + sqlDa.DeleteCommand.CommandText); sqlDa.Update(animalsTable); DisplayRowStates("Final Row States:", animalsTable); 13
هناك عيب واحد في الكود السابق للبدايت الثلثة قمت بعمل ثلث رحلت لكل أبدايت وللتغلب على هذه المشكلة استخدم ابدايت باتش سايز قبل كل ابدايت sqlDa.UpdateBatchSize = 3; هناك عيب أساسي في الداتاادابتر انه يعالج كل رو على حدة ويصر على استخدام اوامر السكويل على كل رو وتمت معالجة هذه المشكلة باستخدام ابدايت باتش سايز ولكن تبقى هذه المشكلة في حالة نقل البيانات بين العديد من وهذا مثال. ولحل هذه المشلة نستخدم سكل بولك كوبي كلس.التابلز static void Main(string[] args) { string constr = @"Data Source=ADB2CIC00W10554\SQLEXPRESS;Initial Catalog=Animals;Integrated Security=True"; using (SqlConnection firstcon = new SqlConnection(constr)) { SqlCommand com = firstcon.CreateCommand(); com.CommandType = CommandType.Text; com.CommandText = "SELECT * FROM Animal "; firstcon.Open(); SqlDataReader dr = com.ExecuteReader(); using (SqlConnection secondcon = new SqlConnection(constr)) { SqlBulkCopy bc = new SqlBulkCopy(secondcon); bc.DestinationTableName = "AnimalCopy"; secondcon.Open(); bc.WriteToServer(dr); bc.Close(); dr.Close(); } } } من هنا سنتحدث عن اد أو ابدايت أو الديليت الروز في الديسكونكتد مودل : لصافة روز على داتاتابل هناك طريقتان •اضافة رو موجود .•اضافة رو جديد ففي حالة اضافة رو جديد هناك حالتان •الداتاتابل سكيما موجودة rowInQuestion = animalsTable.NewRow(); 14
rowInQuestion["AnimalID"] = 4; rowInQuestion["AnimalName"] = "Camel"; animalsTable.Rows.Add(rowInQuestion); وهناك ميثود يمكن اضافة رو جديد للداتاتابل object[] rowVals = {"4", "Camel"} ; animalsTable.LoadDataRow(rowVals, false); .ولضافة رو موجود نستخدم امبورت رو حيث تأخذ الداتا رو كباراميتر والميثود الخرى ميرج ولتعديل رو فقط عليك تحديد الرو والداتاكولمن المراد تحديثه rowInQuestion = animalsTable.Rows[0]; rowInQuestion["AnimalName"] = "Dog"; وهناط طريقة أخرى rowInQuestion = animalsTable.Rows[0]; rowInQuestion.BeginEdit(); rowInQuestion["AnimalName"] = "Dog"; rowInQuestion.EndEdit() ; // This could have been rowInQuestion.CancelEdit() also وأيضا أخرى rowInQuestion = animalsTable.Rows[0]; rowInQuestion.ItemArray = new object[] {null, "Dog"} ; ولحذف رو فقط استخدم ديليت rowInQuestion = animalsTable.Rows[1]; rowInQuestion.Delete(); وجميع ما سبق يلزم أبدات أو اكسبت شانج وهناك طريقة أخرة لحذف الروز animalsTable.Remove(rowInQuestion) ; // or animalsTable.RemoveAt(1) ; ولمعرفة تاريخ الرو نستخدم rowInQuestion = animalsTable.Rows[0]; rowInQuestion.BeginEdit(); rowInQuestion["AnimalName"] = "Dog"; Console.Write(rowInQuestion["AnimalName", DataRowVersion.Proposed]); 15
rowInQuestion.EndEdit() ; Console.Write(rowInQuestion["AnimalName", DataRowVersion.Original]); Console.Write(rowInQuestion["AnimalName", DataRowVersion.Current]); وهذا مثال public Form1() { InitializeComponent(); // Setup the schema for the Table. animalsTable = new DataTable("Animals"); DataColumn dc = null; dc = new DataColumn("AnimalID"); dc.Unique = true; dc.AutoIncrement = true; dc.AutoIncrementSeed = -1; dc.AutoIncrementStep = -1; dc.DataType = typeof(System.Int32); animalsTable.Columns.Add(dc); dc = new DataColumn("AnimalName"); animalsTable.Columns.Add(dc); dc = new DataColumn("AccountNumber"); dc.ReadOnly = true; animalsTable.Columns.Add(dc); // DataBind it, even though it has no rows in it yet. dgView.DataSource = animalsTable; } private void btnLoad_Click(object sender, EventArgs e) { SqlDataAdapter sqlDA = new SqlDataAdapter("Select * from Animals", connectionString); animalsTable.Rows.Clear(); sqlDA.Fill(animalsTable); } private void btnSave_Click(object sender, EventArgs e) { SqlCommand insertCommand = new SqlCommand(); insertCommand.CommandType = CommandType.StoredProcedure; SqlParameter param = null; param = new SqlParameter("@AnimalID", SqlDbType.Int); param.Direction = ParameterDirection.Output; 16
param.SourceColumn = "AnimalID"; insertCommand.Parameters.Add(param); param = new SqlParameter("@AnimalName", SqlDbType.VarChar); param.SourceColumn = "AnimalName"; insertCommand.Parameters.Add(param); param = new SqlParameter("@AccountNumber", SqlDbType.Int); param.SourceColumn = "AccountNumber"; param.Size = 40; param.Direction = ParameterDirection.Output; insertCommand.Parameters.Add(param); insertCommand.CommandText = "UP_ANIMALINSERT"; SqlDataAdapter sqlDA = new SqlDataAdapter( "Select * from Animals", connectionString); insertCommand.Connection = new SqlConnection(connectionString); insertCommand.UpdatedRowSource = UpdateRowSource.Both; sqlDA.InsertCommand = insertCommand; sqlDA.Update(animalsTable); } CREATE PROCEDURE UP_ANIMALINSERT @AnimalID INT OUTPUT, @AnimalName VARCHAR, @AccountNumber INT OUTPUT AS BEGIN TRANSACTION INSERT INTO SEEDGENERATOR DEFAULT VALUES SET @AccountNumber = SCOPE_IDENTITY() ROLLBACK TRANSACTION INSERT INTO ANIMALS (ANIMALNAME, ACCOUNTNUMBER) VALUES (@AnimalName, @AccountNumber) SELECT @AnimalID = @@IDENTITY GO CREATE TABLE [SeedGenerator] ( [SeedGenerator] [bigint] IDENTITY(1,1) NOT NULL ) ON [PRIMARY] مرات تحب تعرف التغييرات الحاصلة في الداتاتابل فقط المثال التالي يوضح ذلك private void btnGetChanges_Click(object sender, EventArgs e) { CustProd changedDS = (CustProd)myDataSet.GetChanges(); 17
dgCustomers.DataSource = changedDS.Customers; dgCustomerProducts.DataSource = changedDS.CustomerProducts; dgProducts.DataSource = changedDS.Products; } ولدمج داتاتابل مع داتاتابل آخر نطبق الكود التالي ويمكن تطبيقه على الداتاست أيضا Table1.Merge(Table2) ; هذا مثال كيفية عمل ابدايت عن طريق المابينغ ميكانيزم #region Using directives using System; using System.Collections.Generic; using System.Text; using System.Data.OleDb; using System.Data.Common; using System.Data; #endregion namespace Exercise_9_8 { class Program { static void Main(string[] args) { DataSet dsUsers = new DataSet("Users"); try { OleDbConnection dbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Password=;User ID=Admin;Data Source=db.mdb"); // Create a data adapter to retrieve records from db OleDbDataAdapter daUsers = new OleDbDataAdapter("SELECT ID,fn,ln,cty,st" + " FROM tabUsers", dbConn); // Define each column to map DataColumnMapping dcmUserID = new DataColumnMapping("ID", "UserID"); DataColumnMapping dcmFirstName = new DataColumnMapping("fn", "FirstName"); DataColumnMapping dcmLastName = new DataColumnMapping("ln", "LastName"); DataColumnMapping dcmCity = new DataColumnMapping("cty", "City"); 18
DataColumnMapping dcmState = new DataColumnMapping("st", "State"); // Define the table containing the mapped columns new DataTableMapping("Table", "User"); dtmUsers.ColumnMappings.Add(dcmUserID); dtmUsers.ColumnMappings.Add(dcmFirstName); dtmUsers.ColumnMappings.Add(dcmLastName); dtmUsers.ColumnMappings.Add(dcmCity); dtmUsers.ColumnMappings.Add(dcmState); // Activate the mapping mechanism daUsers.TableMappings.Add(dtmUsers); // Fill the dataset daUsers.Fill(dsUsers); DataColumn[] dcaKey = { dsUsers.Tables["User"].Columns["UserID"] }; dsUsers.Tables["User"].PrimaryKey = dcaKey; // Declare a command builder to create SQL instructions // to create and update records. OleDbCommandBuilder cb = new OleDbCommandBuilder(daUsers); // Update an existing record in the DataSet DataRow r = dsUsers.Tables["User"].Rows.Find(8); if (r != null) { r["FirstName"] = "Venus"; r["LastName"] = "Williams"; r["City"] = "Houston"; r["State"] = "Texas"; // Update the record in the database daUsers.Update(dsUsers.GetChanges()); // Align in-memory data with the data source ones dsUsers.AcceptChanges(); // Print success message Console.WriteLine("The record has been updated " + "successfully."); } else { Console.WriteLine("No record found..."); } } catch (System.Exception ex) { dsUsers.RejectChanges(); // An error occurred. Show the error message 19
Console.WriteLine(ex.Message); } } } }
20