PDA

View Full Version : استفاده از DataReader



komeil64
سه شنبه 19 خرداد 1383, 20:06 عصر
سلام
من استفاده دقیق از دیتا ریدر را نمی دانم
به فرض می خواهیم یک مقدار رو بریزیم تودیتا بیس ولی نمی خواهیم تکراری باشه یعنی یه بار ریخته باشیم
توی ای اس پی کلاسیک بلد بودم که یه حلقه میزاشتیم هر بار یه رکورد روچک می کرد که تکرار نباشه خوب تو سی شارپ هم مطمئنا همینه ولی من طریقه نوشتن کدش رو نمی دونم
منظورم اینه که نمیدونم چی رو کجا بنویسم به عنوان مثال دیتا ریدر را کجای حلقه بنویسم
کلا طریقه نوشتنش
اگه راهنمایی کنین ممنون :roll:

Farhad.B.S
سه شنبه 19 خرداد 1383, 20:26 عصر
متد Read در دیتا ریدر ، علاوه بر یک رکورد به جلو بردن دیتاریدر ، مقدار بولینی رو بر می گردونه که نشون میده آیا رکورد دیگری (رکورد بعدی) وجود داره یا نه ، بنابراین میشه در یک حلقه با چک کردن این مقدار به بررسی رکورد ها پرداخت.


SqlDataReader dbReader;
dbReader = sql_command.ExecuteReader();

while (dbReader.Read()) {
Response.Write(dbReader["ColumnName"].ToString());

}

komeil64
چهارشنبه 20 خرداد 1383, 13:29 عصر
سلام
من این کد را نوشتم ولی در هر دو صورت رکوردی اضافه نمی کنه:


SqlConnection screg=new SqlConnection("server=vcc;uid=sa;pwd=vcc;database=site");
SqlDataAdapter sdreg=new SqlDataAdapter("select * from tblusers",screg);
string insertcmd="insert into tblusers values(N'"+TextBox1.Text +"',N'"+ TextBox2.Text +"','"+ TextBox3.Text +"','"+ TextBox5.Text +"','"+ TextBox6.Text +"',N'"+ TextBox7.Text +"')";

SqlCommand scomreg=new SqlCommand(insertcmd,screg);

scomreg.Connection.Open();
SqlDataReader dbReader;
dbReader=scomreg.ExecuteReader();
while (dbReader.Read())
{
if (dbReader["user_name"]!=TextBox2.Text)
{
scomreg.ExecuteNonQuery();
scomreg.Connection.Close();
Label1.Text="Reg OK";
}
Label1.Text="NO Reg";
}
dbReader.Close();
}

البته فکر می کنم باید یه فیلد آی دی درست کنم که هر بار یکی به اون اضافه کنهتا به رکورد بعدی بره ولی من فیلد آی دی ندارم آیا متدی نیست که به اون اضافه کرد یا حتما باید یه فیلد آی دی بسازم؟
ممنون

Farhad.B.S
چهارشنبه 20 خرداد 1383, 18:41 عصر
دیتا ریدر برای حرکت به رکورد بعدی نیاری به فیلد آی دی نداره (Primary key). ممکنه مشکل از جای دیگه ای باشه.
-------------------
کلا روشی که شما میخواید ازش استفاده کنید ، برای این مورد ، روش چندان درستی نیست . به این خاطر که کلیه رکورد ها تک تک از دیتابیس خونده میشند و به برنامه شما منتقل میشند و در برنامه شما چک میشند و ...
بهتره از یک عبارت کلی SQL استفاده کنید ، در این صورت بسیار بهینه تر خواهد بود :

IF EXISTS(SELECT * FROM tblUsers WHERE Username='RequestedUsername')
INSERT INTO tblUsers ...

komeil64
پنج شنبه 21 خرداد 1383, 19:26 عصر
سلام
آقا من دقیقا متوجه نشدم باید چی کار کنم تا اطلاعات تکراری وارد نشه اگه میشه یه مثال بزنید یا بیشتر توضیح بدین
ممنون :oops:

mes
جمعه 22 خرداد 1383, 00:42 صبح
با اجازه آریالا فرهاد
کمیل عزیز این بدون دیتا ریدرخوب چون اینو آماده داشتم


con = New OleDbConnection("provider=microsoft.jet.oledb.4.0;" & "data source=" + Server.MapPath("/yalasarat.mdb"))
con.Open()
cmd = New OleDbCommand("select * from tabv", con)
da = New OleDbDataAdapter("Select * from tabv", con)
da.Fill(ds, "t1")
newrow = ds.Tables("t1").NewRow()
newrow("fnamee") = TextBox1.Text
newrow("lnamee") = TextBox2.Text
tr = 0
er = 0
For i = 0 To ds.Tables("t1").Rows.Count - 1
If ds.Tables("t1").Rows(i).Item("usere") = TextBox5.Text() Then
tr = 1
er = 1
i = ds.Tables("t1").Rows.Count + 1
End If
Next
newrow("usere") = TextBox5.Text
If TextBox5.Text = "" Then
If er = 0 Then
er = 3
End If
End If
If TextBox7.Text = TextBox11.Text Then
newrow("passe") = TextBox7.Text
Else
If er = 0 Then
er = 2
End If
End If
newrow("adde") = TextBox3.Text
newrow("vale") = 1
newrow("emaile") = TextBox10.Text
If er = 0 Then
ds.Tables("t1").Rows.Add(newrow)
cb = New OleDbCommandBuilder(da)
da.InsertCommand = cb.GetInsertCommand
cmd.UpdatedRowSource.ToString()
da.Update(ds, "t1")
con.Close()
Label20.Text = "شما با موفقیت عضو شدید و میتوانید از امکانات سایت استفاده کنید,ما به کمک شما نیازمندیم. یا علی"
TextBox1.Enabled = False
TextBox2.Enabled = False
TextBox3.Enabled = False
TextBox4.Enabled = False
TextBox5.Enabled = False
TextBox6.Enabled = False
TextBox7.Enabled = False
TextBox8.Enabled = False
TextBox9.Enabled = False
TextBox10.Enabled = False
TextBox11.Enabled = False
TextBox12.Enabled = False
Button1.Enabled = False
Label1.Visible = False
Label2.Visible = False
Else
If er = 1 Then
Label20.Text = "خطا :نام کاربر دیگری انتخاب کنید"
End If
If er = 2 Then
Label20.Text = "خطا: کد عبور را درست تکرار کنید"
End If
If er = 3 Then
Label20.Text = "خطا:فیلدها را پر کنید"
End If
End If

SoheilKH
جمعه 22 خرداد 1383, 12:01 عصر
سلام
فرض کن می خواهیم اطلاعات کاربر را در بانک ذخیره کنیم یکی از فیلد های مربوط به کاربر UserName است که نباید تکراری باشد.
1- یک تابع به نام AddCustomer داریم که پارامترهای ورودی اش مشخصات کاریر است.
2- یک StoreProcedure به نام insert_Customer داریم که عمل درج کاربر در بانک را بر عهده دارد.

insert_Customer:

ALTER PROCEDURE insert_Customer
(
@FName [nvarchar](100),
@LName [nvarchar](100),
@Email [nvarchar](100),
@Address [nvarchar](200),
@Tel [nvarchar](100),
@Fax [nvarchar](100))

AS
-- Check if User already exists
if exists(select CustomerId from [Customer]
where @FName = [FName] and @LName=[LName])
return 1

INSERT INTO [Customer]
(
[FName],
[LName],
[Email],
[Address],
[Tel],
[Fax])

VALUES
(
@FName,
@LName,
@Email,
@Address,
@Tel,
@Fax)
return 0

AddCustomer:

Public Function AddCustomer(ByVal Fname As String, ByVal Lname As String, ByVal Email As String, ByVal Tel As String, ByVal Fax As String, ByVal Address As String) As Integer

