可以覆盖 sql 字符串中的查询吗? C#
Override query in sql string possible? C#
目前我正在使用我的本地 MSSQL 数据库,当我建立连接时一切正常。但这不是我现在要问的问题;我想让我的代码更简洁,我不想有重复的代码或几乎重复的代码。
目前我正在使用一个大型 class,它包含选择、创建、更新 and/or 删除用户的所有方法。但我认为可以使用覆盖代码中 sql 字符串的覆盖字符串更好地写下来。
唯一的问题是我(目前)是一个完全的菜鸟,不知道如何完成这个...请帮忙?作为示例,我设置了两个区域,可能会将它们更改为下面的 classes。
#region Select Data from Database
public DataTable Select()
{
// static method to connect to database
SqlConnection conn = new SqlConnection(myconnstring);
// to hold the data from database
DataTable dt = new DataTable();
try
{
// sql query to get date from database
String sql = "SELECT * FROM tbl_users";
// for executing command
SqlCommand cmd = new SqlCommand(sql, conn);
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// database connection open
conn.Open();
// fill data in datatable
adapter.Fill(dt);
}
catch(Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
finally
{
// closing connection
conn.Close();
}
// return value in datatable
return dt;
}
#endregion
#region Search User on Database using KeyWords
public DataTable Search(string keywords)
{
// static method to connect to database
SqlConnection conn = new SqlConnection(myconnstring);
// to hold the data from database
DataTable dt = new DataTable();
try
{
// sql query to get date from database
String sql = "SELECT * FROM tbl_users WHERE id LIKE '%"+keywords+"%' OR first_name LIKE '%"+keywords+"%' OR last_name LIKE '%"+keywords+"%' OR username LIKE '%"+keywords+"%'";
// for executing command
SqlCommand cmd = new SqlCommand(sql, conn);
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// database connection open
conn.Open();
// fill data in datatable
adapter.Fill(dt);
}
catch (Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
finally
{
// closing connection
conn.Close();
}
// return value in datatable
return dt;
}
#endregion
考虑改变您的整个概念并使用 entity framework。
这样你就可以创建一个到数据库的连接,class 为你在那里的每个主要实体。
之后,您的所有选择、更新、删除等操作都将自动执行,并具有您在 MSSQL 中拥有的所有功能。
(这样评论会很乱)
首先,您必须编写可信赖且没有不必要添加的代码。即:
#region Select Data from Database
public DataTable Select(string sql)
{
DataTable dt = new DataTable();
try
{
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(sql, myconnstring);
// fill data in datatable
adapter.Fill(dt);
}
catch(Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
// return value in datatable
return dt;
}
#endregion
#region Search User on Database using KeyWords
public DataTable Search(string keywords)
{
// to hold the data from database
DataTable dt = new DataTable();
String sql = @"SELECT *
FROM tbl_users
WHERE id LIKE @pattern OR
first_name LIKE @pattern OR
last_name LIKE @pattern OR
username LIKE @pattern";
try
{
using (SqlConnection conn = new SqlConnection(myconnstring))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("@pattern", SqlDbType.Varchar).Value = '%"+keywords+"%';
// database connection open
conn.Open();
// fill data in datatable
tbl.Load(cmd.ExecuteReader());
}
catch (Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
// return value in datatable
return dt;
}
#endregion
先抽空了解一下为什么要用参数,然后怎么用等等。
接下来,您很快就会发现这种模式不灵活,不值得按原样制作成 class。
您也应该考虑远离 DataTable 和 DataSet。查看 Linq 和 Entity Framework (Linq To EF)。其他人已经为您找到了轮子。阅读不同的模式,如 Repository 模式。在专门为其中之一编码之前,还要阅读不同的后端及其 advantagaes\disadvantages,根据您的用例权衡一下。
第 1 步。阅读 https://xkcd.com/327/ 以及您使用的任何解决方案修复 id LIKE '%"+keywords+"%'
我鼓励您研究对象映射器,例如 Dapper,这将使您的方法成为 return 类型(例如用户),而不是原始的 DataTable
。 ORM 可以帮助您进入成功的深渊。
至于重用,您会注意到执行 SELECT 的方法看起来非常相似,因此您可以制作一个辅助方法 DataTable ExecuteSelect(string sql) ,您可以从 Search
和 Select
方法。
你真的必须解决这个 '%"+keywords+"%'
问题。 SQL 注射可不是闹着玩的。
目前我正在使用我的本地 MSSQL 数据库,当我建立连接时一切正常。但这不是我现在要问的问题;我想让我的代码更简洁,我不想有重复的代码或几乎重复的代码。
目前我正在使用一个大型 class,它包含选择、创建、更新 and/or 删除用户的所有方法。但我认为可以使用覆盖代码中 sql 字符串的覆盖字符串更好地写下来。
唯一的问题是我(目前)是一个完全的菜鸟,不知道如何完成这个...请帮忙?作为示例,我设置了两个区域,可能会将它们更改为下面的 classes。
#region Select Data from Database
public DataTable Select()
{
// static method to connect to database
SqlConnection conn = new SqlConnection(myconnstring);
// to hold the data from database
DataTable dt = new DataTable();
try
{
// sql query to get date from database
String sql = "SELECT * FROM tbl_users";
// for executing command
SqlCommand cmd = new SqlCommand(sql, conn);
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// database connection open
conn.Open();
// fill data in datatable
adapter.Fill(dt);
}
catch(Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
finally
{
// closing connection
conn.Close();
}
// return value in datatable
return dt;
}
#endregion
#region Search User on Database using KeyWords
public DataTable Search(string keywords)
{
// static method to connect to database
SqlConnection conn = new SqlConnection(myconnstring);
// to hold the data from database
DataTable dt = new DataTable();
try
{
// sql query to get date from database
String sql = "SELECT * FROM tbl_users WHERE id LIKE '%"+keywords+"%' OR first_name LIKE '%"+keywords+"%' OR last_name LIKE '%"+keywords+"%' OR username LIKE '%"+keywords+"%'";
// for executing command
SqlCommand cmd = new SqlCommand(sql, conn);
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
// database connection open
conn.Open();
// fill data in datatable
adapter.Fill(dt);
}
catch (Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
finally
{
// closing connection
conn.Close();
}
// return value in datatable
return dt;
}
#endregion
考虑改变您的整个概念并使用 entity framework。
这样你就可以创建一个到数据库的连接,class 为你在那里的每个主要实体。
之后,您的所有选择、更新、删除等操作都将自动执行,并具有您在 MSSQL 中拥有的所有功能。
(这样评论会很乱)
首先,您必须编写可信赖且没有不必要添加的代码。即:
#region Select Data from Database
public DataTable Select(string sql)
{
DataTable dt = new DataTable();
try
{
// getting data from database
SqlDataAdapter adapter = new SqlDataAdapter(sql, myconnstring);
// fill data in datatable
adapter.Fill(dt);
}
catch(Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
// return value in datatable
return dt;
}
#endregion
#region Search User on Database using KeyWords
public DataTable Search(string keywords)
{
// to hold the data from database
DataTable dt = new DataTable();
String sql = @"SELECT *
FROM tbl_users
WHERE id LIKE @pattern OR
first_name LIKE @pattern OR
last_name LIKE @pattern OR
username LIKE @pattern";
try
{
using (SqlConnection conn = new SqlConnection(myconnstring))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add("@pattern", SqlDbType.Varchar).Value = '%"+keywords+"%';
// database connection open
conn.Open();
// fill data in datatable
tbl.Load(cmd.ExecuteReader());
}
catch (Exception ex)
{
// throw message if any error accures
MessageBox.Show(ex.Message);
}
// return value in datatable
return dt;
}
#endregion
先抽空了解一下为什么要用参数,然后怎么用等等。 接下来,您很快就会发现这种模式不灵活,不值得按原样制作成 class。
您也应该考虑远离 DataTable 和 DataSet。查看 Linq 和 Entity Framework (Linq To EF)。其他人已经为您找到了轮子。阅读不同的模式,如 Repository 模式。在专门为其中之一编码之前,还要阅读不同的后端及其 advantagaes\disadvantages,根据您的用例权衡一下。
第 1 步。阅读 https://xkcd.com/327/ 以及您使用的任何解决方案修复 id LIKE '%"+keywords+"%'
我鼓励您研究对象映射器,例如 Dapper,这将使您的方法成为 return 类型(例如用户),而不是原始的 DataTable
。 ORM 可以帮助您进入成功的深渊。
至于重用,您会注意到执行 SELECT 的方法看起来非常相似,因此您可以制作一个辅助方法 DataTable ExecuteSelect(string sql) ,您可以从 Search
和 Select
方法。
你真的必须解决这个 '%"+keywords+"%'
问题。 SQL 注射可不是闹着玩的。