ADO.NET: 使用 id 检查名称是否已存在于数据库中
ADO.NET: Check if a name already exists in database using id
我有一种方法可以检查某个名称是否已存在于数据库中。我现在这样做的方式是,首先我通过公司 ID 获取公司名称,然后我用我从 UI
收到的名称作为参数检查名称。
目前的代码量很大,有没有最简单的方法或者我可以改进当前的代码。
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
{
BaseResponse response = new BaseResponse();
string existingCompanyName = null;
using (SqlConnection con = new SqlConnection(connectionString))
{
if (companyId != null)
{
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyID= " + companyId;
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
existingCompanyName = rdr["CompanyName"].ToString();
}
if (string.Equals(existingCompanyName, companyName))
{
response.Status = (int)Status.Failed;
} else
{
response.Status = (int)Status.Success;
}
con.Close();
}
else
{
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyName= '" + companyName + "'";
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
response.Status = (int)Status.Failed;
}
con.Close();
}
}
return response;
}
我会选择类似的东西。调试它,因为我还没有完全测试它
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
{
BaseResponse response = new BaseResponse() { Status = (int)Status.Success};
string sqlQuery = "SELECT Count(*) FROM CompanyInformation where ";
SqlParameter param;
if (companyId != null)
{
param = new SqlParameter("@companyId", companyId);
sqlQuery += "CompanyId = @companyId";
}
else
{
param = new SqlParameter("@companyName", companyName);
sqlQuery += "CompanyName = @companyName";
}
using (SqlConnection con = new SqlConnection(_connectionString))
{
SqlCommand cmd = new SqlCommand(sqlQuery, con);
cmd.Parameters.Add(param);
con.Open();
int count = (int)cmd.ExecuteScalar();
if (count > 0)
{
response.Status = (int)Status.Failed;
}
con.Close();
}
return response;
}
我想至少有几种方法可以使它更容易或改进您的代码。
但让我提出一些我认为很重要的 考虑因素:
¿ 是否需要从 CompanyInformation table 中获取 all 字段?
通常执行 SELECT *
并不是一个好的做法,因为您可能正在获取您可能不需要的字段。此外,如果将来向该 table 添加更多列,由于 *(星号),这些字段也将被提取。
这里有一个 complete answer to that topic on Whosebug.
另一方面,根据您所说的:从 UI 作为参数接收。
如果您不验证从 UI 传递的内容然后将其直接放入您的查询,则可以创建 SQL Injection
。如果这是 产品代码 你应该尽量避免使用它。更多关于 SQL Injection in here.
最后,我建议改进您的代码是在您的 SQL 语句中使用 OR。
Here you can find how to do that
它会是这样的(只作为一个指导方针,而不是一个完整的解决方案):
SELECT column1, column2 -- the Columns that you really need to fetch
FROM CompanyInformation
WHERE CompanyID= companyId OR CompanyName= 'companyName' --you need to pass this properly
我希望它能为您提供一些改进方法的提示。
我有一种方法可以检查某个名称是否已存在于数据库中。我现在这样做的方式是,首先我通过公司 ID 获取公司名称,然后我用我从 UI
收到的名称作为参数检查名称。
目前的代码量很大,有没有最简单的方法或者我可以改进当前的代码。
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
{
BaseResponse response = new BaseResponse();
string existingCompanyName = null;
using (SqlConnection con = new SqlConnection(connectionString))
{
if (companyId != null)
{
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyID= " + companyId;
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
existingCompanyName = rdr["CompanyName"].ToString();
}
if (string.Equals(existingCompanyName, companyName))
{
response.Status = (int)Status.Failed;
} else
{
response.Status = (int)Status.Success;
}
con.Close();
}
else
{
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyName= '" + companyName + "'";
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
response.Status = (int)Status.Failed;
}
con.Close();
}
}
return response;
}
我会选择类似的东西。调试它,因为我还没有完全测试它
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
{
BaseResponse response = new BaseResponse() { Status = (int)Status.Success};
string sqlQuery = "SELECT Count(*) FROM CompanyInformation where ";
SqlParameter param;
if (companyId != null)
{
param = new SqlParameter("@companyId", companyId);
sqlQuery += "CompanyId = @companyId";
}
else
{
param = new SqlParameter("@companyName", companyName);
sqlQuery += "CompanyName = @companyName";
}
using (SqlConnection con = new SqlConnection(_connectionString))
{
SqlCommand cmd = new SqlCommand(sqlQuery, con);
cmd.Parameters.Add(param);
con.Open();
int count = (int)cmd.ExecuteScalar();
if (count > 0)
{
response.Status = (int)Status.Failed;
}
con.Close();
}
return response;
}
我想至少有几种方法可以使它更容易或改进您的代码。 但让我提出一些我认为很重要的 考虑因素:
¿ 是否需要从 CompanyInformation table 中获取 all 字段?
通常执行 SELECT *
并不是一个好的做法,因为您可能正在获取您可能不需要的字段。此外,如果将来向该 table 添加更多列,由于 *(星号),这些字段也将被提取。
这里有一个 complete answer to that topic on Whosebug.
另一方面,根据您所说的:从 UI 作为参数接收。
如果您不验证从 UI 传递的内容然后将其直接放入您的查询,则可以创建 SQL Injection
。如果这是 产品代码 你应该尽量避免使用它。更多关于 SQL Injection in here.
最后,我建议改进您的代码是在您的 SQL 语句中使用 OR。 Here you can find how to do that
它会是这样的(只作为一个指导方针,而不是一个完整的解决方案):
SELECT column1, column2 -- the Columns that you really need to fetch
FROM CompanyInformation
WHERE CompanyID= companyId OR CompanyName= 'companyName' --you need to pass this properly
我希望它能为您提供一些改进方法的提示。