مشكلة في لغة C# في قاعدة بيانات Access

برمجة


كيف يمكنني إجراء هذا الاستعلام عن طريق قاعدة بيانات C# وAccess بدلاً من خادم Sql
أعني كيف يمكنني استبدال القيمة الخالية بـ 1 بوظيفة Max

ج#
public Int64 GetAccCode(Int64 Result,FRMAccounts xx)
{
    DataTable dt = new DataTable();             
    dt.Clear();             
    SqlDataAdapter da = new SqlDataAdapter();            
    da = new SqlDataAdapter("select isnull(MAX( AccCode),1) from Accounts where AccParent = " + Result + " ", ConClass.con);             
    da.Fill(dt);              
    Int64 MyNewID;             
    MyNewID = Convert.ToInt64(dt.Rows[0][0]);

    if (xx.AccType.SelectedIndex == 0)
    {
        if (MyNewID ==1)
        {
            MyNewID = int.Parse(Result.ToString() + "0".ToString() + 1);
        }
        else
        {
            MyNewID = (Convert.ToInt64(dt.Rows[0][0]) + 1);
        }
    }
    else if (xx.AccType.SelectedIndex == 1)
    {
        if (MyNewID ==1)
        {
            MyNewID = int.Parse(Result.ToString() + "0".ToString() + "0".ToString() + "0".ToString() + 1);
        }
        else
        {
            MyNewID = (Convert.ToInt64(dt.Rows[0][0]) + 1);
        }
    }

    return MyNewID;
    da.Dispose();            
    dt.Dispose();
}

ما حاولت:

أحاول استبدال القيمة الخالية بـ 1
في أقصى وظيفة.

الحل 1

هناك بعض المشكلات والتحسينات المحتملة في التعليمات البرمجية الخاصة بك مطلوبة
1. SQL Injection Vulnerability:

يقوم الكود بربط متغير النتيجة مباشرة في سلسلة استعلام SQL، مما قد يؤدي إلى ثغرات أمنية في حقن SQL. يجب عليك استخدام الاستعلامات ذات المعلمات لمنع ذلك.

ج#
da = new SqlDataAdapter("SELECT ISNULL(MAX(AccCode),1) FROM Accounts WHERE AccParent = @Result", ConClass.con);
da.SelectCommand.Parameters.AddWithValue("@Result", Result);

Unused Code:

لن يتم تنفيذ السطرين da.Dispose() وdt.Dispose() أبدًا لأنهما يقعان بعد عبارة الإرجاع. من الأفضل استخدام عبارة الاستخدام لضمان التخلص السليم من الموارد. إليك نسخة محدثة من التعليمات البرمجية الخاصة بك:

ج#
public Int64 GetAccCode(Int64 Result, FRMAccounts xx)
{
    DataTable dt = new DataTable();
    using (SqlDataAdapter da = new SqlDataAdapter("SELECT ISNULL(MAX(AccCode),1) FROM Accounts WHERE AccParent = @Result", ConClass.con))
    {
        da.SelectCommand.Parameters.AddWithValue("@Result", Result);
        da.Fill(dt);
    }
    Int64 MyNewID = Convert.ToInt64(dt.Rows[0][0]);
    if (MyNewID == 1)
    {
        MyNewID = Int64.Parse($"{Result}{"0".PadLeft(xx.AccType.SelectedIndex * 2, '0')}1");
    }
    else
    {
        MyNewID = MyNewID + 1;
    }
    return MyNewID;
}

في قواعد بيانات Access، NZ تُستخدم الدالة عادةً لاستبدال القيم الخالية بقيمة أخرى محددة. بالإضافة إلى ذلك، لا يدعم Access المعلمات المسماة مثل SQL Server، لذا ستحتاج إلى استخدام ؟ كعنصر نائب للمعلمات في الاستعلام. إليك كيفية تعديل التعليمات البرمجية الخاصة بك لقاعدة بيانات Access:

ج#
public Int64 GetAccCode(Int64 Result, FRMAccounts xx)
{
    DataTable dt = new DataTable();
    using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT NZ(MAX(AccCode), 1) FROM Accounts WHERE AccParent = ?", ConClass.con))
    {
        da.SelectCommand.Parameters.AddWithValue("@Result", Result);
        da.Fill(dt);
    }
    // Rest of your code
}

コメント

タイトルとURLをコピーしました