مشکل در دستورات sql - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل در دستورات sql

+1 امتیاز

سلام دوستام مشکل این کد ما چیه؟ 

خطایی که میده اینه: 

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_imgTBL_userTBL1". The conflict occurred in database "pic_gallery", table "dbo.userTBL", column 'userid'.
The statement has been terminated.

عکس جدول ها:

عکس 1

عکس 2

protected void Button1_Click(object sender, EventArgs e)
    {
        string cn = "Data Source=DANI-PC;Initial Catalog=pic_gallery;Integrated Security=True";
        SqlConnection c = new SqlConnection(cn);
        c.Open();
        string qu = string.Format("select userid from userTBL where username='{0}'",lblstate.Text  );
        SqlDataAdapter  da = new SqlDataAdapter (qu, c);
        DataTable dt = new DataTable();
        da.Fill(dt);
        c.Close();
        //////////////////////////////////////

        if(FileUpload1.HasFile)
        {
            string filename = FileUpload1.FileName;
            FileUpload1.PostedFile.SaveAs(Server.MapPath("~/user-image/" + filename));
            string strcon = "Data Source=DANI-PC;Initial Catalog=pic_gallery;Integrated Security=True";
            SqlConnection con = new SqlConnection(strcon);
            con.Open();
            string query = string.Format("insert into imgTBL (image,userid) values('{0}','{1}')", "~/user-image/" + filename, dt);
            SqlCommand com = new SqlCommand(query ,con);
            com.ExecuteNonQuery();
            con.Close();
           

        }
    }

 

سوال شده خرداد 17, 1394  بوسیله ی daniyaltjm (امتیاز 840)   47 88 103
ویرایش شده خرداد 17, 1394 بوسیله ی daniyaltjm
سلام.
عکس جدول رو هم میتونید قرار بدین؟
شما کوئری رو در SQL تست میکنید؟
بله الان میزارم؛ نه من با سی شارپ وصل میشم

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

شما در این کوئری

string.Format("select userid from userTBL where username='{0}'",lblstate.Text  );

قصد دارید که با توجه به  username اطلاعاتی از فیلد userid رو انتخاب کنید اما فیلد username رو در جدولتون تعریف نکردین بنابراین یک فیلدی به نام username در جدول userTBL ایجاد کنید.

و به همین ترتیب در جدول imgTBL فیلدی به نام image با نوع داده ای مورد نظرتون تعریف کنید ببینید به پاسختون میرسید یا خیر؟  

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

 

شما میتونید از datatable و sqldataadapter استفاده نکنید

لطفا این کد رو تست کنید.

                string cn = "Data Source=DANI-PC;Initial Catalog=pic_gallery;Integrated Security=True";
                SqlConnection c = new SqlConnection(cn);
                SqlCommand cmd = new SqlCommand(string.Format("select Top 1 userid from userTBL where username='{0}'", lblstate.Text), c);
                c.Open();
                int userid = (int)cmd.ExecuteScalar();
                if (FileUpload1.HasFile)
                {
                    string filename = FileUpload1.FileName;
                    FileUpload1.PostedFile.SaveAs(Server.MapPath("~/user-image/" + filename));
                    string query = string.Format("insert into imgTBL (userid, image) values({0}, '{1}')", userid, "~/user-image/" + filename);
                    SqlCommand com = new SqlCommand(query, c);
                    com.ExecuteNonQuery();
                }
                c.Close();

 

متد ExecuteScalar:

متد ExecuteScalar تنها با سلول [0][0]  جدول کار داره و مقادیر اون رو میخونه.

 مثال: یک select  انجام شده و تعدادی رکورد برگشت داده شدن.

متد ExecuteScalar تنها با اولین خانه یعنی id  شماره 1 کار داره و مقادیر دیگر رو نادیده میگیره.

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

نکته: احتمال داره اولین خانه یا سلول برابر با نوع های داده ای دیگه باشه و یا اینکه هنگام select هیچ مقداری در خانه اول نباشه (null باشه) بنابراین خیلی مهمه که مدیریت خوبی رو این متد انجام بشه. اما طبق توضیحات شما حتما مقداری از نوع عددی در برنامه شما برگشت داده خواهد شد.

SQL:

http://www.w3schools.com/sql/

کتاب:

http://dl.irpdf.com/ebooks/Part27/www.irpdf.com(8339).pdf

موفق باشید.

پاسخ داده شده خرداد 17, 1394 بوسیله ی امیدوار (امتیاز 872)   20 63 76
ویرایش شده خرداد 18, 1394 بوسیله ی امیدوار
نه insert رو میگم
پاسخ رو ویرایش کردم
عذر میخوام پاسخ رو مجددا ویرایش کردم
خیلی ممنون کدتون کار کرد ! فقط بعضی جا هاشو نمیفهمم مثل:Top 1 و int userid = (int)cmd.ExecuteScalar();
خواهش میکنم دوست عزیز لطف داری
  با Top 1 اولین رکورد که پیدا شد جستجو متوقف میشه البته نمیدونم کلید اصلی به طور اتوماتیک دارای دستور Top 1 است یا خیر.
http://www.7khatcode.com/7207/توقف-در-حین-اجرای-یک-کوئری-با-دستورات-sql
و برای متد ExecuteScalar  مجددا پاسخ رو ویرایش کردم :)
...