Dim MyConn As New SqlConnection(MainClass.DSN)
Dim Cmd As New SqlCommand("insert_Customer", MyConn)
Cmd.CommandType = CommandType.StoredProcedure
Cmd.Parameters.Add(New SqlParameter("@Result", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue

Cmd.Parameters.Add(New SqlParameter("@Fname", Fname))
Cmd.Parameters.Add(New SqlParameter("@Lname", Lname))
Cmd.Parameters.Add(New SqlParameter("@Email", Email))
Cmd.Parameters.Add(New SqlParameter("@Tel", Tel))
Cmd.Parameters.Add(New SqlParameter("@Fax", Fax))
Cmd.Parameters.Add(New SqlParameter("@Address", Address))


Cmd.Connection.Open()
Cmd.ExecuteNonQuery()

Dim Result As Byte = Fix(Cmd.Parameters("@Result").Value)

Select Case Result
Case 0 'add By Successfully
MyConn.Close()
Return 0
Case 1 'Fname and lname Is Exising
MyConn.Close()
Return 1
End Select
End Function
در StoreProcedure ابتدا قبل از اضافه کردن رکورد تست می کنیم که نام و نام خانوادگی تکراری نباشند.

-- Check if User already exists
if exists(select CustomerId from [Customer]
where @FName = [FName] and @LName=[LName])
return 1

در صورتی که تکراری باشند مقدار 1 را بر می گرداند در غیر اینصورت عمل درج انجام شده و مقدار 0 برگدانده می شود.

حالا در تابع AddCustomer مقدار بازگشتی SotreProcedure را تست می کنیم .
اگر 0 بود که به کاربر اعلام می کنیم عمل درج با موفقیت انجام شد.
اگر 1 بود اعلام می کنیم که قبلا نام و نام خانوادگی ثبت شده است و ....

موفق باشید.

mes
جمعه 22 خرداد 1383, 14:07 عصر
حالا با دیتا ریدر
تو این قسمت کد

For i = 0 To ds.Tables("t1").Rows.Count - 1
If ds.Tables("t1").Rows(i).Item("usere") = TextBox5.Text() Then
tr = 1
er = 1
i = ds.Tables("t1").Rows.Count + 1
End If
Next

به جای فور از وایل استفاده میکنیم
اصلا اصول کار دیتاریدر اینطوریه که هر دفعه که رید میشه یه رکورد رو میخونه و میره جلو ÷س به جای فور میتونیم ازش استفاده کنیم به این صورت که

while(dr.read)
If dr("usere") = TextBox5.Text() Then
tr = 1
er = 1
End If
end wile

komeil64
جمعه 22 خرداد 1383, 14:50 عصر
سلام
از همگی ممنون
واقفا لطف کردید :wink:

lopkeshooni
جمعه 22 خرداد 1383, 19:31 عصر
Value cannot be null. Parameter name: dataSet


Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


سلام اقای mes من کد شما رو عینا کپی کردم و کلیم باهاش ور رفتم اما اینجارو error میده هرچی نگاش میکنم موردی نداره

میشه راهنمایی کنین



con = New OleDbConnection("provider=microsoft.jet.oledb.4.0;" & "data source=" + Server.MapPath("/yalasarat.mdb"))
con.Open()
cmd = New OleDbCommand("select * from tabv", con)
da = New OleDbDataAdapter("Select * from tabv", con)
da.Fill(ds, "t1")



:cry:
تو کپی کردنم شانس نداریم متاسفانه :?



البته تمام object ها و ملزومات رو درست تعریف کردم



یه مطلب دیگه


آقای soheilkh این کد insert_customer شما رو کجا باید نوشت ؟؟؟؟
تو همون code behind


>>ممنون میشم راهنمایی کنین

SoheilKH
شنبه 23 خرداد 1383, 08:07 صبح
آقای soheilkh این کد insert_customer شما رو کجا باید نوشت ؟؟؟؟
تو همون code behind
بله

mes
یک شنبه 24 خرداد 1383, 08:14 صبح
لپ کشونی عزیز آخه این کد ازش کپی کردن رو نداره که.این یه مثال ناقص بود برای اینکه بگیم چجوری دو تا رکورد با یوزر نیم مساوی نداشته باشیم و طرز استفاده از دیتا ریدر شما هر سوالی که در مورد کد داری بپرس وخودت بنویسش

lopkeshooni
دوشنبه 25 خرداد 1383, 07:46 صبح
حق با شماست

من خودم از روش دیگه ای استفاده کردم
اما تجربه کردن کدهای شمام بد نبود :wink:

arya
جمعه 24 مهر 1383, 22:25 عصر
سلام
من با استفاده از datareaderمقادیر فیلدهای tableرو میخونم. یک قیلد از نوع varcharدارم که در بعضی از رکوردها nullاست. به محض اینکه میخواد این مقدار رو بخونه،error میده و وارد catchبرنامه میشه.
(st = datareader.getstring(2
چطور میشه این مشکل برطرف بشه؟؟
با تشکر

Vahid_Nasiri
شنبه 25 مهر 1383, 17:58 عصر
برای مثال به صورت زیر می تونی با این مساله مقابله کنی :


myReader.Read();
if (myReader.GetValue(0)==DBNull.Value )
res = 0;
else
res = myReader.GetValue(0) ;
:strange:

arya
شنبه 25 مهر 1383, 21:05 عصر
مرسی آقای نصیری.
حل شد.