簡體   English   中英

我使用類查詢數據庫的方法正確嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM