[ad_1]
كيف يمكنني إجراء هذا الاستعلام عن طريق قاعدة بيانات 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 }
[ad_2]
コメント