我的方法是使用类正确查询数据库吗?

时间:2014-01-10 15:25:13

标签: c# class ado.net

我对编程世界很新。我正在努力学习自己编程,所以如果有人能让我知道我的方法是否正确,我将不胜感激。

我正在尝试创建一个类(在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方法是否正确?

如果有人可以指导我采用更好的方法,那就太好了。

3 个答案:

答案 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;
    }
}       
相关问题