PDA

View Full Version : سوال: bjectDataSource یا SqlDataSource



saghari
جمعه 07 اسفند 1388, 10:19 صبح
با سلام
فرض کنید میخواهیم به برنامه کاربردی تحت وب بنویسم (نه وب سایت) که بانک اطلاعاتی اونو sql انتخاب کردیم.
حالا توی برنامه برای ارتباط و کار با دیتابیس از کدام روش زیر استفاده کنیم بهتره و اصولا بهترین روش برای کار با بانکهای اطلاعاتی sql چیه؟
1- یک شی از نوع DataSet به پروژه اضافه کنیم و TabelAdapter و DataTabel های پروژه رو به اون اضافه کنیم و بعد در فرم ها از طریق ObjectDataSource از اونها استفاده کنیم.
2- روی فرم ها از SqlDataSource استفاده کنیم.

لازم به توضیح است در هر دو حال فرض بر اینه که کلیه عملیات کار با دیتابیس از طریق SP انجام میشه.

قبلا از توجه شما ممنونم

vb_nima
جمعه 07 اسفند 1388, 13:19 عصر
دوست عزيز به نظر من اگر بخواي دستورات sql را در برنامه وارد كني روش خوب و منطقي استفاده از Typed Dataset و ObjectDataSource چون معماري برنامه چندلايه ميشه و ديگه كدهاي sql داخل تگهاي html وارد نميشه. زماني كه از sqlDataSource استفاده ميشه كدهاي sql مربوط به select، Update، Delete و insert در تگهاي html اضافه ميشه و يه جورايي برنامه از لحاظ منطقي دچار ايراد ميشه چون كدهاي sql مربوط به دسترسي داده هاست ولي كدهاي html مربوط به نمايش صفحات. پس بهتره كدهاي sql و دسترسي به داده ها در همان لايه DAL با استفاده از Typed DataSet انجام بشه.
البته شما گفتيد از SP‌ استفاده ميكنيد.حالا نمي دونم زماني كه از sp هم استفاده ميشه كد خاصي به صفحات html اضافه ميشه يا نه. (چون تاحالا خودم از sp استفاده نكردم)
البته فكر كنم من فقط يكي از مزاياي typed dataset‌را گفتم و مزاياي ديگري هم داشته باشه.

saghari
جمعه 07 اسفند 1388, 13:56 عصر
ممنون دوست عزیز
پس با توجه به فرمایش شما برای پروژه ای با مشخصات ذکر شده بهتره از روش اول استفاده کنم.

از توجه شما ممنونم

vb_nima
جمعه 07 اسفند 1388, 17:56 عصر
ممنون دوست عزیز
پس با توجه به فرمایش شما برای پروژه ای با مشخصات ذکر شده بهتره از روش اول استفاده کنم.

از توجه شما ممنونم

بله به نظر من اگر قرار كدهاي sql‌ در برنامه وارد بشه روش اولي كه گفتيد بهتره. ولي در مورد اينكه شما مي خواهيد از sp استفاده كنيد مطمئن نيستم. از دوستاني كه اطلاعات بيشتري دارند خواهش ميكنم توضيح بدند. چون واسه خودمم سوال وقتي sp داريم آيا بازم بهترين روش همون استفاده از typed dataset يا نه.
البته حدس ميزنم(دليل خاصي ندارم) براي sp هم بهتره از همون typed dataset استفاده بشه.

keyvan_n
جمعه 07 اسفند 1388, 23:44 عصر
زماني كه از sqlDataSource استفاده ميشه كدهاي sql مربوط به select، Update، Delete و insert در تگهاي html اضافه ميشه

کی همچین حرفی زده ؟ البته به نظر من هم بهتره از ObjectDataSource استفاده کنید، ولی فکر می کنم دوستمون کد Markup رو با HTML اشتباه گرفتن. کدهایی که در صفحه Aspx قرار می گیرن، ترکیبی از HTML و کدهای سمت سرور هستن. پس کدهای Sql به هیچ وجه در HTML قرار نمی گیرن.

