الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية عمل كنترول يستقبل داله ويعطي ناتجها شبيه بال fx في الاكسل

رائج
بدأه shmookh في 10 ديسمبر 2013 · 93 رد · 6,371 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#51

السلام عليكم أخي طارق..

طبعا أنا ولا مره أتعاملت مع الcrystal report , وأحتاج أضمنه في مشروعي ..من المنتديات والفيدوياهات الي شفتها عرفت كيف اضمنه وأتعامل معاه بحيث انه يعرض بيانات جدول معين,,

السؤال هو هل من الممكن ان هذا التقرير يظهر على أساس إستعلام معين ..لو ممكن ,لو سمحت قلي كيف..

مشكوور مقدماً..

#52

بالتأكيد.

بإستخدم ال View .

حيث نقوم بكتابتها كإستعلام عادي. ونطلبه كجدول.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#53

ممكن لو سمحت توضيح أكثر ولو بمثال بسيط..

#54

السلام عليكم ,,أستاذي الفاضــــل,,,

لو سمحت ممكن تخبرني فيما  إذا كانت  بنية الاستعلام صحيحه أو لا,و كيف أكتبه في الـــــــــC#

select *
from(select *
from table1_name
where g_id=2 and c_type="")as  a 
where a.cid=table2_name.cid,

__________________________________________________

وبشأن الاستعلام الذي يظهر كاview هل يعتبر هذا الكود صحيح منطقيا

int id = check_court_id(cname);
             query = " CREATE VIEW vw_court1 AS SELECT  [cname],[cdegree],[ctype] FROM [courts] WHERE  cid = @id";
             cmd = new SqlCommand(query, connection);
             cmd.Parameters.AddWithValue("@id", id);
             connection.Open();

             connection.Close();

تم تعديل هذه المشاركة بواسطة هلا السروري في 23 ديسمبر 2013 في 17:07

#55

نعم أختي الكريمة، واعذريني على تقصيري بسبب ضيق وقتي.

 

بالنسبة لطريقة كتابة Query، فهي صحيحة سواء ضمن Sql Server أو ضمن #C. نلاحظ أن الـ Query الداخلية ترجع لنا object جديد قمنا بتسميته a. ثم قامت الـ Query الخارجية بطلب البيانات على اساس هذا العنصر الجديد.

 

 

بالنسبة للـ View فنقوم بكتابتها ضمن Sql Server حيث يوجد مجلد يدعي Views نقوم بإضافة واحد جديد. حيث ستظهر لنا الجداول كاملة، نقوم بإختيار الجداول المطلوبة ثم نقوم بإختيار الحقول المطلوبة. وسيقوم Sql Server تلقائياً بتوليدها. أخيراً نحفظها ونعطيها إسمم معين. وتصبح مخزنة ضمنSql Server.

وضمن #C (نتعامل معها كأي جدول أخر، عن طريق إسمها).

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#56

جزاك الله كل الخير أخي,,

ومافي أي تقصير ,بالعكس أنا محرجه منك جدا..

وممتنه لك جدا جدا جدا,,لأني بالفعل أستفدت الكثيييييييييير...

وربنا يبارك لك في وقتك لأنه لا زال في جعبتي الكثير من الاسئله...

تم تعديل هذه المشاركة بواسطة هلا السروري في 23 ديسمبر 2013 في 22:37

#57

السلام عليكم أخي ,,

سبق وأن سألتك عن كيفية الحصول على القيمه الموجوده في الـ datareader ,في حالة أني اريد البحث عن قيم معينه هل هي موجوده أم لا,,

جربت أني أحط القيم الموجوده في list ..واستخدمت

  if (list.Contains(4))//do some thing

بس بدون فايده وكأن شرط if محقق دائما..

تم تعديل هذه المشاركة بواسطة هلا السروري في 24 ديسمبر 2013 في 18:34

#58

وعليكم السلام.

 

هناك عدة طرق للبحث؛ مثلاً لنفرض أننا نريد قراءة جدول المستخدمين والبحث عن إسم معين هو SomeName وفي حال العثور عليه، نقوم بعمل إجراءات معينة.

 

الطريقة الأولى: نستطيع تعريف متغير منطقي bool بقمية بدائية false  وضمن حلقة قراءة البيانات، نقوم بالتحقق من قيم معينة وفي حال وجدناها، نضع قيمة المتغير المنطقي إلى true. وعند الخروج من هذه الحلقة نقوم بفحص المتغير المنطقي والعمل على أساسه. تفيد هذه الطريقة في حالة البحث عن قيمة واحدة، مثل إسم المستخدم وكلمة المرور لمستخدم معين مثلاً:

        public void ReadUsers()
        {
            bool found = false;
            query = "SELECT * FROM [User]";
            cmd = new SqlCommand(query, connection);
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                string name = (string)reader["UserName"];

                if (name == "SomeName")
                    found = true;
            }
            connection.Close();

            if (found)
            {
                // Do something
            }
        }

الطريقة الثانية: هي بتسجيل البيانات المقروءة ضمن List مثلاً كما في مثالك، نقوم بتعبئتها ضمن حلقة القراءة، وبعد الخروج من الحلقة نقوم بالبحث عن البيانات اللازمة، وللبحث ضمن ال List نستطيع استخدام أي نوع من الحلقات for, while, foreach للمرور على عناصر الـ List، ونستطيع أيضاً استخدام Linq وهي مشابهة للإستعلام المكتوب على sql ولكن هذه المرة على مجموعة من البيانات.

        public void ReadUsers()
        {
            List<string> lstNames = new List<string>();
            query = "SELECT * FROM [User]";
            cmd = new SqlCommand(query, connection);
            connection.Open();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                lstNames.Add((string)reader["UserName"]);
            }
            connection.Close();

            foreach (string name in lstNames)
            {
                if (name == "SomeName")
                {
                    // Do something
                }
            }
        }

نستطيع استبدال حلقة foreach بإستخدام Linq to Object وبالتالي يكون لدينا شكل البحث كالتالي:

            var queryNames = from name in lstNames where name == "SomeName" select name;
            if (queryNames.Count() > 0)
            {
                // Do something
            }

قيمة queryNames تحوي على مجموعة البيانات المرجعة من هذا الـ linq

 

إذا كان لديك متسع من الوقت لتنظيم العمل، يمكننا تصميم كلاسات متوافقة مع الجدوال في قاعدة البيانات، وبالتالي بدل أن نقوم بقراءة قيم متعددة في كل مرة، والتعامل مع عدد كبير من المتغيرات، نقوم بالتعامل مع object، يحوي بداخلة نفس القيم الموجودة في الجدول، وهو ما سيعطينا سهولة وقوة في العمل.

ونستطيع أيضاً إستخدام تقينات أخرى للتعامل مع قواعد البيانات مثل Linq To Sql والتي توفر علينا الكثير من الوقت والجهد.

 

With best wishes...

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#59

أخي عملت الي قلتلي عليه ,,بدون فايده أعتقد انه في مشكله في الــ datareader لأني أضفت داخل الدواره تعليمه بس ماتتنفذ!!

             List<int> pri = new List<int>();
             mainform f = new mainform();
             newpage f1 = new newpage();
  


             query = "SELECT prid FROM [user_pr] WHERE  usid = @user_id";
             cmd = new SqlCommand(query, connection);
             cmd.Parameters.AddWithValue("@user_id", id);
             connection.Open();
             SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
             
             {
                 pri.Add((int)dr["prid"]);
                 f.textBox1.Text = "hala";

             }
             connection.Close();

             
                 
   
             foreach (int pr_id in pri)
             {switch(pr_id)
                {case 2:
                      f.label5.Visible = true;
                     break;
                 case 3:
                      f1.toolStripMenuItem3.Visible = true;
                    
                     break;
                 case 4:
                  f1.المؤاشراتToolStripMenuItem.Visible = true;
                     break;
                case 5:
                      f1.استعلامToolStripMenuItem.Visible = true;
                 
                     break;
                 default:
                     break;
             }
             }
