[英]Is my approach to query Database using a class correct?
我是編程領域的新手。 我正在嘗試自己學習編程,因此,如果有人可以讓我知道我的方法是否正確,我將不勝感激。
我正在嘗試創建一個類(在C#中),該類可用於在MS-SQL數據庫上運行查詢。 在我剛開始的時候,我正在使用ADO.net。 因此,我決定在代碼中不要創建太多的DB語句,而是創建一個用於查詢DB的類。
我創建一類Dbclass
,並創造了類選擇查詢的方法- SelectQuery
,它返回一個數據集。
下面更加清楚的是我創建的類。
public class Dbclass
{
private SqlConnection DBcon = null;
private string ConStr = "";
public Dbclass(string Constring)
{
this.ConStr = Constring;
DBcon = new SqlConnection(this.ConStr);
}
public DataSet SelectQuery(string[] coloumns,string[] tables,string cond)
{
string col = string.Join(",", coloumns);
string tbl = string.Join(",", tables);
string selectSQL = "SELECT " + col + " FROM " + tbl + cond;
SqlCommand cmd = new SqlCommand(selectSQL, this.DBcon);
SqlDataAdapter ada = new SqlDataAdapter();
DataSet retrnds = new DataSet();
try
{
this.DBcon.Open();
ada.SelectCommand = cmd;
ada.Fill(retrnds);
}
catch (Exception err)
{
string error = err.ToString();
}
finally
{
this.DBcon.Close();
}
return retrnds;
}
}
所以我的問題是,作為初學者,我是否做正確的事來創建這樣的課程? 我的OOP方法正確嗎?
如果有人可以指導我采取更好的方法,那就太好了。
我認為最好使用ORM方法。 您可以像在程序內部的普通對象一樣使用實體,並且與SQL注入攻擊相比,它更安全。
我們在項目中使用Entity,這使我的生活變得非常輕松。 例如,如果我想檢索有錢人的列表:
var minimumSalary = 10000;
var richPeople = database.People.Where(o => o.Salary > minimumSalary).ToList();
您的問題沒有正確答案,但這是我使用的。
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
namespace Core.DataAccess.OleDb
{
public static class DataInterface
{
public static DataTable DoRead(string connectionString, string commandText)
{
return DoRead(connectionString, commandText, new OleDbParameter[] { });
}
public static DataTable DoRead(string connectionString, string commandText, OleDbParameter[] parameters)
{
OleDbConnection connection = new OleDbConnection(connectionString);
OleDbCommand command = new OleDbCommand(commandText, connection);
foreach (OleDbParameter p in parameters)
{
command.Parameters.Add(p);
}
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(command);
DataTable table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
return table;
}
public static void DoWrite(string connectionString, string commandText)
{
DoWrite(connectionString, commandText, new OleDbParameter[] { });
}
public static void DoWrite(string connectionString, string commandText, OleDbParameter[] parameters)
{
OleDbConnection connection;
OleDbTransaction transaction;
connection = new OleDbConnection(connectionString);
connection.Open();
transaction = connection.BeginTransaction();
OleDbCommand command = new OleDbCommand(commandText, connection);
foreach (OleDbParameter p in parameters)
{
command.Parameters.Add(p);
}
try
{
command.Transaction = transaction;
command.ExecuteNonQuery();
}
finally
{
transaction.Commit();
connection.Close();
}
}
public static OleDbParameter CreateOleDbParameter(string name, OleDbType type, object value)
{
OleDbParameter parameter = new OleDbParameter();
parameter.OleDbType = type;
parameter.ParameterName = name;
parameter.Value = value;
return parameter;
}
}
}
您將每個連接字符串,一個參數化的SQL查詢和可選參數傳遞給每個方法。
var connectionString = "my connection string";
var commandText = "INSERT INTO Person (ID, Name, Age) VALUES (?, ?, ?)";
var parameters = new List<OleDbParameter>();
parameters.Add(new OleDbParameter { Value = "12345" }); // id
parameters.Add(new OleDbParameter { Value = "Joe Bloggs" }); // name
parameters.Add(new OleDbParameter { Value = 35 }); // age
Core.DataAccess.OleDb.DataInterface.DoWrite(connectionString, commandText, parameters.ToArray());
是的總體來說還可以,這是一些引發標志的事情:
public Dbclass(string Constring)
{
this.ConStr = Constring;
DBcon = new SqlConnection(this.ConStr);
}
連接對象不打算被重用。 當然,它可以節省您的時間和代碼。 但實際上,您想創建一個新的Connnection實例,並在不再需要它們時將其廢棄。
還有這個:
try
{
//.......
}
catch (Exception err)
{
string error = err.ToString();
}
finally
{
this.DBcon.Close();
}
知道這沒關系,但是您想要利用IDisposable的.net 4,而不必手動處理連接。
public DataSet SelectQuery(string[] coloumns,string[] tables,string cond)
{
using (SqlConnection DBcon= new SqlConnection(this.ConStr))
{
string col = string.Join(",", coloumns);
string tbl = string.Join(",", tables);
string selectSQL = "SELECT " + col + " FROM " + tbl + cond;
SqlCommand cmd = new SqlCommand(selectSQL, this.DBcon);
SqlDataAdapter ada = new SqlDataAdapter();
DataSet retrnds = new DataSet();
try
{
this.DBcon.Open();
ada.SelectCommand = cmd;
ada.Fill(retrnds);
}
catch (Exception err)
{
string error = err.ToString();
}
//no need for this.DBcon.Close();
return retrnds;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.