ورود

View Full Version : استفاده از حلقه برای وارد کردن یک رشته در دیتابیس ؟!



Heidari66
پنج شنبه 22 مرداد 1394, 23:39 عصر
سلام

این قسمتی از کدی هست که یه رشته بصورت "a,b,c" رو میگیره و بصورت جدا میفرسته تو دیتابیس
دستور رو داخل حلقه گذاشتم
میخوام بعد از اجرای برنامه بدین صورت وارد دیتابیس بشه:
x1=a
x2=b
x3=c
ولی بعد از اجرای برنامه اینجوری میشه:
x1=c
x2=c
x3=c

مشکلش چیه؟!



dim data as string= "a,b,c"
Dim arr As String() = data.Split(New Char() {","c})

For x As Integer = 1 To arr.Count - 1
x1 = arr(x).ToString
x2 = arr(x).ToString
x3 = arr(x).ToString
Next

محمد آشتیانی
جمعه 23 مرداد 1394, 02:12 صبح
سلام
شما سه متغیر x1 , x2 و x3 رو همزمان داخل حلقه For نوشتید ، این یعنی هر سه این متغیرها ، با هربار اجرای حلقه مقدار دهی میشوند ، هرسه هم با یک مقدار یکسان
بنابراین ، طبیعیه که شما در انتهای اجرای حلقه مقدار آخرین خونه آرایه رو در هر سه متغیر ببینید.

کافیه عملیات مورد نظرتون رو در هر بار اجرای حلقه انجام بدید ، مثلا

Dim data as string= "a,b,c"
Dim arr As String() = data.Split(New Char() {","c})

For x As Integer = 0 To arr.Count - 1
MsgBox(arr(x).ToString)
Next


شما به جای اون MsgBox کد مورد نظر خودت روبنویس (مثلا مقدارت رو در دیتابیس بنویس)

پ.ن: حلقه شما باید از صفر شروع بشه (در حال حاضر خونه اول آرایه نادیده گرفته میشه)


موفق باشید.

Heidari66
جمعه 23 مرداد 1394, 09:08 صبح
این کد کامله
اون روش شما منظورم نیست

دیتای من به این صورت تغییر میکنه :

Dim data as string= "sens,a,b,c" '
Dim data as string= "101,1,2"

sens,a,b,c
111,1,2,3
110,1,2
101,1,3
011,2,3

یعنی با تغییر sens من متغییرعای بعدی هم کم و اضافه میشن

Heidari66
شنبه 24 مرداد 1394, 07:48 صبح
دوستان لطفا راهنمایی کنید...

mehdi.safavie
شنبه 24 مرداد 1394, 11:46 صبح
درود حیدری جان

آقا شما نمیتونی همچین کاری رو با For انجام بدی .

ببین اگر 2 مقدار وجود داره ، و 2 فیلد ، نمیتونی با For پرش کنی ، کار نشد نداره ، ولی اگر بخوای از راهی که من میگم شدنش میشه بری ، خیلی خیلی مسخرست .

ببین معنیه حلقه For یعنی : انجام یک کار تکراری ، به تعدادی معلوم .
ولی شما داری یک کار تکراری انجام نمیدی ، به عنوان مثال :
پر کردن فیلد شماره 1 از متغییری که شما دادی یعنی یک کار تکراری ولی به تعداد معلوم ( 3 بار )
اما شما میخوای فیلد شماره 1 و 2 رو با 2 متغییر دیگه پر کنی خب این تکراری به حساب نمیاد ، فیلد 1 = مقدار 1 ، فیلد 2 = مقدار 2
چون هر دو بار کلمه فیلد مساوری شده با مقدار که تکراری نیست ، دفعه اول فیلد (1) بود دفعه دوم فیلد (2) بود همچنین برای مقدار هم دفعه اول (1) یه مقداری بود و دفعه دوم (2) یه مقدار دیگه .

کاری که شما نیاز دارید تو این سوالتون انجام بدید رو باید دستی بنویسید :



dim data as string= "a,b,c"
Dim arr As String() = data.Split(New Char() {","c})

x1 = arr(0)
x2 = arr(1)
x3 = arr(2)


این دقیقا عین این میمونه که شما با دستور کوئری SQL بخواید فیلد های یک بانک دیتابیس رو مقدار دهی کنید . با For چطور امکان داره ؟

Heidari66
شنبه 24 مرداد 1394, 14:40 عصر
دوست عزیز از روش شما قبلا انجام دادم
ولی مشکل اینه که دیتای من متغییره یعین همونجوری که گفتم:


Dim data as string= "sens,a,b,c" '
Dim data as string= "101,1,2"