vb_nima
شنبه 08 اسفند 1388, 01:32 صبح
کی همچین حرفی زده ؟ البته به نظر من هم بهتره از ObjectDataSource استفاده کنید، ولی فکر می کنم دوستمون کد Markup رو با HTML اشتباه گرفتن. کدهایی که در صفحه Aspx قرار می گیرن، ترکیبی از HTML و کدهای سمت سرور هستن. پس کدهای Sql به هیچ وجه در HTML قرار نمی گیرن.

دوست عزيز من بيشتر منطورم اين بود كه كدهاي دسترسي به داده در لايه Persentation نبايد قزار بگيرد كه لايه Perensention همون صفحات aspx هست. و فقط در اين صفحات ارجاع به لايه دسترسي به داده بايد انجام گيرد.
به اين قسمت توجه كنيد:


The data source controls, like any other ASP.NET control, have a corresponding declarative markup that is inserted into the ASP.NET page's HTML section. The markup below shows the complete markup for the page shown in Figure 4. Notice that we did not need to write a single line of server-side code in order to display data from a database.

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<script runat="server">
</script>
<html >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:SqlDataSource ID="productsDataSource" Runat="server"
"SelectCommand="SELECT [ProductID], [ProductName], " & _
"[QuantityPerUnit], [UnitPrice], [UnitsInStock] " & _
"FROM [Products]"
ConnectionString=
"<%$ ConnectionStrings:NWConnectionString %>"
DataSourceMode="DataReader">
</asp:SqlDataSource>
<asp:GridView ID="productGridView" Runat="server"
DataSourceID="productsDataSource"
DataKeyNames="ProductID" AutoGenerateColumns="False">
<Columns>
<asp:BoundField ReadOnly="True"
HeaderText="ProductID" InsertVisible="False"
DataField="ProductID"
SortExpression="ProductID"></asp:BoundField>
<asp:BoundField HeaderText="ProductName"
DataField="ProductName"
SortExpression="ProductName"></asp:BoundField>
<asp:BoundField HeaderText="QuantityPerUnit"
DataField="QuantityPerUnit"
SortExpression="QuantityPerUnit"></asp:BoundField>
<asp:BoundField HeaderText="UnitPrice"
DataField="UnitPrice" SortExpression="UnitPrice">
</asp:BoundField>
<asp:BoundField HeaderText="UnitsInStock"
DataField="UnitsInStock"
SortExpression="UnitsInStock"></asp:BoundField>
</Columns>
</asp:GridView>

</div>
</form>
</body>
</html>
Accessing Data with the ObjectDataSource
With the SqlDataSource control, the ASP.NET page contains the specific details pertinent to data access. That is, buried in the SqlDataSource's declarative syntax you'll find a reference to a connection string, SQL statements for (potentially) SELECTs, INSERTs, UPDATEs, and DELETEs, and a list of parameters for each type of SQL statement. The downside of this approach is that it tightly binds the details of the data store to the ASP.NET page. If your database's underlying schema changes you'll have to modify all ASP.NET pages that touch the modified parts of the data store. Additionally, placing data access logic in the ASP.NET page increases the complexity of the pages. The data store's schema in your application may be large and particularly unwieldy to developers new to the project. By tying the data access logic to the ASP.NET page, these developers must have an intimate understanding of the data model and its relation to the program in order to create or modify ASP.NET pages.

A better approach for large Web applications is to divide the application's architecture into different layers. Typically Web applications are divided into three layers:

A Presentation Layer, which contains the ASP.NET Web pages.
A Data Access Layer (DAL), which consists of classes that serve as a ferry between the requests from the presentation layer and the backend data store layer.
A Data Store Layer, such as a Microsoft SQL Server database.

منبع: http://msdn.microsoft.com/en-us/library/aa479341.aspx

