我熟悉编程中面向对象的主要概念,目前我正在自学如何设计课程。
我有一个非常简单的类calld公司。这是我到目前为止的代码
using System;
namespace Addressbook
{
public class Company
{
private string _companyId;
private string _companyName;
private string _companyType;
private string[] _companyDetails;
public Company()
{
}
public string CompanyId
{
set
{
this._companyId = value;
}
}
public string CompanyName
{
set
{
this._companyName = value;
}
}
public string CompanyType
{
set
{
this._companyType = value;
}
}
public string[] GetCompanyDetails()
{
return null;
}
}
}
我现在要做的是实施一些方法,以及我失去的那些方法。
我想到的第一种方法称为GetCompanyDetails()
,它将从SQL数据库中收集数据然后显示它。可能在DataGridView或其他东西。
我的问题是我无法弄清楚应该如何编写这种方法。我是否将所有SQL查询和连接放在其中?或者我只是将它们的实例作为参数传递?我应该从该方法返回的类型是什么?
有人可以给我一些指导吗?
此外,如果您有关于此主题的任何优秀教程/指南的链接,请发布它们。
谢谢。
答案 0 :(得分:5)
创建表示表中记录的类
public class Company
{
public string CompanyId { get; set; }
public string CompanyName{ get; set; }
public string CompanyType{ get; set; }
}
使用Dapper获取并映射它:
public IEnumerable<Company> GetCompanies()
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
return connection.Query<Company>("SELECT * FROM Companies");
}
}
如果您不想处理ADO.NET,请查看Linq 2 Sql,Entity Framework,NHibernate等重量级ORM。
答案 1 :(得分:4)
在http://martinfowler.com/eaaCatalog/index.html处查看“数据源架构模式”部分中的模式。 ActiveRecord模式可能是您需要开始的模式,尽管您最终可能最终会使用DataMapper / ORM路由。
在敏捷精神中,我最初会保持连接和事务管理非常简单。也许只是这个类中的私有函数。然后我会让每个方法在SQL或SP中定义它的查询并执行它并对结果做一些事情。这样可以将数据访问逻辑保存在适当的位置。
您可能希望将“getter”函数设置为shared / static,这样就不需要实例了。然后你可以写下这样的东西:
var companies = Company.GetCompanyDetails();
虽然超级简单,但这种方法可以让你继续前进,同时仍然可以扩展范围。一旦事情变得越来越复杂,这种方法将变得过于简单。此时,您需要扩展和重构,考虑更强大的连接/事务管理,对象创建和查询。
答案 2 :(得分:2)
首先,你的代码太长旧了。你的代码应该是这样的
public class Company
{
public string CompanyId { get; set; }
public string CompanyName{ get; set; }
public string CompanyType{ get; set; }
}
创建此类时,意味着您创建了一个包含3个字段的对象Company
;
Company.CompanyId
,Company.CompanyName
,Company.CompanyType
所以你现在要做的就是连接到SQL服务器,执行查询以从数据库获取数据并填写对象公司。
示例:
class myConnection
{
public static SqlConnection GetConnection()
{
var company = new Company();
string str = "Data Source=localhost/serer Ip;Initial Catalog = YourDatabaseName;uid =sa;pwd = YourPassword";
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = new SqlCommand("SELECT * FROM Company WHERE CompanyID = 1", conn);
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Company.CompanyId = reader["CompanyID"];
Company.CompanyName = reader["Name"];
Company.CompanyType = reader["Type"];
}
}
}
答案 3 :(得分:2)
首先,我建议您检查一下这个问题:Using an ORM or plain SQL?。如果您不打算执行异国情调和繁重的查询,ORM是您的首选方案
我更喜欢实体框架,但您可以选择其中任何一种。
然后,如果您想深入了解,请查看存储库和工作单元模式。关于在.net:Implementing the Repository and Unit of Work Patterns
中实现它们的文章很好答案 4 :(得分:0)
String conString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
OracleConnection con = new OracleConnection(conString);
string cmdStr = @" SELECT * FROM TABLE WHERE ROW = :param";
OracleCommand cmd = new OracleCommand(cmdStr, con);
OracleDataAdapter da = new OracleDataAdapter(cmd);
da.SelectCommand = cmd;
cmd.Parameters.Add("param", "yourValueHere");
DataSet ds = new DataSet("dataSet");
da.Fill(ds, "dataAdapter");
return ds;
是实现数据库类的好方法。还记得用
标记你的方法[DataObjectMethod(DataObjectMethodType.Select, true)]
如果您希望它可以在您的WPF中实现。
答案 5 :(得分:0)
在下面使用我们正在使用的类文件:
/// <summary>
/// Open the Connection when creating the Object
/// </summary>
class DataAccess
{
public SqlConnection sqlConn ;
public int gConnTimeOut = 0 ;
public DataAccess()
{
string strConn = "";
Classes.GlobVaribles objConStr = Classes.GlobVaribles.GetInstance();
strConn = objConStr.gConString;
gConnTimeOut = objConStr.gQueryTimeOut;
if (strConn == "")
{
XmlAccess XmlFile = new XmlAccess();
strConn = XmlFile.Xml_Read("gConStr");
gConnTimeOut = int.Parse(XmlFile.Xml_Read("gQueryTimeOut"));
objConStr.gConString = strConn;
objConStr.gQueryTimeOut = gConnTimeOut;
}
sqlConn = new SqlConnection(strConn);
sqlConn.Open();
}
/// </summary>
/// Can use to select one value from SELECT statment
/// </summary>
public string SQLER(string strSQL)
{
if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
strSQL = SQLFormat(strSQL);
SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
string strResult = sqlCmd.ExecuteScalar().ToString();
sqlCmd.Dispose();
return strResult;
}
/// </summary>
/// Return Data Set
/// </summary>
public DataSet SQLDT(string strSQL)
{
//conn.Close();
//if (conn.State.ToString() == "Closed") { conn.Open(); }
if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
SqlCommand comm = new SqlCommand();
comm.CommandTimeout = gConnTimeOut;
SqlDataAdapter adapt = new SqlDataAdapter();
comm.CommandText = strSQL;
comm.Connection = sqlConn;
adapt.SelectCommand = comm;
DataSet dtset = new DataSet();
adapt.Fill(dtset);
return dtset;
}
/// <summary>
/// Can use for Execute SQL commands (Insert/Delete/Update)
/// </summary>
public int SQLCX(string strSQL)
{
try
{
if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
strSQL = SQLFormat(strSQL);
SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
sqlCmd.CommandTimeout = gConnTimeOut;
int intResult = sqlCmd.ExecuteNonQuery();
sqlCmd.Dispose();
return intResult;
}
catch (Exception objError)
{
MessageBox.Show("System Error - " + objError.Message.ToString(),"Application Error",MessageBoxButtons.OK,MessageBoxIcon.Error );
return -1;
}
}
/// <summary>
/// Returns a SQL DataReader
/// </summary>
public SqlDataReader DataReader(string strSQL)
{
if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
strSQL = SQLFormat(strSQL);
SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
SqlDataReader dataRed = null;
dataRed = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection);
sqlCmd.Dispose();
return dataRed;
}
/// <summary>
/// Retrun the No of Records
/// </summary>
public int GetNumOfRec(string strSQL)
{
/// Use for get No of Records in SELECT command
try
{
int intResult = -1;
if (sqlConn.State.ToString() == "Closed") { sqlConn.Open(); }
strSQL = SQLFormat(strSQL);
SqlCommand sqlCmd = new SqlCommand(strSQL, sqlConn);
intResult = (int)sqlCmd.ExecuteScalar();
sqlCmd.Dispose();
return intResult;
}
catch (Exception objError)
{
MessageBox.Show("System Error - " + objError.Message.ToString(), "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return -1;
}
}
/// </summary>
/// Fill Listview
/// </summary>
public void ListViewFill(string strSQL, System.Windows.Forms.ListView lstView)
{
if (sqlConn.State.ToString() != "Open") { sqlConn.Open(); }
SqlDataAdapter adapter = new SqlDataAdapter(strSQL, sqlConn);
DataSet ds = new DataSet("glorders");
adapter.SelectCommand.CommandTimeout = gConnTimeOut;
adapter.Fill(ds, "glorders");
DataTable dt = ds.Tables[0];
int colCount = dt.Columns.Count;
lstView.Items.Clear();
Color shaded = Color.FromArgb(240, 240, 240);
int j = 0;
foreach (DataRow row in dt.Rows)
{
string[] subitems = new string[colCount];
object[] o = row.ItemArray;
for (int i = 0; i < colCount; i++)
{
subitems[i] = o[i].ToString();
}
ListViewItem item = new ListViewItem(subitems);
lstView.Items.Add(item);
if (j++ % 2 == 1)
{
item.BackColor = shaded;
item.UseItemStyleForSubItems = true;
}
}
dt.Dispose();
ds.Dispose();
adapter.Dispose();
}
/// </summary>
/// Fill ComboBox
/// </summary>
public void ComboFill(string strSQL, System.Windows.Forms.ComboBox dbCombo)
{
SqlDataReader dbReader = null;
dbReader = DataReader(strSQL);
dbCombo.Items.Clear();
while (dbReader.Read()) { dbCombo.Items.Add(dbReader[0].ToString().Trim()); }
dbReader.Dispose();
}
private string SQLFormat(string strSQL)
{
strSQL = strSQL.Replace("\r", " ");
strSQL = strSQL.Replace("\n", " ");
strSQL = strSQL.Replace("\t", " ");
strSQL = strSQL.Replace(" ", " ");
return strSQL;
}
}
答案 6 :(得分:0)
我的家庭酿造ADO对象映射器: 建立一个简单的类
public class Company
{
public string CompanyId { get; set; }
public string CompanyName{ get; set; }
public string CompanyType{ get; set; }
}
使用此方法进行对象映射:
public List<T> GetData<T>(string SQL, CommandType commandType, string ConnectionString)
{
var objProps = Activator.CreateInstance<T>().GetType().GetProperties();
var returnList = new List<T>();
using (SqlConnection con = new SqlConnection(ConnectionString)) {
using (SqlCommand cmd = new SqlCommand(SQL, con)) {
cmd.CommandType = commandType;
cmd.CommandTimeout = 30000;
try
{
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
var columns = reader.GetSchemaTable().Rows.Cast<DataRow>().Select(row => row["ColumnName"].ToString().ToLower()).ToList();
while (reader.Read())
{
var thisRow = Activator.CreateInstance<T>();
foreach (var prop in objProps)
{
if (columns.Contains(prop.Name.ToLower()))
{
prop.SetValue(thisRow, reader[prop.Name]);
}
}
returnList.Add(thisRow);
}
}
catch (Exception ex)
{
throw ex;
}
finally {
if (con.State != ConnectionState.Closed)
{
con.Close();
}
}
}
}
return returnList;
}
调用这样的方法:
var companyInfo = GetData<Company>("ProcName", CommandType.StoredProcedure, "con-str");