sens,a,b,c
111,1,2,3
110,1,2
101,1,3
011,2,3

اگر با for نمیشه انجام داد بنظرت راه دیگه ای وجود داره؟

mehdi.safavie
شنبه 24 مرداد 1394, 16:36 عصر
حیدری ، دقیقا میخوای چه کار کنی ، من هیچ نمیتونم درک کنم قضیه چیه اصلا تا یه راهی به ذهنم برسه .
ببین من از Split اینطوری استفاده میکنم :



Dim x As String = "a,b,c,d,e,f"


For i = 0 To 5
MsgBox(Split(x, ",")(i))
Next


ولی هنوز نمیدونم تو چی میخوای دقیقا .
میخوای که a حتما بره تو x1 و B تو x2 و .... ؟؟؟؟؟
خب چند تا x داری ؟ تا xچند داری ؟ خیلی زیاده ؟
تعداد رشته متغیر Data که با "," جدا شدن با تعداد متغیر های x تو دقیقا برابر هست ؟

تعدادشون همیشه یه مقداره ؟ یا ممکنه یه بار 10 تا x داشته باشی یه بار 20 تا ؟

اینا رو بگو بفهمم قضیه چیه ، اینطوری همش دارم فکر میکنم تو چی میخوای .

Heidari66
شنبه 24 مرداد 1394, 17:14 عصر
واضح گفتم که...
ببین

من یه دیتا از سمت کلاینت از طریق پورت برام میاد به این صورت:


111,1,2,3

110,1,2

101,1,3

011,2,3

دقت کن 111 اول برای حالت فعال و غیرفعال عددای بعدی هست
یعنی اگر دیتای من 111 بود عدد میشه" 1و2و3 و اگر 110 بود میشه 1و2 و اگر 102 بود میشه : 1و3
حالا میخام اینارو وارد دیتابیس کنم یعنی چهارتا ستون دارم که اولی حالت هارو وارد میکنه یعینی اینرو:111 و ستون دوم و سوم و چهارم عددای بعدی رو
طبق اون کدی که گذاشتم شما بفرما چکار کنم
امیدوارم متوجه شده باشی

mehdi.safavie
شنبه 24 مرداد 1394, 17:36 عصر
خب هم من هم محمد آشتیانی گفتیم که :
اولین جوابی که محمد جان داد درسته فقط باید تو جای خودش ازش استفاده کنی .
دیتابیست SQL هست یا اکسس ؟
اگه با SQL هست یه مثال کامل بزارم برات .

در کل همونطور که من گفتم باید دونه دونه اطلاعات رو وارد کنی با For نمیشه .
این یه مثال از SQL :


"insert into Tb_Delete ([Field1],[Field2],[Field3],[Field4]) " & "values (N'" & Split(Data, ",")(0) & "' , '" & Split(Data, ",")(1) & "' , '" & Split(Data, ",")(2) & "' , '" & Split(Data, ",")(3) & "')"


البته یه چیز هم بگم ، به غیر از داده اولی شما که
111,1,2,3 هست بقیه
110,1,3 کمتر از 3 عدد رو به غیر عدد اول میگیره ، یعنی تو اولی به غیر عدد 3 رقمیتون ، 3 تا دیگه عدد گرفته ، بقیه 2 تا عدد گرفته .

محمد آشتیانی
شنبه 24 مرداد 1394, 18:27 عصر
سلام
اگر از ابتدا سوال رو واضح مطرح کنید ، راهنمایی دقیق تر خواهد شد.
موضوع اینه که با دیتای شما ، کافیه اون عدد 3 رقمی رو داشته باشید (که ازش بعنوان sens نام بردید) ، بقیه اعداد رو با توجه به قاعده میتونید بسازید.

این متد کاری که میخواهید رو انجام میده (کافیه دیتایی که از پورت سریال میاد رو بعنوان ورودی بهش بدید ، سه رقم اول باید همون sens باشه)

Private Sub SaveToDb(ByVal inputData As String)


Dim code As String = inputData.Substring(0, 3)
Dim x As New List(Of String)


For i As Integer = 0 To 2
If code.Substring(i, 1) = "1" Then x.Add((i + 1).ToString()) Else x.Add("")
Next


Dim sqlCon As New SqlConnection("Your Connection String")
Dim sqlCmd As New SqlCommand


sqlCmd.Connection = sqlCon
sqlCmd.Parameters.AddWithValue("@sens", code)
sqlCmd.Parameters.AddWithValue("@x0", x(0))
sqlCmd.Parameters.AddWithValue("@x1", x(1))
sqlCmd.Parameters.AddWithValue("@x2", x(2))
sqlCmd.CommandText = "INSERT INTO YourTable (Field1, Field2, Field3, Field4) VALUES (@sens, @x0, @x1, @x2)"