vb_nima
شنبه 08 اسفند 1388, 01:46 صبح
با سلام
1- یک شی از نوع DataSet به پروژه اضافه کنیم و TabelAdapter و DataTabel های پروژه رو به اون اضافه کنیم و بعد در فرم ها از طریق ObjectDataSource از اونها استفاده کنیم.
2- روی فرم ها از SqlDataSource استفاده کنیم.


دوست عزيز اينجا را هم يه نگاهي بكنيد. يه مقايسه انجام داده:
SQLDataSource Vs ObjectDataSource
(http://www.geekphilosopher.com/GeekPhilosopher.com/view/sqldatasource-vs-objectdatasource.aspx)

مزيت ديگري كه فراموش كردم براي typed dataset بگم بحث strongly-typed objects هست:


این متده وقتی فراخوانی میشوند به DB وصل شده و Query مورد نظر را اجرا کرده و نتیجه را برمی گرداند. البته نوع این نتجه برگشت داده شده مهم است (type = نوع)
.این نوع میتواند یک DataSet ساده یا یک DataReader باشد.اما مطلوب ان است که نتیجه برگشتی ازstrongly-typed objects استفاده کند
.
strongly-typed objects : نوع داده ای است که شمای آن قبل کمپایل معلوم باشد

loosely-typed object: این نوع داده قیل از زمان کامپایل و اجرا شمایش معلوم نیست.

به طور مثال DataReader و DataSet معمولی یک loosely-typed object هستند و برای دسترسی به یک ستون مشخص از یک loosely-typed DataTableباید از Syntax زیر استفاده کرد


برای داشتن یک strongly-typed object میتونید خودتان یک کلاس تعریف کنید و بطور خاص تمام مفاهیم گفته شده را پیاده سازی کنید اما را آسانتری نیز وجود دارد که آنهم این است که Typed DataSet درست کنید که خاصیتهای بالا را داشته باشد .

منبع :http://www.barnamenevis.org/forum/showthread.php?t=50207

اميدوارم مفيد بوده باشه.

hajizahiry
شنبه 08 اسفند 1388, 10:51 صبح
دوست عزیز بهترین کار این است
1- ابتدا connection را در webconfig تعریف کنی :
<appSettings>
<add key="CnnStringSL" value="packet size=4096;user id=userid;password=password;data source=datasoureName;persist security info=False;initial catalog=dbName" />
</appSettings>
2- در sql server اس پی ای بنویسی(store procedure)
3- در تابع زیر اس پی را با connection تعریف شده فراخوانی کنی :
private DataSet LoadChart2(int sl)
{
DataSet ds = new DataSet();
SqlConnection cnn2 = new SqlConnection();
cnn2.ConnectionString = System.Configuration.ConfigurationSettings.AppSett ings["CnnStringSL"];
try
{
SqlCommand selectCommand = new SqlCommand("SL_Sp_Rep_ChartSimple", cnn2);
selectCommand.CommandType = CommandType.StoredProcedure;
selectCommand.Parameters.AddWithValue("@parent", sl);
selectCommand.Parameters.AddWithValue("@level", DropDownList2.SelectedItem.Value);

SqlDataAdapter adapter1 = new SqlDataAdapter();
adapter1.SelectCommand = selectCommand;
adapter1.Fill(ds);
}
catch (Exception exp)
{
LblScripts.Text = "<script language=javascript>alert('خطا : " + exp.Message.ToString() + "');</script>";
}
finally
{
cnn.DB_Connection.Close();
}
return ds;
}
3- دوست عزیز بهترین مزیت تعریف connection در webconfig این است که اگر پروژه را در سیستم خودت اجرا کردی . سپس می خواهی در سرور بگذاری، تنها نیاز است که webconfig را عوض کنی نه کد برنامه ات را

saghari
شنبه 08 اسفند 1388, 13:43 عصر
دوست عزیز ضمن تشکر از توجه شما سوال در مورد Connection نبود. بدیهی است در هر دو مورد طرح شده کانکشن در webconfig تعریف میشه.

ضمن تشکر موفق باشید