View Full Version : مشکل کد چیست
majidsoft
شنبه 14 شهریور 1388, 09:38 صبح
با سلام خدمت دوستان
می خواستم ببینم مشکل این کد چیست من با این کد می خوام به ترتیب از یک table مقادیر یک فیلد را خوانده ور در یک table دیگر در جای خودش قرار دهم
Dim i, k AsInteger
Dim Cnn As SqlConnection = Fn_Get_SqlConnection()
Dim Cmd AsNew SqlCommand("Select * from time1", Cnn)
Dim dr As SqlDataReader
Cnn.Open()
dr = Cmd.ExecuteReader()
While dr.Read()
i = (dr("code"))
k = (dr("hour"))
Dim Cno As SqlConnection = Fn_Get_SqlConnection()
Dim cmo AsNew SqlCommand("select * from time2 ", Cnn)
cmo.CommandText = "Update time2 set code=@code Where code=@hour"
cmo.Parameters.Clear()
cmo.Parameters.Add("@code", SqlDbType.BigInt).Value = i
cmo.Parameters.Add("@HOUR", SqlDbType.BigInt).Value = k
Cno.Open()
cmo.ExecuteNonQuery()
Cno.Close()
EndWhile
Cnn.Close()
ایرادش اینه که می گه دو con با هم نمی توانند باز باشند ولی برای اینکه من یکی یکی اطلاعات را بخوانم مجبورم اینکار را بکنم
با تشکر
mn_zandy63
شنبه 14 شهریور 1388, 10:34 صبح
دو کانکشن با هم میتونن باز باشند.
مشکل شما احتمالا در نحوه استفاده از تابع Fn_Get_SqlConnection است.
حدس میزنم این تابع یک آبجکت Connection ثابت را برمیگردونه.
در این صورت در واقع Cnn و Cno یکی هستند و به یک Object اشاره میکنند.
و خطایی که گرفته میشود این است که در حال حاظر کانکشن باز است. چون یکبار در خط 5 باز شده است.
شما باید یک آبجکت جدید را با همان Connection String قبلی بسازید.
میتوانید تابع Fn_Get_SqlConnection را اصلاح کنید و یا علی الحساب به این صورت مشکل خود را حل کنید.
Dim Cno As new SqlConnection(cnn.ConnectionString)
و یک پیشنهاد دیگه،
پیشنهاد میکنم Cno رو قبل از حلقه باز کنید و در پایان حلقه ببندید (بیرون حلقه).
باز کردن و بستن کانکشن در حلقه سرعت کارتون رو پایین میاره.
Dim i, k As Integer
Dim Cnn As SqlConnection = Fn_Get_SqlConnection()
Dim Cmd As New SqlCommand("Select * from time1", Cnn)
Dim dr As SqlDataReader
Cnn.Open()
dr = Cmd.ExecuteReader()
Dim Cno As new SqlConnection(cnn.ConnectionString)
Cno.Open()
While dr.Read()
i = (dr("code"))
k = (dr("hour"))
Dim cmo As New SqlCommand("select * from time2 ", Cnn)
cmo.CommandText = "Update time2 set code=@code Where code=@hour"
cmo.Parameters.Clear()
cmo.Parameters.Add("@code", SqlDbType.BigInt).Value = i
cmo.Parameters.Add("@HOUR", SqlDbType.BigInt).Value = k
cmo.ExecuteNonQuery()
End While
Cno.Close()
Cnn.Close()
موفق باشید.
majidsoft
شنبه 14 شهریور 1388, 13:05 عصر
با تشکر از شما دوست عزیز هنگام اجرا پیام می ده datareader باید بسته بشه هنگام
cmo.executenonquery
mn_zandy63
یک شنبه 15 شهریور 1388, 05:08 صبح
سلام دوست عزیز،
این خط کدت هم ایراد داره، به علت تشابه اسمی دفعه قبل متوجهش نشده بودم، شما Command دومت رو هم به همون کانکشن اول وصل کردی. یعنی اصلا کانکشن دوم رو استفاده نکردی کافیه درستش کنی.
به جای:
Dim cmo As New SqlCommand("select * from time2 ", Cnn)
بنویس:
Dim cmo As New SqlCommand("", Cno)
راستی مقداری که به Command ت داده بودی هم استفاده نکرده بودی، به همین خاطر خالیش کردم. :چشمک:
majidsoft
یک شنبه 15 شهریور 1388, 09:42 صبح
با تشکر
من کد را اصلاح کرده بودم و درست شد
حالا سوال من این است که آیا می توان آنجا که [1] نوشته ام و شماره ستون است را به عنوان یک متغیر به برنامه بدهیم مثلا i که مقدار این i را از برنامه بگیریم و به ستون مورد نظر برود
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i, k As Integer
Dim Cnn As SqlConnection = Fn_Get_SqlConnection()
Dim Cmd As New SqlCommand("Select * from time1", Cnn)
Dim dr As SqlDataReader
Cnn.Open()
dr = Cmd.ExecuteReader()
Dim Cno As New SqlConnection(Cnn.ConnectionString)
Cno.Open()
While (dr.Read())
i = (dr("code"))
k = (dr("hour"))
Dim cmo As New SqlCommand("select * from time2 ", Cno)
cmo.CommandText = "Update time2 set [1]=" & k & " Where code=" & i & ""
cmo.Parameters.Clear()
cmo.Parameters.Add("@code", SqlDbType.BigInt).Value = i
cmo.Parameters.Add("@HOUR", SqlDbType.BigInt).Value = k
cmo.ExecuteNonQuery()
End While
Cno.Close()
Cnn.Close()
End Sub
mn_zandy63
یک شنبه 15 شهریور 1388, 11:35 صبح
سلام دوست عزیز
در تاپیک قبلی که ایجاد کرده بودی یک راه حل برات نوشتم اینکه با استفاده از شماره ستون، اسم ستون رو پیدا کنی، به این ترتیب مشکلت حل میشه.
یه دونه نمونه کد Stored procedure هم برات گذاشتم همونجا با اون هم میتونی این کار رو انجام بدی.
اینجاست (http://barnamenevis.org/forum/showpost.php?p=797281&postcount=12)
موفق باشی.
majidsoft
یک شنبه 15 شهریور 1388, 17:46 عصر
سلام ببین دوست عزیز من نمخوام از STORE PROCEDURE استفاده کنم شماره ستونها را 1و2و3و... داده ام حالا می خوام به جای [1] از متغیر استفاده کنم یعنی شماره ستون را خودم وارد دکنم مثلا به جای 1 از I استفاده کنم و I را از طریق برنامه مقدار دهی کنم آیا راهی دارد
با تشکر
cmo.CommandText = "Update time2 set [1]=" & k & " Where code=" & i & ""
mn_zandy63
دوشنبه 16 شهریور 1388, 06:31 صبح
ببین دوست عزیز من نمخوام از STORE PROCEDURE استفاده کنم
خب استفاده نکن. Query شو مستقیم بزن. چرا داد میزنی؟
شماره ستونها را 1و2و3و...
ببین 2 تا راه حل برات نوشتم ولی تو هیچی نگفتی که به دردت میخوره یا نه.
یا ستونهات رو بر اساس شمارشون نام گذاری کن بعد راحت ازشون استفاده کن.
یا با اون کوئری که برات نوشتم اول شمارش رو تبدیل به نام کن بعد ازش استفاده کن.
SELECT COL_NAME(OBJECT_ID('Table_Name'), Column_No)
حله؟
majidsoft
دوشنبه 16 شهریور 1388, 17:21 عصر
سلام
نمی دونم منظورم را گرفتی یا نه من 40 ستون دارم که از 1 تا 40 نامگذاری کردم اگر بخوام مثل بالا شماره ستون را بدم باید چهل بار از دستور بالا استفاده کنم ولی من می خوام به جای 1 که در کد بالا نوشتم از متغیر i استفاده کنم که مقدار ستون را داشته باشه وقتی که در بالا i می گذارم ایراد می گیره
بابا کلاس ما پایینه یکم کلاس پایینتر صحبت کن
با تشکر
mn_zandy63
چهارشنبه 18 شهریور 1388, 01:57 صبح
سلام دوست عزیز
اختیار داری.
خب حالا بهتر گرفتم:چشمک:
این که گفتی دقیقا یکی از حالتهایی هست که بهت گفتم دیگه.
فیلدهات رو بر اساس شماره ستون اسم گذاری کردی.
خب یه همچین چیزی بهت جواب نداد؟
cmo.CommandText = "Update time2 set [" & i & "] =" & k & " Where code=" & i
اگه اسم ستونهات 1 و 2 و 3 و ... باشند باید با [1] و [2] و [3] و ... بهشون دسترسی داشته باشی قاعدتا و مشکلی هم نباید داشته باشی.
اینطور نیست؟
موفق باشی.
majidsoft
پنج شنبه 19 شهریور 1388, 00:44 صبح
ایول داداش البته من خودم به جواب رسیدم ولی با اینحال بازم دستت درد نکنه
mn_zandy63
پنج شنبه 19 شهریور 1388, 12:29 عصر
Happy coding :چشمک:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.