[ad_1]
我如何通过 C# 和 Access 数据库而不是 Sql 服务器进行此查询
我的意思是,如何使用 Max 函数将 null 值替换为 1
C#
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 替换 null 值
在最大函数中。
解决方案1
您的代码存在一些问题,需要进行潜在的改进
1. SQL Injection Vulnerability:
该代码直接将 Result 变量连接到 SQL 查询字符串中,这可能会导致 SQL 注入漏洞。 您应该使用参数化查询来防止这种情况。
C#
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() 行永远不会被执行,因为它们位于 return 语句之后。 最好使用 using 语句来确保正确处置资源。 这是您的代码的更新版本:
C#
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 数据库代码的方法:
C#
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]
コメント