PDA

View Full Version : ناوبری داده ها در ADO.NET



Abbas Arizi
سه شنبه 14 مرداد 1382, 21:31 عصر
توی ADO.NET چه جوری میشه توی رکوردها حرکت کرد. یعنی اعمال MoveNext، MovePrevious و ... رو انجام داد.
من بعدر از سر و کله زدن با کلی مقاله و کد نمونه یه چیزایی دستگیرم شد ولی تا رسیدن به هدف موردنظر خیلی فاصله دارم. (ظاهرا باید از واسط IEnumerator استفاده کرد. امیدوارم فصله ام با حقیقت خیلی زیاد نباشه)
خواهشا اگه ممکنه دوستان یک راهنمایی کلی در این زمینه به من بدن.
اگه با یه کد کوچولو باشه که خیلی شرمنده میکنید. (به زبان #C یا VB)

Vahid_Nasiri
چهارشنبه 15 مرداد 1382, 02:48 صبح
فرض کنیم با دیتابیس اس کیو ال سرور می خواهید کار کنید:
1- ابتدا باید با SqlConnection کانکشن را باز کنید
2- یک strSQL را باید بنویسید برای انتخاب داده های کاری مورد نظر
3- با یک SqlCommand این رشته ی قسمت 2 را باید روی کانکشن اعمال کرد
حالا این کامند باید باز شود
سپس اجرا شود
خروجی آن به یک SqlDataReader نسبت داده شود
حالا این ریدر را داخل یک حلقه ی do می اندازی تا رکوردها را بخواند.

Vahid_Nasiri
چهارشنبه 15 مرداد 1382, 02:55 صبح
یک کد نمونه برای توضیح بیشتر:


public void CreateMySqlDataReader(string mySelectQuery,string myConnectionString)
{
SqlConnection myConnection = new SqlConnection(myConnectionString);
SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection);
myConnection.Open();
SqlDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConne ction);
while(myReader.Read())
{
Console.WriteLine(myReader.GetString(0));
}
myReader.Close();
//Implicitly closes the connection because CommandBehavior.CloseConnection was specified.
}

Abbas Arizi
چهارشنبه 15 مرداد 1382, 11:18 صبح
با سلام و تشکر.
این روشی که شما گفتید جز همون روشهاییه که من قبلا تست کردم.
ولی اشکال این روشها دوتاست:
یکی اینکه فقط حرکت به سمت جلو دارند. DataReader یک مکان نمای فقط رو به جلو داره. این تعریفی که من این ور و اون ور از اون دیدم.
بنابراین MovePrevious و MoveLast و ... نداریم. البته شاید بشه با کدنویسی بیشتر یه جوری این کارها رو انجام داد و این چیزیه که من دنبالش هستم.
ولی حتی در صورت رفع اون معضل مشکل دو برجاست.
مشکل دوم اینه که اگه فرضا یه DataGrid به Database خودمون Bind کنیم، این حرکتها توی اون اعمال نمیشه.
نمیدونم! شایدم اصلا اینها توقع نابجایی باشه که من دارم. به خاطر این که هنوز توی حال و هوای ADO هستیم.
ولی به هر حال اگه کمک بیشتری مبذول دارید، خیلی من رو شرمنده کردید.

Vahid_Nasiri
چهارشنبه 15 مرداد 1382, 14:19 عصر
چون در عمل به ندرت از movePrev و امثال اینها استفاده می شود این موارد از ADO.NET حذف شده اند . واقعا شما چه استفاده ی خاصی از این متد در دیتاگرید می خواهید داشته باشید؟


Say goodbye


In classic ADO, the Recordset was the primary method of accessing data. It was as simple as executing a query, and a Recordset was created with the requested columns from one or more tables. In cases where multiple rows (records) were returned, navigation was accomplished through the use of the move, moveNext, movePrevious, moveLast, or moveFirst methods. Useless, of course, since a forward-only cursor was used, in which case only moveNext, moveLast, and move (if moving forward) are permitted.

In ADO.NET, Recordsets are gone and cursors exist in concept only. They have been replaced by data classes that provide the same functionality. For example, most of the cursors that I used in classic ADO were forward-only, read-only, because I’m one of those developers who believes that it is best to get the input/output over with as soon as possible. With the advent of ADO.NET, instead of the forward-only, read-only cursor, a DataReader object provides the same functionality.

Vahid_Nasiri
چهارشنبه 15 مرداد 1382, 14:22 عصر
ولی باز هم راه حل های مشابه برای حرکت به جلو و عقب وجود دارد برای مثال :


the DataSet Table "Employee" is specifically assigned to a DataView and the resulting DataView iterated over to extract the data values. By using a DataView you can turn any table in a DataSet into an object that functions similarly to the old ADO Recordset.


// Create a new dataview instance on the Employees table that was just created
DataView myDataView = new DataView(myDataSet.Tables["Employees"]);

// Sort the view based on the first column name.
myDataView.Sort = "EmployeeID";

int iReportsTo;

