نه روز پیش یه پروژه ساده دفترچه تلفن نوشتم، مشکل با ثبت و لود عکس و تاریخ تولد مخاطب دارم
booysusa

 
درود

یه پروژه ساده دفترچه تلفن نوشتم، مشکل با ثبت و لود عکس و تاریخ تولد مخاطب دارم
به اینگونه که در ثبت عکس مخاطب و تاریخ تولد مخاطب در دیتابیس به خطا خوردم

داده عکس را از نوع varbinary گذاشتم و همچنین داده تاریخ رو از نوع DateTime قرار دادم
{ کلاس تاریخ میلادی به شمسی و بلعکس رو هم نوشتم}

قبل از اینکه این پست رو بزارم در نت گشتم و بیشتر مشکلاتم رو برطرف کردم، بجز این موارد که ذکر شد

این یک پروژه ساده هست، اگر امکانش هست اساتید محترم انجمن این پروژه رو دانلود و مشکلم رو برطرف کنن تا بتونم ادامش بدم
پیشاپیش بسیار سپاسگزارم


( در صورت امکان با همون کد نویسی ساده من پیش برید)
لینک دانلود
یک هفته پیش
حاجی شریفی
مؤسس سایت
 
سلام
برای تاریخ که دوتابع ساده ToPersianDateString و ToGeorgianDateTime خودتان پیدا کرده اید، پس کافی است به شکل زیر استفاده کنید:

//frmEditContact
//این خط را در بالای کد اضافه کنید
using Business.Extensions;

//سپس کد زیر را در بارگذاری تان اضافه کنید
mskDateOfBirth.Text = this.Contact.DateOfBirth.ToPersianDateString() ;

//و کد زیر را در تابع کلیک تان
mskDateOfBirth.Text = this.Contact.DateOfBirth.ToPersianDateString() ;



//frmNewContact
//مجدد این خط را در بالای کد اضافه کنید
using Business.Extensions;

//و این را هم در رویداد کلیک تان اضافه کنید
DateOfBirth = mskDateOfBirth.Text.ToGeorgianDateTime() ,


برای افزودن تصویر هم فیلدی به Contacts اضافه کنید و کد Insert و Update و دستور SQL و پارامترها را مانند بقیه موارد اصلاح کنید...

//Contacts.cs
//فیلد را اضافه کنید
public byte[] PicPerson { get; set; }

public bool Insert() { کد داخل تابع را مانند بقیه فیلدها اصلاح کنید }

public bool Update() { کد داخل تابع را مانند بقیه فیلدها اصلاح کنید }



//frmNewContact.cs
public partial class frmNewContact : Form
{
//به عنوان یک نوع راه حل ساده این فیلد را به فرم تان اضافه کنید
private byte[] m_BinaryImage;

private void btnSave_Click(object sender, EventArgs e)
{
Business.Entities.Contact contact = new Business.Entities.Contact()
{
FirstName = txtFirstName.Text,
LastName = txtLastName.Text,
DateOfBirth = mskDateOfBirth.Text.ToGeorgianDateTime() ,
Mobile = txtMobile.Text,
GroupType = bindingSourceGroupType.Current as Business.Entities.GroupType,
//و فیلد ذیتابیس را اینچنین پر کنید
PicPerson = this.m_BinaryImage
};
...
...
}

private void btnInsertPic_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "jpg Files |*.jpg|PNG Files |*.png" ;
if (openFileDialog1.ShowDialog(this) != DialogResult.OK) return;

this.pictureBox1.Image = new Bitmap(openFileDialog1.FileName);
//فیلد فرم را هم با این دستور پر کنید
this.m_BinaryImage = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
}

موفق باشید.
شش روز پیش
booysusa

 
جناب شریفی سپاسگزارم مثل همیشه عالی راهنمایی کردید و تاریخ شمسی کاملا درست در دیتابیس ثبت شد
فقط یک سوال برای ویرایش تاریخ:
من برای درج تاریخ این متد رو گذاشتم
public string PersianDate
{
get
{
return this.DateOfBirth.ToPersianDateString();
}
}

برای همین میتونستم در فرم هام فراخونیش کنم
ولی برای Set کردن ToGeorgianDateTime چطوری باید متدش رو بنویسم؟ که بتونم در فرم ها ازش استفاده کنم
الان من فقط میتونم یک داده رو Get کنم
متد Set کردن رو چطور باید بنویسم؟

این تیکه کد رو که در قسمت frmEditContact در دکمه ذخیره نوشتم خطا میده چون برای نمایش تاریخ هست نه ست کردن تاریخ
mskDateOfBirth.Text = this.Contact.DateOfBirth.ToPersianDateString();


