创建了一个特殊的帮助类来连接和使用数据库。
如果不需要或没有经验,使用这样的课程是否合理Entity Framework。请大家指出不足并提出其他意见。
类本身:
public class DBHelper
{
public static string sqlConnectionString = "Data Source=<default>;Initial Catalog=<default>;Persist Security Info=<default>;User ID=<default>;Password=<default>";
public bool connectionOnline = false;
public SqlConnection sqlConnection = null;
public DBHelper(string _DataSource, string _InitialCatalog, string _User, string _Password)
{
string AssebledConnectionString =
"Data Source=" + _DataSource + ";" +
"Initial Catalog=" + _InitialCatalog + ";" +
"Persist Security Info=True;" +
"User ID=" + _User + ";" +
"Password=" + _Password;
connectionOnline = false;
InitializeConnection(AssebledConnectionString);
}
public DBHelper()
{
connectionOnline = false;
InitializeConnection(sqlConnectionString);
}
public DBHelper(string sqlCustomConnectionString = null)
{
connectionOnline = false;
InitializeConnection(sqlCustomConnectionString);
}
public void Dispose()
{
this.DisengageConnection();
sqlConnection = null;
}
void InitializeConnection(string sqlCustomConnectionString = null)
{
try
{
if ((connectionOnline) || (sqlConnection != null)) return;
sqlConnection = new SqlConnection(sqlCustomConnectionString ?? sqlConnectionString);
sqlConnection.Open();
connectionOnline = true;
}
catch
{
connectionOnline = false;
//Не удалось соединиться с базой данных
}
}
void DisengageConnection()
{
if ((!connectionOnline) || (sqlConnection == null)) return;
sqlConnection.Close();
connectionOnline = false;
}
public SqlCommand GetStoredProc(string procedureName)
{
SqlCommand sqlCommand = new SqlCommand(procedureName, sqlConnection)
{
CommandType = CommandType.StoredProcedure
};
return sqlCommand;
}
public DataSet GetDataSet(SqlCommand sqlCommand)
{
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
DataSet dsTable = new DataSet();
sqlDataAdapter.Fill(dsTable);
return dsTable;
}
public DataTable GetResultTable(SqlCommand sqlCommand, int dataTableNumber = 0)
{
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);
DataSet dsTable = new DataSet();
sqlDataAdapter.Fill(dsTable);
if ((dsTable.Tables.Count > 0) && (dsTable.Tables.Count - 1 >= dataTableNumber))
{
return dsTable.Tables[dataTableNumber];
}
else
{
return new DataTable();
}
}
}
使用存储过程的示例:
DBHelper db = new DBHelper();
SqlCommand sqlCommand = db.GetStoredProc("<имя хранимой процедуры>");
sqlCommand.Parameters.AddWithValue("@<имя параметра 1>",<param1_value>);
sqlCommand.Parameters.AddWithValue("@<имя параметра 2>",<param2_value>);
//...
sqlCommand.Parameters.AddWithValue("@<имя параметра N>",<paramN_value>);
//далее действия в зависимости от характера хранимой процедуры
//либо простое исполнение
sqlCommand.ExecuteNonQuery();
//либо получение данных
DataTable dataTable = db.GetResultTable(sqlCommand);
如果无法使用实体框架(例如,您有一个古老的项目)或项目非常非常简单,则可以使用此类类。尽管在后一种情况下,它是非常值得商榷的。
至于缺乏经验,作为使用此类解决方案的论据,这根本不算什么。实体框架,具有 C# 和 DBMS 的知识,很容易掌握。
至于类本身,它是非常可取的:
本质上,您的类只创建一个连接并提供对基于它的低级对象的访问。因此,即使在您的示例中,几乎所有工作仍然需要手工完成。
因此,有必要简化方法调用,以便它们根据数据库对象的名称及其参数立即返回完成的结果,而无需额外的操作。或者编写一个像存储库一样的包装类来解决低级任务。
MS SQL 本身并不坏。只是,如果我没记错的话,它从来都不是 .NET 的唯一 DBMS。另外,如果早些时他,或许可以称得上是一种行业标准的角色,现在情况已经发生了很大的变化。许多 C# 项目使用不是来自 MS 甚至来自 Oracle(例如 PostgreSQL)的 DBMS。
因此,与 DBMS 一起工作的框架的狭隘专业化(因为您决定实际编写自己的),虽然它可能在“核心”项目中成为优势,但总的来说,这些项目将使用它有限的。