for (int i = 0; i < myDataView.Count; i++)
{
Console.Write("\n************************ Employee number " + (i+1).ToString() + " ************************\n");
Console.Write("EmployeeID:\t" + myDataView[i]["EmployeeID"].ToString() + "\n" +
"FirstName:\t" + myDataView[i]["FirstName"].ToString() + "\n" +
"LastName:\t" + myDataView[i]["LastName"].ToString() + "\n" +
"Title:\t\t" + myDataView[i]["Title"].ToString() + "\n" +
"TitleOfCourtesy:" + myDataView[i]["TitleOfCourtesy"].ToString() + "\n" +
...
}



روی دیتابیس northwind اس کیو ال سرور کد فوق قابل اجرا است.

Abbas Arizi
چهارشنبه 15 مرداد 1382, 21:12 عصر
از شما تشکر میکنم.

Abbas Arizi
شنبه 18 مرداد 1382, 20:57 عصر
من کلا این قضیه رو به بوته فراموشی سپرده بودم ولی امروز به صورت کاملا اتفاقی این کد رو توی MSDN پیدا کردم. :P :P :P :P

فقط اگه کسی خواست این کد رو امتحان کنه یادش باشه که این متغیر رو در سطح کلاس تعریف کنه:

BindingManagerBase myBindingManagerBase;
و بعد از اینکه عمل Binding رو روی همه کنترلها انجام داد تابع GetBindingManagerBase(); رو صدا بزنه.
تغییر اسم Dataset و جدول در تابع GetBindingManagerBase مطابق Dataset خودتون هم که نیازی به گفتن نداره.

private void GetBindingManagerBase()
{
/* CustomersToOrders is the RelationName of a DataRelation.
Therefore, the list maintained by the BindingManagerBase is the
list of orders that belong to a specific customer in the
DataTable named Customers, found in DataSet1. */
myBindingManagerBase =
this.BindingContext[DataSet1, "Customers.CustomersToOrders"];

// Adds delegates to the CurrentChanged and PositionChanged events.
myBindingManagerBase.PositionChanged +=
new EventHandler(BindingManagerBase_PositionChanged);
myBindingManagerBase.CurrentChanged +=
new EventHandler(BindingManagerBase_CurrentChanged);
}

private void BindingManagerBase_PositionChanged
(object sender, EventArgs e)
{
// Prints the new Position of the BindingManagerBase.
Console.Write("Position Changed: ");
Console.WriteLine(((BindingManagerBase)sender).Pos ition);
}

private void BindingManagerBase_CurrentChanged
(object sender, EventArgs e)
{
// Prints the new value of the current object.
Console.Write("Current Changed: ");
Console.WriteLine(((BindingManagerBase)sender).Cur rent);
}

private void MoveNext()
{
// Increments the Position property value by one.
myBindingManagerBase.Position += 1;
}

private void MovePrevious()
{
// Decrements the Position property value by one.
myBindingManagerBase.Position -= 1;
}

private void MoveFirst()
{
// Goes to the first row in the list.
myBindingManagerBase.Position = 0;
}

private void MoveLast()
{
// Goes to the last row in the list.
myBindingManagerBase.Position =
myBindingManagerBase.Count - 1;
}

mojtaba_mr
شنبه 19 دی 1383, 02:36 صبح
برای حذف یک رکورد که ما شماره ردیف ان را داریم چه کار باید بکنیم ؟
خیلی حیاتی است این سوال . ::نوشتن::

once4ever
چهارشنبه 06 اردیبهشت 1385, 15:37 عصر
یک دیتا ست دارم و چندتا textbox میخوام با زدن کلیدهای next و before مقادیر تکست باکسهام تغییر کنند.
بهترین روش (روش اصولی و درست ) برای اینکار چیه؟
-----
روش بالا رو انجام دادم ولی نمیدونستم چجوری این BindingContext رو به تکست باکسم بیند کنم
-----
کاری که قبلا کردم این بود که یک DataViewManager از دیتا ست درست کردم و همه تکست باکس هارو به اون بیند کردم ولی چجوری حرکت کنند؟
چجوری میشه یه بیند ساخت و همه تکست باکسهارو به اون بیند متصل کرد تا با تغییر یکی از تکست باکسها بقیه هم تغییر کنند؟!

ali_kolahdoozan
چهارشنبه 06 اردیبهشت 1385, 16:11 عصر
نه جانم این چه کاریه شما ابتدا به tetxtbox ها دیتاستت رو بایند کن .

yourtextbox.DataBindings.Add("text", yourdataset, "yourtable.yourfield");

با این کار به textbox شما این فیلد بایند شد همین بلا رو سر بقیه textbox ها بیار و فیلدها رو بهشون وصل کن بعد برای جلو عقب رفتن داریم . مثلا جلو رفتن
this.BindingContext[yourdataset, "yourtable"].Position += 1;

به همین سادگی برای عقب رفتن هم ازش یکی کم کن . برای اول و آخر رفتن هم یه کم فکر کن اگه به جایی نرسیدی بگو تا بهت بگم

once4ever
چهارشنبه 06 اردیبهشت 1385, 17:03 عصر
فکرمیکردم سخت تر از اینا باشه :چشمک:
با DataView بقیه کاراشو کردم
ممنون

عبدالرحیم
جمعه 14 بهمن 1390, 13:50 عصر
سلام چرا وقتي يه ستون به جدول اس كيو ال اضافه مي كنم در برنامه شناخته شده نيست دليلشو ميتونين بهم بگين ممنون