sqlCon.Open()
sqlCmd.ExecuteNonQuery()
sqlCon.Close()


sqlCmd.Dispose()
sqlCon.Dispose()


End Sub


فقط کانکشن استرینگ و نام جدول و فیلدها رو بر اساس دیتابیس خودتون اصلاح کنید.


موفق باشید

Heidari66
یک شنبه 25 مرداد 1394, 08:34 صبح
دوستان شرمنده اذیتتون کردم
آقای آشتیانی یه سوتفاهمی صورت گرفته
دیتای من به این صورت هست که اشتباه بهتون گفتم:

111,233,125,456

110,233,125


101,233,456


011,125,456


یعنی عدد اول (111) برای حالت فعال و غیرفعال هست و سه عدد بعدی متغییر هستن
اگر یکی از عددهای حالت فعال و غیرفعال، صفر شد عدد مربوطه حذف میشه
الان کد شما کار میکنه ولی فقط اعداد 1و2و3 رو وارد میکنه

باز شرمنده اگر اطلاعات ناقص بهتون دادم:خجالت:

mehdi.safavie
یک شنبه 25 مرداد 1394, 09:31 صبح
حیدری ، بابا خوب خودت یه کم سعی کن ، همه جواب ها رو بهت دادیم به خدا

mehdi.safavie
یک شنبه 25 مرداد 1394, 09:32 صبح
لایه لای اون پروژه که بهت دادم یه تایمر با یه برچسب هست ، اونا از تست قبلی جا مونده به پروژه شما ربطی نداره دیگه شرمنده .

Heidari66
یک شنبه 25 مرداد 1394, 10:19 صبح
لایه لای اون پروژه که بهت دادم یه تایمر با یه برچسب هست ، اونا از تست قبلی جا مونده به پروژه شما ربطی نداره دیگه شرمنده .

مهدی جان ممنون
ولی این روش شما رو خودم قبلا انجام دادم ، یه مشکلی که هست باید برای همه حالتها کد بنویسیم که درست نیست
من برای نمونه sens رو سه عدد (111) در نظر گرفتم
اگر یوقت خواستم تعداد عددهارو بیشتر کنم چی؟
مثلا sens رو 11111111 کنم
اونوقت باید برای تمام حالتها کد بنویسیم که مشکله
بنظرم روش محمدآقا بهتره ولی مشکلش همونیه که گفتم که البته فکر کنم خودشون بتونن درستش کنن
شرمنده دیگه من زیاد با دیتابیس و دستوراتش کار نکردم و بلد نیستم

ممنون

محمد آشتیانی
یک شنبه 25 مرداد 1394, 11:28 صبح
سلام
این برای همه حالات کار میکنه

Private Sub SaveToDb(ByVal inputData As String)


Dim inputValues As New List(Of String)(inputData.Split(","))
Dim outputValues As New List(Of String)


Dim outputCounter As Integer = 1


For i As Integer = 0 To inputValues(0).Length - 1


If inputValues(0).Substring(i, 1) = "1" Then
outputValues.Add(inputValues(outputCounter))
outputCounter += 1
Else
outputValues.Add("")
End If


Next




Dim sqlCon As New SqlConnection("Your Connection String")
Dim sqlCmd As New SqlCommand


sqlCmd.Connection = sqlCon
sqlCmd.Parameters.AddWithValue("@sens", inputValues(0))
sqlCmd.Parameters.AddWithValue("@x0", outputValues(0))
sqlCmd.Parameters.AddWithValue("@x1", outputValues(1))
sqlCmd.Parameters.AddWithValue("@x2", outputValues(2))
sqlCmd.CommandText = "INSERT INTO YourTable (Field1, Field2, Field3, Field4) VALUES (@sens, @x0, @x1, @x2)"


sqlCon.Open()
sqlCmd.ExecuteNonQuery()
sqlCon.Close()


sqlCmd.Dispose()
sqlCon.Dispose()


End Sub


فقط اگر طول کد sensبیشترشد ، باید پارامترهای کوئریتون رو هم اضافه کنید ، یعنی اینها:
sqlCmd.Parameters.AddWithValue("@x0", outputValues(0))


و در آخر ، خداوکیلی خودتون هم یک تلاشی بکنید ، این آخرین پاسخم در این تاپیک بود (به این خاطر گفتم که اگر دوباره مسئلتون تغییر کرد منتظر کمک بنده نباشید لااقل)


موفق باشید.