#60

إذا لم تتنفذ حلقة while بالتالي reader لا يحوي على أي بيانات ! لو كان هناك مشكلة معينة كان حصل لدينا Exception.

 

إذا كنت متأكدة أن جدول user_pr يحوي على بيانات، قومي بتجربة query السابقة على قاعدة البيانات ضمن Sql Server. هناك ستتأكدي من سبب عدم قراءة البيانات.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#61

نعم أخي جدول ueser_pr يحتوي على بيانات ,ولكني أعتقد أن المشكله في التعليمه:

int id = check_user_id(name);

حيث أنه هناك حقل id في الجدول من النوع int,,,

التعليمه السابقه تستدعي ال method :check_user_id ويفترض ان القيمه الراجعه تكون نفس القيمه المحفوظه ولكن (في أغلب الأحيان!!!!!!!!!!!) القيمه العائده بعد إستدعاء الـــ method تكون 0!!!!!!

مع العلم أنه في بعض الاحيان تكون القيمه هي نفسها التي محفوظه في الجدول..

هل المشكله في عملية ال casting ???

int uid = Convert.ToInt32(cmd.ExecuteScalar());
#62

المشكلة ليست في casting فالطريقة صحيحة

لكن ExecuteScalar ترجع لنا قيمة  اول حقل من أول سطر نقرأه. فربما تكون القيمة المقروءة ليست عدد

 

ما هي وظيفة الميثود بالضبط، حتى نستطيع إيجاد حل أفضل

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#63

الميثود تأخذ رقم المرور تبع المستخدم وترد ال id الخاص به ,,

أحتاج ال id ,حتى أقوم بإدخال الصلاحيات الخاصه بهذا المستخدم في جدول الصلاحيات لأن ال id يعتبر fk .

  public int check_user_id(string password)
         {
             query = "SELECT usid FROM [Users] WHERE  uspass = @password";
             cmd = new SqlCommand(query, connection);
             cmd.Parameters.AddWithValue("@password", password);
             connection.Open();
              int uid = Convert.ToInt32(cmd.ExecuteScalar());
                 connection.Close();
             return uid;
         
         }
#64

نعم فهمت عليك.

لكن الطريقة السابقة طريقة خاطئة منطقيا وبرمجياً، فالمستخدم لا يمكن تحديده من كلمة المرور الخاصة به. فربما كان هناك أكثر من مستخدم بنفس كلمة المرور, وبالتالي كيف نميز بين أي مستخدم نريد !!! نستطيع التحقق من كلمة المرور وإسم المستخدم معاً.

 

لكن هناك طريقة أفضل،

سنقوم بتعريف كلاس يعرف المستخدم User يحوي على Id و UserName و Password ضمن مشروعنا بالشكل:

public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

        public User() { }

        public User(int id, string userName, string password)
        {
            Id = id;
            UserName = userName;
            Password = password;
        }
    }

الآن عندما نقوم بالتحقق من بيانات المستخدم ضمن الميثود VerifyUser والتي كانت من النوع void، نقوم بجعلها ترجع User object في حال نجاح التحقق. وبالتالي أصبح لدينا معلومات المستخدم متوافرة في أي لحظة، ونقوم بإرسال user object كاملاً إلى الواجهة الأخرى.

شكل الميثود الجديد سيكون كالتالي:

public User VerifyUser(string userName, string password)
        {
            User user = null;
            if (string.IsNullOrWhiteSpace(userName))
                throw new Exception("حقل إسم المستخدم فارغ! أدخل إسم صحيح");
            if (string.IsNullOrWhiteSpace(password))
                throw new Exception("حقل كلمة المرور فارغ! أدخل كلمة صحيحة");

            query = "SELECT * FROM [User] WHERE UserName = @userName AND Password = @password";

            cmd = new SqlCommand(query, connection);
            cmd.Parameters.AddWithValue("@userName", userName);
            cmd.Parameters.AddWithValue("@password", password);
            connection.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            if (!reader.Read())
            {
                connection.Close();
                throw new Exception("مستخدم غير صحيح! \nإسم المستخدم أو كلمة المرور خاطئة");
            }
            else
                user = new User((int)reader[0], (string)reader[1], (string)reader[2]); // Read user data

            connection.Close();
            return user; // Return either null or correct user.
        }

الآن في نافذة التحقق من المستخدمين مثلاً عندما طلبنا الميثود السابقة، نقوم بحفظ معلومات المستخدم ضمن user object جديد، ونستطيع بعدها إرسالة إلى نافذة أخرى، كالتالي:

BusinessLogic logic = new BusinessLogic();

        User user = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {

            try
            {
                user = logic.VerifyUser(txtUserName.Text, txtPassword.Text);
                Form2 form = new Form2(user);
                form.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

أصبح هذا الـ user مشترك ويمكننا إرسالة بين النوافذ حسب الحاجة.

 

... Redards

1

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#65

لا ننسى أن Form2 الذي طلبناه سابقا سيكون شكلة مشابه للتالي، للإستفادة أيضا من معلومات User

    public partial class Form2 : Form
    {
        private User CurrentUser;
        public Form2(User user)
        {
            CurrentUser = user;
        }

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#66

شفت ملاحظاتك أستاذي وجاري العمل عليها,,

مع اني عندما قررت أن أخذ رقم المستخدم عن طريق كلمة المرور الخاصه به وليس عن طريق إسمه فكرت بنفس الطريقه (أنه قد يحمل أكثر من مستخدم نفس الاسم ولكن أكيد أن كلمة المرور ستكون مختلفه !!) على العمووووم أكــــــــــــــيــــد سأعدل على الكود وأخذ بنصايحك...

__________________________________________________________________

جديدي اليوم هو الآتي :

                cn = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Path.GetFileName(PathExcel) + ";Extended Properties=Excel 8.0;");                OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", cn);                                              try                {                    OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(command);                    DataSet objDataSet = new DataSet();                    objDataAdapter.Fill(objDataSet);                    dataGridView1.DataSource = objDataSet.Tables[0].DefaultView;                }            catch(OleDbException ex)                {                    MessageBox.Show(ex.Message, "ÑÓÇáÉ ÇáäÙÇã");                }                 finally                 {                    cn.Close();                }                        }///////////////=--------------------       private void InsertToCards()        {                            conn con = new conn();                con.clos();                SqlCommand cmd01 = con.Sqlcon.CreateCommand();                SqlCommand cmd02 = con.Sqlcon.CreateCommand();                SqlCommand cmd03 = con.Sqlcon.CreateCommand();                int CountRowGrid = dataGridView1.Rows.Count;                              string name = textBox1.Text.Trim();                               double rate_s = Convert.ToDouble(textBox2.Text.Trim()); ;                double rate_r = Convert.ToDouble(textBox3.Text.Trim()); ;                string query01 = "";              cmd01.CommandText = query01;                cmd01.CommandType = CommandType.Text;                            SqlDataReader sqlrdr;            con.connect();                          sqlrdr = cmd01.ExecuteReader();                    while (sqlrdr.Read())                    {                        string id = Convert.ToString(sqlrdr.GetProviderSpecificValue(0));                                               idg = Convert.ToInt32(id);                                             }                    con.clos();                    for (int i = 0; i < CountRowGrid-1; i++)                    {                        con.connect();                        string lo = Convert.ToString(dataGridView1.Rows.Cells[0].Value);                        string p = Convert.ToString(dataGridView1.Rows.Cells[1].Value);                        string S = Convert.ToString(dataGridView1.Rows.Cells[2].Value);                        if ((loggin.Trim().Length > 0) && (pass.Trim().Length > 0) && (SN.Trim().Length > 0))                        {                            try                            {                                string query02 = " ";                                cmd02.CommandText = query02;                                cmd02.CommandType = CommandType.Text;                                SqlDataReader sqlrdr02;                                sqlrdr02 = cmd02.ExecuteReader();                                while (sqlrdr02.Read())                                {                                    string id02 = Convert.ToString(sqlrdr02.GetProviderSpecificValue(0));                                    idc = Convert.ToInt32(id02);                                }                                con.clos();                                con.connect();                                string query03 = " ";                                cmd03.CommandText = query03;                                cmd03.CommandType = CommandType.Text;                                cmd03.ExecuteReader();

___________

الكود السابق يفترض أنه يسحب من أكسل الى قاعده البيانات لكن ...

:( :(

في تعليمات مش مفهومه بالمره وهي

 SqlCommand cmd01 = con.Sqlcon.CreateCommand();

أيش قصده بهذه التعليمه؟؟؟؟

وأيضا ..

  string query01 = "";
              cmd01.CommandText = query01;
                cmd01.CommandType = CommandType.Text;

____

#67

وما هو الفرق بين sql connection و OleDbConnection...

بمعنى عندما أنشيء إتصال مع الاكسيل لابد ان يكون من النوع OleDbConnection؟؟؟

,,

في برنامجي كما تعلم مسبقا أني افتح axspreadsheet   ,هل هناك إختلاف في عملية الإتصال؟؟

________

#68

السلام عليكم أخي طارق,,

عارفه أن الكود السابق (دمه ثقيل :wacko: :wacko: )..لكني  محتااااجه عمله ضروري ,,

OleDbConnection cn;
                cn = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + axSpreadsheet1 + ";Extended Properties=Excel 8.0;");

                OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]", cn);
               
               
                try
                {
                    OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(command);
                    DataSet objDataSet = new DataSet();
                    objDataAdapter.Fill(objDataSet);
                   // dataGridView1.DataSource = objDataSet.Tables[0].DefaultView;
                }
            catch(OleDbException ex)
                {
                    MessageBox.Show(ex.Message, "ÑÓÇáÉ ÇáäÙÇã");
                }
                 finally 
                {
                    cn.Close();
                }
        
        
        }

الي فهمته من هذا الكود انه ياخذ كل البيانات الموجوده في الـــ sheet ويضعها في dataadpater,,هذا جلو.. الان كيف أدخل القيم الموجوده في الــ dataadapterلجدول معين مع ألاخذ بعين الإعتبار أن هناك قيم يفترض أن لايتم إدخالها الى قاعدة البيانات أحتاجها فقط لمعرفة ال  id...

 

لو سمحت ضروررررررية جدا مساعدتك لي هذه المره :blush: :blush: :blush: :blush: :blush: :blush: :blush:

تم تعديل هذه المشاركة بواسطة هلا السروري في 28 ديسمبر 2013 في 16:37

#69

بسم الله الرحمن الرحيم

أرجو أن تكوني قد حققتي غايتك في خوارزمية البحث عن المستخدم، أعود وأؤكد أن البحث حسب كلمة المرور خاطئ كلياً، فكما نعلم عندما نقوم بالتسجيل في أي موقع معين فإنه يقوم بالتحقق من عدم وجود إسم المستخدم مسبقاً، أما كلمة المرور فيكتفي بأن تكون مطابقة للمواصفات (أطول من 6 احرف مثلاً).

 

بالنسبة ل OleDB فهو مصمم للعمل على نظام ويندوز للتعامل مع أكثر من مزود أو مخدم للبيانات ( Oracle, ODBC,Access, Paradox, dBASE, Excel, FoxPro, and more)، أما بالنسبة ل sql server فطريقة الربط معه هي SQL Client، هذا يعرف غالباً بإسم الـ Drivers، ويمكنك مشاهدته من ضمن 

Control Panel -> Administrative Tools -> ODBC Data Source (32-64

بالنسبة  cmd.CommandType أو cmd.CommandText فهي طرق لتعريف الـ query، ويمكننا الإستغناء عنها، كما يمكننا كتابتها ضمن sql Command أيضاً، هي فقط لضمان تعريف دقيق للإتصال والطلب من قاعدة البيانات. ما يهمنا هو إتصال صحيح بغض النظر عن طريق كتابته.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#70

بالنسبة ل dataadpater، على حد علمي هي لا تحوي على بيانات، ولكنها تستخدم لتعبة البيانات ضمن Data Set معينة عن طريق الميثود Fill.

 

حيث أن Data Set تحوي على مجموعة من الجداول، وعندما نريد تعبئتها عن طريق data adapterيجب أن نعطيه إسم الجدول أيضاً لنتمكن الوصول اليه لاحقا. dataadpater.Fill(DataSet, TableName)

 وعندما نريد قراءة البيانات نقوم بقراءة DataTable من ضمن DataSet حسب إسم الجدول

حيث أن DataTable تحوي على مجموعة من الأسطر Rows، يمكننا المرور على هذه الأسطر (هي أسطر في الجدول، يفترض أن تكون مشابة للجدول في قاعدة البيانات، عندما قمنا بتعبئة هذا الجدول).

 

-------------------

لكن لدي ملاحظة: أنت تقومين بإستخدام عدة مفاهيم لإنجاز هدف معين، وهذا ما يصعب عليك العمل ويجلب لك العديد من المشاكل انت بغنى عنها، فمثلا كنا نقرء البيانات من قاعدة البيانات بطريقة صرفة بدون استخدام أي طبقة إضافية، 

عندما نقوم بإستخدام DataSet فهي تعتبر طبقة بين برنامجنا وبين قاعدة البيانات، هناك عدة طرق للتواصل مع قاعدة البيانات:

 

1. الطريقة التقليدية التي نعمل عليها حالياً وهي بكتابة quyer يدوياً وإرسالها إلى قاعدة البيانات، وقراءة البيانات يدوياً أيضا.

2. DataSet حيث نقوم بإضافة مكون للمشروع من نوع DataSet نقوم بتنظيم الجدوال عليه وتنظيم الـ Queries فيصبح التعامل مع قاعدة البيانات بمنتهى السهولة، بالطبع تعطينا الطريقة هذه فصل أكبر في طبقات المشروع.

3. Linq To Sql

4. ADO.NET Entity Framework Model

 

فيجب الإعتماد على طريقة واحد ضمن مشروعنا، إلا إذا كان هدف المشروع غير ذلك.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#71

وعليكم السلام ورحمة الله وبركاته..

مشكووووووووووووور جدا ,أخي طارق على تعاونك معي ..

بشأن ملاحظتك,,

أنا لأول مره أتعامل مع قواعد البيانات,ما درسته في مادة قواعد بيانات لم يكن سوى مجرد نظريات ومفاهيم أساسيه ,حتى معمل الماده لم يعطي المادة حقها,,

ووجدت نفسي مطالبةَ بإنجاز مشروع يتعامل مع قواعد البيانات _وغيرها من المفاهيم_ في فترة قصيره لاتكفي للإطلاع والفهم أولا والتطبيق ثانياً,لهذا تجدني أتخبط هنا وهناك لعل وعسى أجد مبتغاي..

لهذا أي نصيحة تبديها ستجدني شاكرة لك وعاملة بها بكل تأكيد..

تقبل شكري وإمتناني..

#72

مرحبا بك اختي الكريمة في أي وقت. واعذريني على انقطاعي.

فقد استشهد اعز صديق على قلبي على ارض سوريا الحبيبة. نحتسبه عند الله شهيدا.

وأسأل الله ان يرحم المسلمين أجمعين.

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#73

السلام عليكم أخي الكريم طارق,,

 

بشأن طرق التعامل مع قاعدة البيانات ,,متى يجب علي أن استخدم الdata set ضمن برنامجي..مع العلم اني بصدد إنشاء تقارير بواسطة ال crystal report وكما قيل لي لابد ان أضمن dataset لإنشاء التقارير منها.

_____________________________________________________________

________________________________________________________________

حاولت اسحب بيانات من الـــــ axspreadsheet من خلال هذا الكود ,,لكن اثناء التنفيذ يطلع خطاء ( can not update,database or object is read only)

            OleDbConnection cn;
                cn = new OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + axSpreadsheet1 + ";Extended Properties=Excel 8.0;");

                OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1]", cn);
                cn.Open();
                OleDbDataReader dr = command.ExecuteReader();
                
                
      
       
           
            if (!dr.Read())
            {
                cn.Close();
                MessageBox.Show("حصل خطأ أثناء عملية حفظ البيانات");
            }
            else
                while(dr.Read())
                {int id=logic.check_court_id((string)dr[0]);
                    logic.insert_court_iss(id,(int)dr[1],(int)dr[2],(int)dr[3],(int)dr[4],(int)dr[5]);

                }
            cn.Close();
            

                 }
#74

وعليكم السلام ورحمة الله

 

في واقع الأمر لم أتعامل مع Crystal Report أو اي نوع من التقارير الآخرى ضمن Windows Forms Application ! مشاريعي كانت على WPF وأنشأت التقارير بواسطة Documents.

لكن ليس هناك أي مشكلة، بالنهاية فإن Crystal Report عبارة عن عنصر من ضمن عناصر NET. وهو بحاجة فقط لمصدر بيانات Data Source، والـ Data Set تعتبر إحدى مزودي هذه المصادر، وطريقة التعامل معها بمنتهى السهولة، لذلك أنصحك بقراءة الموضوع التالي من MSDN يشرح طريقة بسيطة لإنشاء Data Set وإضافتها للمشروع ويوجد بداخله روابط أخرى إذا أردت التوسع:

http://msdn.microsoft.com/en-us/library/ms171897.aspx

 

فيما يخص القراءة من صفحة إكسيل، هناك عدة أمور، على اعتبار طريقة الاتصال بالملف تعمل بشكل صحيح:

1. التحقق من عدم وجود بيانات ضمن reader.Read لا يعتبر هذا خطأ(ليس هناك أي خطأ في حال كان الجدول فارغ مثلاً)، لذلك يجب وضع كود القراءة السابق ضمن try catch، في حال حدوث خطأ معين نظهر الخطأ ضمن catch

2. هناك نقطة مهمة، في حال كان هناك بيانات، وقمنا بالتحقق من الشرط الأول   if (!dr.Read())، هنا إذا كان هناك بيانات سيتم قراء سطر، ثم الإنتقال إلى else والتي تبدأ بقراءة سطر جديد مما يؤدي إلى فقدان السطر الأول، لذلك ضمن try نكتفي بكتابة حلقة while.

3.،خطأ الكتابة إلى قاعدة البيانات، على الأغلب سببه أنه موجود ضمن حلقة while لذلك من الأفضل قراءة البيانات أولاً وتخزينا ضمن list مثلا، ثم بعد الإنتهاء من قرائتها نقوم بكتابتها إلى قاعدة البيانات في حلقة منفصلة، ففي أغلب الأ حيان تكون بيانات معينه تابعة لعنصر معين لذلك لا نستطيع مباشرة كتابتها، نحن بحاجة لأخذ نسخة منها ثم كتابتها إلى قاعدة البيانات.

 

جربي الملاحظات السابقة، وأعلميني بما حصل.

 

بالتوفيق

• • •


[ ربيّ احفظ سوريا الحبيبة]


oFOK7Kd.png

#75

تسلم أخي الكريم..

جاري التجريب في الحال..

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…