امیدوارم مشکلم رو روشن تونسته باشم توضیح بدم
شش روز پیش
booysusa

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

در مورد درج عکس در دیتابیس:
سوال اول: من داده عکس رو از نوع varbinary در نظر گرفتم، وقتی private byte[] m_BinaryImage; میزنم خطا میده که از 100 کمتر هست و...
کد زیر برای داده از نوع varbinary درست هست؟
public byte[] PicPerson { get; set; }



سوال دوم: برای دکمهInsert این کد درست هست؟
var PicPersonParameters = new SqlCeParameter("@PicPerson", this.PicPerson);
شش روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
متد Set کردن رو چطور باید بنویسم؟

باید از متد برعکسش که ToGeorgianDateTime نام داشت و خودتان در پروژه دارید استفاده کنید.

شاید چیزی شبیه این
public string  PersianDate
{
get { return this .DateOfBirth.ToPersianDateString(); }
set { this .DateOfBirth = value .ToGeorgianDateTime(); }
}


البته میتوانید از کنترلرهایی شبیه این هم استفاده کنید که کار تبدیل را خودکار انجام میدهد:
http://support.h02.ir/fwlink/?LinkId=1002976157


نقل قول نوشته شده توسط: booysusa
وقتی private byte[] m_BinaryImage; میزنم خطا میده که از 100 کمتر هست

متوجه نمیشوم! متن دقیق خطا را قرار دهید.

نقل قول نوشته شده توسط: booysusa
برای دکمهInsert این کد درست هست؟

تقریبا...!
ولی در دستور SQL تان هم ، پارامتر مربوطه را اضافه کنید.

کدتان یکسری مشکلات ریز داشت...
مثلا یکجایی در Insert یا Update بود که یک پارامتر با یک نام مشخص را دو بار Add کرده بودید.
به این موارد هم دقت کنید.
شب خوش.
پنج روز پیش
booysusa

 
درود جناب شریفی عزیز
سپاسگزارم مشکل تاریخ برطرف شد

در مورد ذخیره عکس، هنگام زدن دکمه ثبت اطلاعات این خطا ظاهر میشود
Exception thrown: 'System.ArgumentNullException' in System.Data.SqlServerCe.dll ("Parameterized query expects a parameter value which was not supplied." )

و اینکه در پیام قبل گفته بودید این کد را به فرم اضافه کنم، در کجا و کدام فر؟
//فیلد فرم را هم با این دستور پر کنید

this.m_BinaryImage = System.IO.File.ReadAllBytes(openFileDialog1.FileName);


نقل قول
کدتان یکسری مشکلات ریز داشت...

مثلا یکجایی در Insert یا Update بود که یک پارامتر با یک نام مشخص را دو بار Add کرده بودید.

بله هنوز برای دستور آپدیت اقدام نکردم، گفتم اول Insert را تکمیل کنم سپس برای آپدیت اقدام کنم، (مواردی که فرمودید برطرف شد ولی هنوز برای آپدیت عکس اقدام نکردم، به این دلیل که هنوز در Insert عکس مشکل دارم)
پنج روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
Parameterized query expects a parameter value which was not supplied
احتمالا تعداد پارامتر های داخل دستور SQL تان با تعداد پارامترهایی که Add کرده اید برابر نیست.
مثلا در دستور SQL آمده INSERT INTO ... @a..@b...@c ولی شما دویا چهار پارامتر را Add کرده اید.

نقل قول نوشته شده توسط: booysusa
و اینکه در پیام قبل گفته بودید این کد را به فرم اضافه کنم، در کجا و کدام فر؟
در فرم frmNewContact ورویداد btnInsertPic_Click
کد کامل تابع btnInsertPic_Click در پست دوم موجود است.
از همان کد copy/paste کنید.

موفق باشید.
پنج روز پیش
booysusa

 
درود بر شما
کدهای عکس رو کامل گذاشتم، الان این خطا رو میده
Exception thrown: 'System.InvalidOperationException' in System.Data.SqlServerCe.dll ("@PicPerson : Byte array truncation to a length of 100." )

همون خطایی که گفتم میگه طول 100 و...

هنگامی که به اینجا میرسه این خطا رو میده
myConnection.Open();

int result = myCommand.ExecuteNonQuery();  به این خط میره خطا میده

myConnection.Close();
چهار روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
Byte array truncation to a length of 100

این خطا میگوید که فیلد دیتابیس شما فقط گنجایش 100 بایت را دارد.
یعنی در زمان ساخت دیتابیس فیلد مربوطه را varbinary(100) یا binary(100) گذاشته اید.

برای ذخیره تصویر (و درکل فایل) در SQL Server باید از فیلدها varbinary(max) استفاده کنید.
(دقیق یادم نیست) اگر در نسخه SQL Server Compact (که قدیمی تر است) نوع varbinary(max) را پیدا نکردید، از فیلد نوع image استفاده کنید.
نوع varbinary(max) و image یکی هستند و در SQL Server تا 2GB را میتوانند ذخیره کنند.

سه روز پیش
booysusa

 
درسته جناب شریفی باید برای SqlCompact از گزینه image برای نوع داده دیتابیس استفاده کنم
مشکل ذخیره عکس با کمک شما برطرف شد، اکنون در حال دست و پنجه نرم کردن با نمایش عکس در دیتاگرید ویو هستم

من بخاطر اینکه آموزش ساخت دیتابیس SqlServer رو نمیدونستم رفتم سراغ SqlCompact، لینک آموزش نحوه ساخت دیتابی SqlServer هست بفرستید فرا بگیرم؟
سه روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
برای چیزی شبیه دفتر تلفن، همان SQL Server Compact و یا SQLite مناسب تر است.
سبک و کوچک هستند و نیاز به نصب ندارند والبته برنامه هم قرار نیست در شبکه کار کند.
(متاسفانه تولید نسخه Compact متوقف شده و در حال حاضر SQLite معروف ترین جایگزین در سطح برنامه های خیلی کوچک است که حتی در Xamarin و موبایل هم قابل استفاده است)

خود SQL Server در مقیاس متوسط تا بزرگ و صنعتی قابل استفاده است.
که نگارش های LocalDB و Express تا... Enterprise آن برای سطوح مختلف موجود است.

اگر هدف تان انجام یک پروژه دانشگاه است که برای پروژه تان همین Compact خوب است.
اگر کار نکرده اید و تصمیم به یادگیری هم دارید، پیشنهاد میکنم یک کتاب واقعی تهیه کنید.
مثلا:

راهنمای جامع SQL SERVER
ناشر: کانون نشر علوم
دو روز پیش
booysusa

 
واقعا سپاسگزارم ازتون

سعی می کنم برم سمت SqlServer
دو روز پیش
booysusa

 
ببخشید جناب حاجی شریفی من کانورت کردن عکس رو هرکاری میکنم نمیشه
میخوام در دیتاگرید ویوو نمایش بدمش

این تیکه کدش هست
public List<Contact> Read()
{
string command = "Select * from Contact";
var db = new DataAcsess.DatabaseManager();
var result = db.GetData(command);

var groupTypeList = new GroupType().Read();

List<Contact> lstResult = new List<Contact>();
foreach (DataRow r in result.Rows)
{
Contact contact = new Contact();
contact.ID = Convert.ToInt64(r["ID"]);
contact.FirstName = r["FirstName"].ToString();
contact.LastName = r["LastName"].ToString();
contact.DateOfBirth = Convert.ToDateTime(r["DateOfBirth"]);
contact.Mobile = r["Mobile"].ToString();
contact.PicPerson = (r["PicPerson"]; //در این قسمت خطا دارم، چطور باید تبدیلش کنم؟

//GroupType
GroupType groupType = new GroupType();
var groupTypeID = Convert.ToInt64(r["GroupTypeid"]);
contact.GroupType = groupTypeList.FirstOrDefault(a => a.ID == groupTypeID);

lstResult.Add(contact);
}
return lstResult;
}


دیروز
حاجی شریفی
مؤسس سایت
 
سلام
آن خط را میتوانید، شبیه این بنویسید:
contact.PicPerson = r["PicPerson"] as byte[];

از قالب ریزی پرانتزی هم میشود استفاده کرد ولی با کد فعلی اگر سلول DB-NULL باشد خطا میدهد، اما تبدیل AS این مشکل را ندارد.

مسئله دیگری که قابل ذکر است، عدم استفاده شما از یک ORM است.
اگر از یک ORM (مانند Entity Framework) در کدتان استفاده کنید، این ابزار کمک میکند تا SELECT/INSERT/UPDATE/DELETE-CRUD راحت تری داشته باشید.
مثلا همین حلقه for تان حذف میشود و خود EF میتواند مستقیم List<Contact> را برایتان بسازد.
در کل در پروژه های واقعی وجود یک ORM خیلی کمک میکند.