简体   繁体   English

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

[英]Is my approach to query Database using a class correct?

I am fairly new into the world of programming. 我是编程领域的新手。 I am trying to learn to program by myself, so i would appreciate if somebody could let me know if my approach is correct. 我正在尝试自己学习编程,因此,如果有人可以让我知道我的方法是否正确,我将不胜感激。

I am trying to create a class(in C#) which can be used to run queries on a MS-SQL Database. 我正在尝试创建一个类(在C#中),该类可用于在MS-SQL数据库上运行查询。 As I am just beginning I am using ADO.net. 在我刚开始的时候,我正在使用ADO.net。 So instead of having so many DB statements in my code I decided to create a Class for querying DB. 因此,我决定在代码中不要创建太多的DB语句,而是创建一个用于查询DB的类。

I created a Class Dbclass , and created a method in the class for select query - SelectQuery , which returns a Dataset. 我创建一类Dbclass ,并创造了类选择查询的方法- SelectQuery ,它返回一个数据集。

To be more clear below is the class that I have created. 下面更加清楚的是我创建的类。

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;
    }
}

So my question is, am I doing the right thing as a beginner to create such a class? 所以我的问题是,作为初学者,我是否做正确的事来创建这样的课程? Is my OOP approach correct? 我的OOP方法正确吗?

It would be nice if someone could guide me to a better approach. 如果有人可以指导我采取更好的方法,那就太好了。

In my opinion it is better to use ORM approach. 我认为最好使用ORM方法。 You could use entity just as normal objects inside your program, and it's more secure vs SQL injection attacks. 您可以像在程序内部的普通对象一样使用实体,并且与SQL注入攻击相比,它更安全。

We use Entity in our project and it's made my life very easy. 我们在项目中使用Entity,这使我的生活变得非常轻松。 For example if I would like to retrieve list of rich people: 例如,如果我想检索有钱人的列表:

var minimumSalary = 10000;
var richPeople = database.People.Where(o => o.Salary > minimumSalary).ToList();

There is no correct answer for your question however this is what I use. 您的问题没有正确答案,但这是我使用的。

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;
        }
    }
}

You pass into each method the connection string, a parameterized SQL query and optional parameters. 您将每个连接字符串,一个参数化的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());

Yes Overall it's okay, here are few things that raise flags: 是的总体来说还可以,这是一些引发标志的事情:

  public Dbclass(string Constring)
    {
        this.ConStr = Constring;
        DBcon = new SqlConnection(this.ConStr);
    }

Connection Object aren't meant to be reused. 连接对象不打算被重用。 Of course it saves you time and code. 当然,它可以节省您的时间和代码。 But really you want to create an new instance of the Connnection and dipose them when you no longer need them. 但实际上,您想创建一个新的Connnection实例,并在不再需要它们时将其废弃。

Also this: 还有这个:

    try
    {
      //.......
    }
    catch (Exception err)
    {
         string error = err.ToString();
    }
    finally
    {
         this.DBcon.Close();
    }

This is ok you know, but it .net 4 you want to take advantage of IDisposable, where you don't have to manually dispose the connection. 知道这没关系,但是您想要利用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM