PDA

View Full Version : سوال: استفاده از متغیر در select به جای فیلد



rezvan.j
چهارشنبه 17 شهریور 1389, 16:51 عصر
سلام دوستان

به نظرتون چجوری میشه توی یه دستور select از متغیر استفاده کرد ؟
یعنی توی select نوشتم همینطوری که پایین تر می بینید ولی datareader موقع خوندنش ارور میده .

من یه چند تا دستور select شبیه به هم می خوام بنویسم که فقط فیلد اولی که جستجو میشه فرق داره ، مثلا




Select name from tbl



Select family from tbl



Select Id from tbl

و کارهای بعد از select هم مشابه هستند واسه همین اینطوری نوشتم :



if (DropDownList4.SelectedItem.Value == "10")

var = "midfirst";

else if (DropDownList4.SelectedItem.Value == "11")

var = "firstmark";

SqlCommand cmdSel = new SqlCommand("select '" + var + "' from mark where idempless = '" + DropDownList3.SelectedItem.Value + "' and group_id = '" + Label1.Text.Trim() + "'", connect);

SqlDataReader reader;

reader = cmdSel.ExecuteReader();

while (reader.Read())

{

if (reader[var].ToString() != "")

{

reader.Close();

MsgBox1.alert("… ");

TextBox txt1 = new TextBox();


ولی اون خطی که هایلایت کردم ارور داره .
حالا اصلا چنین شیوه ای درسته ؟ میشه چنین چیزی نوشت ؟
و اینکه خطاش اینه



Value Can Not Be Null



Parameter Name : FieldName


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

پلیز هلپ می .
تنکس .

rezvan.j
چهارشنبه 17 شهریور 1389, 17:12 عصر
بعد از چند بار ویرایش باز هم کدها بهم ریخت اینه که از صفحه عکس گرفتم که کدهاش واضح باشه


http://barnamenevis.org/forum/attachment.php?attachmentid=55805&stc=1&d=1284037630

ارور توی خط :

if reader[var].tostring

هستش .

سپاس .

Ali_M.Eghbaldar
چهارشنبه 17 شهریور 1389, 17:36 عصر
سلام
مشکلی در استفاده از متغییر در خط فرمان CommandText نیست.چون رشته رشته است حالا شما با متغییر آن را الحاق کردید.
سوال من ابنجاست چرا از Var استفاده کرده اید ؟ مگه String چه مشکلی داره؟؟؟؟

rezvan.j
چهارشنبه 17 شهریور 1389, 23:54 عصر
سلام
مشکلی در استفاده از متغییر در خط فرمان CommandText نیست.چون رشته رشته است حالا شما با متغییر آن را الحاق کردید.
سوال من ابنجاست چرا از Var استفاده کرده اید ؟ مگه String چه مشکلی داره؟؟؟؟


ببخشید یادم رفت بگم اسم متغیرم هست . :لبخند:

string var ;

Rejnev
پنج شنبه 18 شهریور 1389, 00:16 صبح
موقع الحاق رشته ها و var تک کوتیشن رو بردار( ' )
با این کار خروجی این شکلی میشه که خب درست نیست چون اسم اون ستون معلوم نیست چیه (شما یک فیلد جدید با مقدار var ساختی):



var
var
var
var
...


پ ن:
کلمه var رزرو شده است و بهتره از یک اسم دیگه استفاده کنی تا خواننده دچار مشکل نشه و خوانایی بالا بیاد

rezvan.j
پنج شنبه 18 شهریور 1389, 00:43 صبح
موقع الحاق رشته ها و var تک کوتیشن رو بردار( ' )
با این کار خروجی این شکلی میشه که خب درست نیست چون اسم اون ستون معلوم نیست چیه (شما یک فیلد جدید با مقدار var ساختی):



var
var
var
var
...

پ ن:
کلمه var رزرو شده است و بهتره از یک اسم دیگه استفاده کنی تا خواننده دچار مشکل نشه و خوانایی بالا بیاد




سپاس از توجهتون

یعنی اینجا :

SqlCommand cmdSel = new SqlCommand("select " + var + " from mark where


برای متغیرم '" ++ "' نزارم ؟ فقط " + + " یا چیز دیگه ای منظورتونه ؟

اینطوری ارور دیگه ای داره :
میگه دیتاریدر بسته شده نمی تونم بخونم .

aminghaderi
پنج شنبه 18 شهریور 1389, 01:01 صبح
در ادامه صحبت های دوستان
یه کد نمونه کد می گذارم ، امیدوارم مفید باشه.


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//------------//
//My Using.
//------------//
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Collections.Generic;

public partial class Admin_Default2 : System.Web.UI.Page
{
//----------------//
//My variables.
//----------------//
SqlConnection cnn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sda = new SqlDataAdapter();
DataSet ds = new DataSet();
string Commandtext = "";



//--------------------------------------------------------------------------------//
//My Functions.
//--------------------------------------------------------------------------------//
protected void connect()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = WebConfigurationManager.ConnectionStrings["YaDB"].ConnectionString;
cmd.CommandText = Commandtext;
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "Box");
cmd.ExecuteReader();
cnn.Close();
}
protected void connect_reg()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = WebConfigurationManager.ConnectionStrings["YaDB"].ConnectionString;
cmd.CommandText = Commandtext;
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}



//-------------------------------------------------------------------------------------------------//
//Main Protected.
//-------------------------------------------------------------------------------------------------//
protected void Button1_Click(object sender, EventArgs e)
{
string a = "Amin";
string b = "Barnamenevis.org";
Cmd.Parameters.Clear();
Cmd.Parameters.AddWithValue("@Fild1", a);
Cmd.Parameters.AddWithValue("@Fild2", b);
CommandText = "insert into My-Table (Fild1,Fild2) values ( @Fild1 ,@Fild2);";
Connect();

}
}


برای استفاده از این نوع ادیتور این صورت انجام بدید :
1- ابتدا تصویر ضمیمه شده رو نگاه کنید.
2- انتخاب csharp به عنوان براش.
3- قرار دادن کد ها بین تگ.

موفق باشید.

rezvan.j
پنج شنبه 18 شهریور 1389, 01:25 صبح
در ادامه صحبت های دوستان
یه کد نمونه کد می گذارم ، امیدوارم مفید باشه.


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
//------------//
//My Using.
//------------//
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Collections.Generic;

public partial class Admin_Default2 : System.Web.UI.Page
{
//----------------//
//My variables.
//----------------//
SqlConnection cnn = new SqlConnection();
SqlCommand cmd = new SqlCommand();
SqlDataAdapter sda = new SqlDataAdapter();
DataSet ds = new DataSet();
string Commandtext = "";



//--------------------------------------------------------------------------------//
//My Functions.
//--------------------------------------------------------------------------------//
protected void connect()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = WebConfigurationManager.ConnectionStrings["YaDB"].ConnectionString;
cmd.CommandText = Commandtext;
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
sda.Fill(ds, "Box");
cmd.ExecuteReader();
cnn.Close();
}
protected void connect_reg()
{
ds.Reset();
ds.Clear();
cnn.ConnectionString = WebConfigurationManager.ConnectionStrings["YaDB"].ConnectionString;
cmd.CommandText = Commandtext;
cmd.Connection = cnn;
sda.SelectCommand = cmd;
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}



//-------------------------------------------------------------------------------------------------//
//Main Protected.
//-------------------------------------------------------------------------------------------------//
protected void Button1_Click(object sender, EventArgs e)
{
string a = "Amin";
string b = "Barnamenevis.org";
Cmd.Parameters.Clear();
Cmd.Parameters.AddWithValue("@Fild1", a);
Cmd.Parameters.AddWithValue("@Fild2", b);
CommandText = "insert into My-Table (Fild1,Fild2) values ( @Fild1 ,@Fild2);";
Connect();

}
}


برای استفاده از این نوع ادیتور این صورت انجام بدید :
1- ابتدا تصویر ضمیمه شده رو نگاه کنید.
2- انتخاب csharp به عنوان براش.
3- قرار دادن کد ها بین تگ.

موفق باشید.

سپاس
ممنون بابت توضیح ادیتوره :لبخند:
ولی الان شما دارید یه پارامتر رو بعنوان مقداری که قراره به عنوان مثال اینجا درج بشه رو ارسال می کنید .
اما من می خواستم وقتی می نویسیم


select field name from my table


به جای خود نام فیلد از متغیر استفاده کنم
که فکر کنم مجبورم دستورات رو توی command text بنویسم .
چون خیلی زیاد بودن می خواستم فقط از اسم متغیر استفاده کنم .

aminghaderi
پنج شنبه 18 شهریور 1389, 01:44 صبح
سپاس
ممنون بابت توضیح ادیتوره :لبخند:
ولی الان شما دارید یه پارامتر رو بعنوان مقداری که قراره به عنوان مثال اینجا درج بشه رو ارسال می کنید .
اما من می خواستم وقتی می نویسیم

1.select field name from my table



به جای خود نام فیلد از متغیر استفاده کنم
که فکر کنم مجبورم دستورات رو توی command text بنویسم .
چون خیلی زیاد بودن می خواستم فقط از اسم متغیر استفاده کنم . خواهش می کنم .

string field name;
commandtext="Select " + field name+ "From MyTable";



موفق باشید.

rezvan.j
پنج شنبه 18 شهریور 1389, 01:52 صبح
خواهش می کنم .

string field name;
commandtext="Select " + field name+ "From MyTable";



موفق باشید.

مرسی پس من ادامه بدم سوالم رو :چشمک:

خب اینا رو نوشته بودم . ارور هم نداره
اما توی خطی که می خوام بخونمش توی دیتا ریدر ارور داره و ارورش رو هم نوشتم اون بالا میگه پارامترش باید نام فیلد باشه ( لطفا پست اول ارور و خطی که ارور میده رو یه نگاه بندازید ) برای اون باید چی کار کنم

rezvan.j
پنج شنبه 18 شهریور 1389, 02:14 صبح
if (reader[var].ToString() != "")


از این خط ارور میگیره و میگه :




Value Can Not Be Null



Parameter Name : FieldName

Saman Hashemi
پنج شنبه 18 شهریور 1389, 02:15 صبح
مرسی پس من ادامه بدم سوالم رو :چشمک:

خب اینا رو نوشته بودم . ارور هم نداره
اما توی خطی که می خوام بخونمش توی دیتا ریدر ارور داره و ارورش رو هم نوشتم اون بالا میگه پارامترش باید نام فیلد باشه ( لطفا پست اول ارور و خطی که ارور میده رو یه نگاه بندازید ) برای اون باید چی کار کنم

خوب اگر فیلدهات ترتیبش مشخصه از عدد استفاده کن بجای نام فیلد 0 قرار بدی درست میشه!!

rezvan.j
پنج شنبه 18 شهریور 1389, 02:41 صبح
خوب اگر فیلدهات ترتیبش مشخصه از عدد استفاده کن بجای نام فیلد 0 قرار بدی درست میشه!!
سپاس از پاسخگویی :لبخندساده:

آره مشخصه
من یه جدول دارم شمال یه سری فیلد مثل :
midfirst,firstmark,midsec,....
که با توجه به مقدار دراپ یکی از اینا توی select قرار می گیرن ولی کارهای مشابه برای همشون انجام میشه .

پس یعنی توی همون خطی که ارور داره به جای اینکه از اسم متغیرم (var) استفاده کنم از عدد 0 استفاده کنم

Saman Hashemi
پنج شنبه 18 شهریور 1389, 02:53 صبح
سپاس از پاسخگویی :لبخندساده:

آره مشخصه
من یه جدول دارم شمال یه سری فیلد مثل :
midfirst,firstmark,midsec,....
که با توجه به مقدار دراپ یکی از اینا توی select قرار می گیرن ولی کارهای مشابه برای همشون انجام میشه .

پس یعنی توی همون خطی که ارور داره به جای اینکه از اسم متغیرم (var) استفاده کنم از عدد 0 استفاده کنم

چک نکردم ببینم روی کد شما جواب میده اما اگر از نام ایراد میگیره فقط کافیست بجای اسم ستون ها به ترتیب از 0 عدد بگذارید.

rezvan.j
پنج شنبه 18 شهریور 1389, 03:02 صبح
چک نکردم ببینم روی کد شما جواب میده اما اگر از نام ایراد میگیره فقط کافیست بجای اسم ستون ها به ترتیب از 0 عدد بگذارید.

ایول مرسی جوااااااااااب داد

دمتون بیست و چهار :لبخند:

فکر کنم توی صفحه قبل هم یکی از دوستان گفته بودن ' رو بردارم جواب می داد ولی من دیتاریدر رو توی حلقه بسته بودم بعد ارور می گرفت که دیتاریدر بسته است اصلا توجه نکرده بودم :لبخند:

بازم مرسی از همگی .

aminghaderi
پنج شنبه 18 شهریور 1389, 05:08 صبح
از reader استفاده نکنید ، یه ضعف هایی داره که در مواقع خاص خودشون نشون می ده!!
مثلا :
1- اشغال گذاشتن کانکشن sql تا خواند رکود یا رکورد های مورد نظر .
2- عدم نگه داری داده.
3- مدیریت مستقیم و کدنویس در کارهای پیچیده .
4- و...( مشکلاتی که برای دوستان دیگر شاید اتفاق افتاده باشه.)

به نظر من بهتره از dataset استفاده کنید.

برای خواند از فایل با اسفاده از توابعی که بهتون معرفی کردم (که خودم به کمک همین سایت قبلا نوشته بودم ، البته اگر اشتباه نکنم:اشتباه: (چون بر میگرده به حدود 2 سال پیش)) می تونی از دستورات زیر در رویداد مورد نظر استفاده کنی :

CommandText = "Select * from MyTable";
Connect();
Total = Ds.Tables["Box"].Rows.Count;
for (i = 0; i < Total; i++)
{
Dr = Ds.Tables["Box"].Rows[i];
Box += ["ID"].ToString();
}

برای insert که کد صفحه پیش رو استفاده می کنید ، برای select هم که این کد ، برای delet , update از کد صفحه قبل استفاده کنید ، منتهی دستور اسکیوال رو باید بهش پاس بدید.
اگر مشکل بود ، بگید تا کد بزارم.

یه موردی مادام مد نظرتوت باشه که همیشه سعی داشته باشید یه کد بهینه و خوانا داشته باشید والبته اینکار با حذف تکرار ها صورت می گیره که اگر قرار باشه ما برای هر insert , update , delete یه کد مجزا تعریف کنیم ، هم کد ما شلوغ خواهد شد (در برنامه های چند هزار خطی) و هم دست آخر گیج خواهیم شد.
حالا بحث توسعه در آینده بماند که اونوقت کلا یه برنامه جدید باید بنویسیم.
موفق باشی.

rezvan.j
پنج شنبه 18 شهریور 1389, 15:57 عصر
از reader استفاده نکنید ، یه ضعف هایی داره که در مواقع خاص خودشون نشون می ده!!
مثلا :
1- اشغال گذاشتن کانکشن sql تا خواند رکود یا رکورد های مورد نظر .
2- عدم نگه داری داده.
3- مدیریت مستقیم و کدنویس در کارهای پیچیده .
4- و...( مشکلاتی که برای دوستان دیگر شاید اتفاق افتاده باشه.)

به نظر من بهتره از dataset استفاده کنید.

برای خواند از فایل با اسفاده از توابعی که بهتون معرفی کردم (که خودم به کمک همین سایت قبلا نوشته بودم ، البته اگر اشتباه نکنم:اشتباه: (چون بر میگرده به حدود 2 سال پیش)) می تونی از دستورات زیر در رویداد مورد نظر استفاده کنی :

CommandText = "Select * from MyTable";
Connect();
Total = Ds.Tables["Box"].Rows.Count;
for (i = 0; i < Total; i++)
{
Dr = Ds.Tables["Box"].Rows[i];
Box += ["ID"].ToString();
}

برای insert که کد صفحه پیش رو استفاده می کنید ، برای select هم که این کد ، برای delet , update از کد صفحه قبل استفاده کنید ، منتهی دستور اسکیوال رو باید بهش پاس بدید.
اگر مشکل بود ، بگید تا کد بزارم.

یه موردی مادام مد نظرتوت باشه که همیشه سعی داشته باشید یه کد بهینه و خوانا داشته باشید والبته اینکار با حذف تکرار ها صورت می گیره که اگر قرار باشه ما برای هر insert , update , delete یه کد مجزا تعریف کنیم ، هم کد ما شلوغ خواهد شد (در برنامه های چند هزار خطی) و هم دست آخر گیج خواهیم شد.
حالا بحث توسعه در آینده بماند که اونوقت کلا یه برنامه جدید باید بنویسیم.
موفق باشی.

سپاس خیلی لطف کردید :لبخندساده: مطمئنا بازم مشکل خواهم داشت و باز هم خواهم پرسید .

سه ماه و نیمه دارم روی این پروژه کار می کنم ( اولین کارم هم هست ) فاز اولش سه ماه طول کشید که یه چیزایی آماده شد . الان توی فاز دوم ( یه پروژه جدید باز کردم دارم همون برنامه رو روش اعمال می کنم ) کل بانک و عوض کردم Ajax وارد پروژه کردم و از تابع و اینجور چیزا دارم استفاده می کنم :لبخند:
توی یه فاز دیگه هم باید دوباره از اول پروژه رو پیاده کنم پایین از اول شروع کنم :لبخند:
دیگه وای به حال توسعه :لبخند:

البته امیدوارم بلاخره یه روزی کار درست بشم :بامزه: ( که یه برنامه رو سه بار انجام ندم هر بارم ناقص باشه :لبخند:)

persian_bigboy
پنج شنبه 18 شهریور 1389, 19:14 عصر
اینجوری


1.string field name;2.commandtext="Select " + field name + "From MyTable";
یک space کم داشت :لبخند: