-
تعریف رکورد در #C
سلام دوستان
من به تازه گی برنامه نویسی #C رو شروع کردم اما توی بحث فایل ها و استریم ها مشکل دارم می خواستم بگم که
چطور می شه توی #C رکورد تعریف کرد برای فایل های تصادفی می خوام اگر هم براتون امکان داره یه مثال ساده با توضیح
بدید.
ممنون میشم کمکم کنید :n01:
-
سلام
در این زمان بطور معمول برنامه نویسان نیازی به خواندن و نوشتن فایل ها بطور رکوردی مشابه آنکه در کتوب قدیمی ++C و Basic و... آموزش داده میشود، ندارند.
در حال حاضر برای ذخیره اطلاعات سازماندهی شده دیتابیس های متنوعی داریم، کوچک و بزرگ...
این دیتابیس ها با سادگی، ضمانت، امکانات بیشتر امکان ذخیره سازی و بازیابی تعداد نا محدود جدول های اطلاعاتی با سطرهای بیشمار را میدهد.
وقتی به این جریان پشتیبانی پرس و جو هایی مانند SQL را هم اضافه کنیم باز هم دلایل برای تولید و خواندن مستقیم فایل های رکوردی کمتر میشود.
از گزینه های دیگر ذخیره امروزه میتوان به فرمت XML اشاره کرد که در موارد پیشرفته تر با ZIP شدن هم همراه خواهد شد.
پس برای پروتکل های امروزی دلیل و منطق و کاربرد زیادی برای دسترسی رکوردی نمیتوان یافت.
از گزینه های دیگر هم میتوان سریال کننده ها اشاره کرد که میتوانند هر شی با ارتباطاتش را (به مانند یک گراف) سریالی و دیسریالی کنند.
=====
ولی با این وجود به صرف جنبه تحقیقی و داشتن یک نمونه کد برای پاره ای از موارد ساده struct ای میتوان از کد زیر استفاده کرد.
کد:
public class RecordFile<T>
: IDisposable
{
private readonly System.IO.Stream m_Stream;
private readonly int m_Size;
private readonly byte[] m_Buffer;
public RecordFile(string file)
{
this.m_Stream = new System.IO.FileStream(file, System.IO.FileMode.OpenOrCreate);
this.m_Size = Marshal.SizeOf(typeof(T));
this.m_Buffer = new byte[this.m_Size];
}
public T this[int index]
{
get
{
this.m_Stream.Position = this.m_Size * index;
this.m_Stream.Read(this.m_Buffer, 0, this.m_Size);
IntPtr ptrBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(this.m_Buffer, 0);
return (T)Marshal.PtrToStructure(ptrBuffer, typeof(T));
}
set
{
IntPtr ptrBuffer = Marshal.UnsafeAddrOfPinnedArrayElement(this.m_Buffer, 0);
Marshal.StructureToPtr(value, ptrBuffer, false);
this.m_Stream.Position = this.m_Size * index;
this.m_Stream.Write(this.m_Buffer, 0, this.m_Size);
}
}
public void Dispose()
{
if (this.m_Stream != null) this.m_Stream.Dispose();
}
}
طریقه استفاده
کد:
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public class Row1
{
public sbyte I08;
public short I16;
public int I32;
public long I64;
}
class Program
{
static void Main(string[] args)
{
using (var file = new RecordFile<Row1>(@"d:\file.raw"))
{
var r0 = new Row1()
{
I08 = 1,
I16 = 2,
I32 = 3,
I64 = 4,
};
var r1 = new Row1()
{
I08 = 11,
I16 = 22,
I32 = 33,
I64 = 44,
};
var r2 = new Row1()
{
I08 = 111,
I16 = 222,
I32 = 333,
I64 = 444,
};
//Write...
file[0] = r0;
file[1] = r1;
file[2] = r2;
//Read...
var r9 = file[1];
//...any code...
}
}
}
موفق باشد.
-
ممنون از کمکتون
یه سوال دیگه هم داشتم میخواستم بگم که این کد چه مشکلی داره میخوام اطلاعاتی که وارد تکست باکس ها می کنم
وارد بانک اطلاعاتیم بشه
کد:
private void button1_Click(object sender, EventArgs e) //Line 1
{ //Line 2
SqlConnection con = new SqlConnection(); //Line 3
SqlCommand cmd = new SqlCommand(); //Line 4
con.Open(); //Line 5
cmd.CommandText = "Insert Into stTable(stNo,stName,stSex,stAvr,NumUnit) values(" + textBox1.Text + "," + textBox2.Text + "," + checkBox1.CheckState + "," + textBox4.Text + "," + textBox5.Text + ")"; //Line 6
textBox1.Text = ""; //Line 7
textBox2.Text = ""; //Line 8
checkBox1.Checked = true; //Line 9
textBox4.Text = ""; //Line 10
textBox5.Text = ""; //Line 11
dataGridView1.Update(); //Line 12
dataGridView1.Refresh(); //Line 13
con.Close(); //Line 14
} //Line 15
در ضمن کد خط con.Open(); //Line 5 خطا می گیره خواستم که یه مقدار راهنماییم کنید و بگید که چطور مشکلم رو حل کنم
ممنون از کمکتون:n01:
-
سلام
خیلی منطقی به نظر میرسد که شما باید یک اطلاعاتی از دیتابیس مورد نظر خود بدهید، از موارد بسیار مهم مشترک در کار با انواع دیتابیس ها میتوان (SQLServer, Oracle, PstgreSQL و...) میتوان به چهار مولفه اشاره کرد:
محل سرور شامل نام یا IP رایانه ای که دیتابیس در آن قرار دارد.
نام دیتابیس یا سرویس مربوطه، چیزی که دیتابیس شما را از بین چندین دیتابیس روی یک رایانه متمایز کند.
دو مورد هم برای امنیت اطلاعات شامل نام کاربری و گذرواژه
ما به این اطلاعات و پاره دیگری از تنیمات در مجموع ConnectionString میگوییم که یک متن است و در زمان ایجاد یک xxxConnection باید این اطلاعات را بدهیم.
به عنوان نمونه در یک شرایط عادی شبکه ای برای SQLServer همچین رشته ای خواهد شد:
کد:
Data Source=SERVER;Initial Catalog=DATABASE;User ID=USERNAME;Password=PASSWORD;Persist Security Info=True;
در یک شرایط خاص و کوچک دیگر، اگر سرور و کلاینت یکی باشد (یعنی روی همان رایانه ای که SQLServer روی آن نصب است کار کنید) و از امنیت یکپارچه ویندوز استفاده کنید، رشته ای مانند زیر کافی خواهد بود:
کد:
Data Source=.;Initial Catalog=DATABASE;Integrated Security=True;
نسخه های خاص دیگری از SQLServer داریم که برای مقاصد کوچک تر و جمع و جورتر استفاده میشوند مانند SQLServer Express و یا SQLServer LocalDB که در حال حاضر این آخری همراه VS2012,2013,2014ctp نصب میشود و میتوانید بدون Attach از یک فایل mdf استفاده کرد:
کد:
Server=(localdb)\v11.0;AttachDbFileName=D:\Folder\Database.mdf;Integrated Security=true;
برای اطلاعات بیشتر در خصوص انواع ConnectionString برای انواع دیتابیس ها میتوانید به سایت connectionstrings.com مراجعه کنید.
=====
اما نحوه استفاده در #C
در یک برنامه واقعی و عملی این تنظیم را بطور معمول در فایل های app.config (برنامه های دسکتاپی) یا web.config (برنامه های وبی) ذخیره میکنیم تا از خارج از کدهای برنامه و هر زمان بتوان چهار پارامتر فوق الذکر را کنترل و عوض کرد...
ولی حالا برای انکه کارتان راه بیافتد و به نتیجه شیرین کار کردن کدهایتان برسید، کد زیر را میتوانید استفاده کنید.
کد:
using (var con = new SqlConnection(@"Server=(localdb)\v11.0;AttachDbFileName=D:\Folder\Database.mdf;Integrated Security=true;"))
using (var com = new SqlCommand("Insert Into stTable(stNo,stName,stSex,stAvr,NumUnit) values(@stNo,@stName,@stSex,@stAvr,@NumUnit);", con))
{
com.Parameters.AddWithValue("@stNo", this.textBox1.Text);
com.Parameters.AddWithValue("@stName", this.textBox2.Text);
com.Parameters.AddWithValue("@stSex", this.checkBox1.Checked);
com.Parameters.AddWithValue("@stAvr", this.textBox4.Text);
com.Parameters.AddWithValue("@NumUnit", this.textBox5.Text);
con.Open();
com.ExecuteNonQuery();
}
=====
در آخر باید عرض کنم که مجموعه دستوراتی که در پست قبلی تان نوشته اید شاید برای شروع کار و چند آزمایش خوب و حتی کافی باشند ولی اگر قصد ادامه دادن برنامه نویسی و تولید و عرضه محصول واقعی را داشته باشید، این دستورات مناسب نبوده و ضمن داشتن مشکلات امنیتی، نگه داری سخت و توسعه و بروزرسانی سخت تری خواهند داشت.
روش و تکنولوژی امروزی مورد استفاده Entity Framework-Code First را پیشنهاد میکند که بسیار ساده و کارآمد امکان تبادل اطلاعات با دیتابیس ها را فراهم میکند و با جستجویی کوچک میتوانید نمونه کدهای فراوانی پیدا کنید.
موفق باشید.