我对编程世界很新。我正在努力学习自己编程,所以如果有人能让我知道我的方法是否正确,我将不胜感激。
我正在尝试创建一个类(在C#中),可用于在MS-SQL数据库上运行查询。我刚刚开始使用ADO.net。因此,我没有在代码中包含如此多的DB语句,而是决定创建一个用于查询DB的类。
我创建了一个类Dbclass
,并在类中为select查询创建了一个方法 - 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方法是否正确?
如果有人可以指导我采用更好的方法,那就太好了。
答案 0 :(得分:1)
在我看来,最好使用ORM方法。您可以将实体用作程序中的普通对象,并且与SQL注入攻击相比更安全。
我们在项目中使用Entity,这让我的生活变得非常轻松。例如,如果我想检索富人列表:
var minimumSalary = 10000;
var richPeople = database.People.Where(o => o.Salary > minimumSalary).ToList();
答案 1 :(得分:0)
你的问题没有正确的答案,但这就是我的用法。
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());
答案 2 :(得分:0)
是的总的来说没关系,这里有几件引发旗帜的事情:
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();
}
你知道这没关系,但是.net 4你想要利用IDisposable,你不必手动处理连接。
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;
}
}