ورود

نسخه کامل مشاهده نسخه کامل : syntax دستورات sql‌ در c++.net



sara_she
17-05-2007, 12:32
با سلام
من مي خوام با oledb تو c++.net كار كنم مشكلم نوشتن دستور select همراه با شرط است(where ) نمي دونم متغيري كه مقدار فيلد رو باهاش چك مي كنم بايد چطور بنويسم و ياتعريف كنم مثلا اگر يك textbox‌ داشته باشيم
وقتي به صورت

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مي نويسم چيزي در datagriid نشون نمي ده

someone
18-05-2007, 02:26
سلام.
می تونین به این شکل ازش استفاده کنین :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
وقتی دارین از C++.Net استفاده میکنین ، توجه کنین که از "<-" استفاده کنین نه از " . "

sara_she
20-05-2007, 09:54
بازم سلام
من دستور select‌رو به صورت زير نوشتم ولي بازم خطا مي ده


[LEFT]
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



error C2110: '+' : cannot add two pointers

آرام جان گل
21-05-2007, 01:41
سلام
به اين صورت بنويسيد


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا اين رشته را نمي دونم چطوري مي خواهي استفاده كني فكر كنم راحت بتوني به sql command بفرستي
txtT1 همون تكست باكس شماست

sara_she
21-05-2007, 08:48
نوع string‌ براي c++.net‌شناخته شده نيست و وقتي اين كد رو مي نويسم خطاهاي زير رو مي گيره:


error C2065: 'string' : undeclared identifier

error C2065: 'sql' : undeclared identifier


error C2146: syntax error : missing ';' before identifier 'sql'


در مورد استفاده از كامپوننت ها هم مي خوام كه دستورات sql‌رو با ole‌ و با استفاده از dataadapter و dataset‌ كه تو پست قبل گذاشتم انجام بدم

سوال ديگه اينكه اگه بخوام مقدار textbox رو تو يه متغير بريزم و از اين متغير در عبارت Sql‌ استفاده كنم تعريف اين متغير چگونه است و از چه نوعي است و اين عبارت sql‌ چطور نوشته مي شود.

someone
21-05-2007, 10:34
ببینین شما در C++.Net یه کلاس به نام String دارین نه string.
ضمنا تو آرگومان یه تابع نمیتونین دو تا String رو با هم جمع کنین. باید از یه متغییر کمکی استفاده کنین.
به این شکل :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

sara_she
21-05-2007, 12:22
من كدي به شكل زير ايجاد كردم طبق گفته شما :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


ولي باز هم از + اشكالي به صورت زير مي گيره . قبلا هم كه رشته رو تو خود تعريف ADAPTER قرار مي دادم مشكلي نداشت وقتي كه به جاي TEXTBOX->TEXT از يه مقدار ثابت مثل '123' استفاده مي كردم

خطا:

error C2845: '+' : cannot perform pointer arithmetic on __gc pointer 'System::String __gc

someone
21-05-2007, 14:14
بله! کاملا خطای درستی هست!!!
دقت نکردم که شما از OldSyntax استقاده میکنین.
میتونین از متود Format برای اینکار استفاده کنین.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

الان strTmp مجموع strCmd و textBox1 رو در خودش داره.

sara_she
22-05-2007, 09:30
بازم سلام
من كاري كه شما گفتيد انجام دادم و كد رو به صورت زير نوشتم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


ولي بازم مشكلم حل نشد . در قسمت تعريف strtmp هم textbox و textbox->text رو تست كردم ولي مشكلم بازم باقي است
مشكل اين نيست كه چيزي نشون نمي ده. در واقع برنامه گير مي كنه و خطاي زير رو مي ده



c:\1.bmp

من قبلا با vb.net‌ كار كردم اونجا به صورت زير داشتيم


da=("select * from t1 where code=' " + textbox1.text + " ' ", con1)

ولي اينجا نمي دونم چي كار كنك

someone
23-05-2007, 12:00
دوباره سلام.
error ی که گذاشتین قابل دیدن نیست. باید عکس رو جایی Up کنین و بعد از آدرسش در IMG Tag استفاده
کنین.
اما من یه نمونه ی خیلی ساده براتون نوشتم و خودم هم امتحانش کردن.البته از DataSet و ِDataAdapter
استفاده نشده اما روش کار رو به شما نشون میشه : (یه برنامه ساده ی Console هست )


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
میبینین که از CmdCommand به همون شکلی که گفتم استفاده شده.
اگه باز مشکل حل نشد اطلاع بدین.

sara_she
24-05-2007, 09:00
با سلام
من با توجه به راهنمايي شما كد رو به صورت زير تغيير دادم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

الان براي استفاده از select با يك شرط مشكلي ندارم ولي نمي دونم اگه بخوام چند شرط داشته باشم چطور بايد بنويسم
همين طور براي دستور insert و update‌و Delete


تو vb.net نوشتن دستورات sql خيلي راحتتر بود . اينجا مثل vb.net اين امكان وجود نداره كه كل عبارت رو به صورت كامل بنوسيم ؟مثلأ به شكل زير:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سوال ديگه اينكه اگه بخوام از selectcommand و insertcommand و updatecommand ... خود adapter رو استفاده كنم كه تو قسمت property‌ اون وجود دارند به جاي نوشتن كد هاي Sql ، براي متغيرهام مثل textbox ها و ... چه طور بايد اونا رو به command مورد نظر معرفي كنم ؟ الان به جاي اونا ؟ گذاشته

someone
25-05-2007, 14:35
دوباره سلام.
برای راحت تر شدن میتونین از concat استفاده کنین.
اما فقط در نظر داشته باشین برای رشته هایی که بین "" قرار میگیرن از static_cast استفاده کنین.
مثلا :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

میتونین از شرط های متعددی استفاده کنین. فکر کنم مشخصه.
برای استفاده از property های Adapter Object میتونین به این شکل عمل کنین :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و همین طور در مورد باقی اونها.

sara_she
26-05-2007, 11:05
خسته نباشيد
در مورد كدي كه براي select گذاشتين درست متوجه نشدم چرا شرط textbox‌رو از باقي شرطها جداكردين و بقيه رو با static_cast تعريف كردين؟چون مقدار ثابتي دارند؟و ديگه اينكه چرا مثل كد قبل String::Format استفاده نكردين؟من با دستورات sql تو c++.netاصلا آشنايي ندارم و كلي گيج شدم

براي استفاده از insertcommand و ... هم مشكل من اينه كه وقتي Adapter رو مي سازم به صورت خودكار insertcommand,deletecommand, updatecomman هم مقدار مي گيرند ولي به جاي مقداري كه قراره تو where‌ با فيلد مورد نظر چك بشه علامت ؟ وجود داره چون اين شرط در زمان اجرا مقدارش مشخص مي شه مثلا مقدار گيري textbox‌ توسط كاربر ، من مي خوام تو قسمت كد از اين commandهاي از پيش تعريف شده استفاده كنم و به جاي علامت سوال مقدار بذارم فكر كنم اين كار توسط parameter انجام مي شه مثل كد زير :

dataAdpater.UpdateCommand.Parameters.Add

ولي پارامترهامو تو قسمت parameters‌مربوط به اين كامندها دارم و درواقع فقط مي خوام مقدارشون رو چك كنم نه اينكه addparameter داشته باشم و نمي دونم چطور بايد اين كار رو انجام بدم

اگه مي شه دستورات insertوupdate و delete‌رو هم مثل select كه بالا با چند شرط تعريف كردين برام بذارين كه اگه مشكلم با parameter قابل حل نبود از اين كدنويسي استفاده كنم


با تشكر

someone
27-05-2007, 15:11
وقتی از یه رشته رو به آرگومان یه تابه که از نوع *String هست میفرستین از type-casting باید استفاده کنین.
و چون طول این رشته ثابته از static_cast استفاده میشه.
برای پیوند دادن رشته ها به هم در ++C ، میتونین هم از Format و هم از ConCat استفاده کنین.
من برای اینکه بدونین چطور استفاده میشن براتون گذاشتم. از هر کدوم که راحت تر هست استفاده کنین.

اما در مورد Parameters متوجه منظورتون نشدم.


اگه مي شه دستورات insertوupdate و delete‌رو هم مثل select كه بالا با چند شرط تعريف كردين برام بذارين كه اگه مشكلم با parameter قابل حل نبود از اين كدنويسي استفاده كنم
دقیقا مثل همونه! ولی اگه مشکلتون حل نشد براتون میذارمش.
یه نگاهی هم به لینک های زیر بکنین :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

sara_she
29-05-2007, 09:00
سلام
مثل هميشه از راهنمايي هاي شما واقعأ ممنونم
در مورد دستور select من روش ديگري رو پيدا كردم و تست كردم جواب داد :



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

براي insert و delete و update هم تست كردم
خوشحال مي شم اگه مشكلي تو اين روش وجود داره گوش زد كنيد

در جايي خوندم كه سرعت كار با رشته ها در stringbuilder خيلي بيشتر از + و concat است چون در + و concat ‌در هر مورد استفاده متغير جديدي تعريف شده و حافظه دوباره اختصاص داده مي شود . بنابراين براي كار با رشته ها و متن هاي طولاني strungbuider ‌كاربرد و بهره بيشتري دارد . درسته ؟

در مورد استفاده از + در دستورات sql‌ به صورتي كه در ابتداي تاپيك اطراف textbox1.text‌به كار رفته بود در 2005 تست كردم درست جواب مي داد اين همه تفاوت بين دو نسخه به نظر عجيب مي ياد !!:13:

someone
09-06-2007, 16:31
دوباره سلام.
روشتون درسته. برای نوشتن یه برنامه تنها یه راه وجود نداره.
نکته قابل توجه اینه که شما خیلی خوب و حرفه ای جلو میرین. در مورد StringBuilder کامل درست گفتین.
Concate همیشه حافظه به خودش اختصاص میده. اما در مورد StringBuilder این طور نیست. تنها زمانی که
طول Buffer مورد نظر کوچک باشه این کار انجام میشه. وتا زمانی که این طول مناسب هست از اختصاص
حافظه جدید خبری نیست. البته این ارجعیت در چند مورد وجود داره و صورت کلی نداره. مثلا اگه در برنامه ای
لازم هست که از ورودی String گرفته بشه و تعداد این String ها معلوم نباشه StringBuilder به Concate
ارجعیت داره.
در مورد + این تفاوت به خاطر نوع برخورد 2003 و 2005 در رابطه با pointer هاست شایدم عجیب به
نظر برسه. در مورد String همونطور که قبلا صحبت شد و شما هم اشاره کردین ، اگه برنامه با clr/ کامپایل بشه
مشکلی نداره اما String operators نمیتونن با clr:oldSyntax/ کار کنن و درست نیستن.

sara_she
14-06-2007, 10:09
ممنون از راهنمايي و تشويق شما
از عضويت در اين وبلاگ فعال با اعضاي خوب و با كاردان بسيار خوشحالم

sara_she
17-06-2007, 10:14
سلام

من مي خوام با استفاده از datarow‌و datasetكه با adapterپر شده ركورد به ركورد محتويات جدول رو چك كنم و دنبال يك مقدار خاص در يك ركورد بگردم . قبلا كه از vb.netاستفاده ميكردم تعريف for eachدر اين زمينه خيلي سودمند بود به صورت زير:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولي تو c++.netمشكل پيدا كردم فكر ميكنم for eachرو نمي شناسه. با readerنمي خوام كار كنم

someone
18-06-2007, 16:26
دوباره سلام.
اول باید بگم for each در VS2005 و یا به عبارتی VC++8.0 وجود داره اما در نسخه 7 و یا VS2003 نه.
میتونین با یه for این کار رو انجام بدین. Rows property یه property به نام Count داره که تعداد سطر ها
رو مشخص میکنه. از 0 شروع کنین تا Table[].Rows.Cont بشمرین و تو حلقه dr رو مساوی عدد Rows قرار
بدین. چیزی شبیه کد زیر :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

sara_she
19-06-2007, 09:10
سلام

كد شما رو تست كردم. به جاي Table بايد از Tablesاستفاده كنيم در واقع بعد از <-ds جزو ليست باز شده است.

براي Tables نمي شه پرانتز گذاشت چون وقتي سعي كردم پرانتز بدون پارامتر به كار ببرم يا اينكه شماره جدول يا اسم جدول رو بنويسم خطايي مي گرفت مبني بر اينكه اين term نمي تواند 0 يا 1 پارامتر بگيرد :


error C2064: term does not evaluate to a function taking 1 arguments


وقتي پرانتز نمي گذارم اين اشكال برطرف مي شود ولي فقط در ليست باز شونده جدول Row وجود دارد نه Rows

خلاصه اينكه مشكل من حل نشد . اگه كد رو با c++.net 2003 بذاريد ممنون مي شم

someone
19-06-2007, 18:18
دوباره سلام.آره اشتباه کردم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

راستی! بعد از Tables از bracket استفاده کنین نه پرانتز.

sara_she
20-06-2007, 09:52
كد تست شد ولي شامل error هاي زير بود:

'* error C2845: '[' : cannot perform pointer arithmetic on __gc pointer 'System::Data::DataTableCollection __gc


error C2227: left of '->Rows' must point to class/struct/union


error C2227: left of '->Count' must point to class/struct/union

someone
20-06-2007, 13:37
وای شرمنده!
من بین 2003 ,2005 هنوز هم دچار سوء تفاهم هستم!


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

امیدوارم دیگه مشکلی نداشته باشه. البته من کد رو تست نکردم!
در حال حاظر به 2003 دسترسی ندارم.

sara_she
21-06-2007, 10:03
من امروز قبل از چك كردن پست ها با كلي كلنجار مشكل رو حل كردم . كاملا درسته چيزي كه نوشتيد ممنونم . كلي هم ناراحت شدم كه يه ساعتي درگير حل مشكل بودم ولي دسترسي به اينترنت نداشتم تا كارم سريعتر انجام بشه. آخه من از 7 صبح سركار هستم و اينترنت از 8 وصل مي شه

من كد رو به صورت زير تست و اجرا كردم درست جواب داد:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تو اين قطعه كد تقريبا تمام چيزهايي رو كه در مورد كار با بانك در c++.net2003‌ياد گرفتم به كار بردم . البته شرط مورد نظر هم در دستور Select و هم در if موجود در حلقه forوجود داره و مي شه از هركدومش استفاده كرد

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