powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Дайте оценку классу доступа к данным
14 сообщений из 14, страница 1 из 1
Дайте оценку классу доступа к данным
    #38557261
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

У меня возникла необходимость выбора способа доступа к данным в новом проекте - web-приложении. Пока что вопрос стоит так: какую(или какой) ORM использовать в приложении? Но если честно, имея опыт работы с двумя ORM-системами, у меня не очень лежит душа их использовать. У меня есть несколько успешно-завершенных проектов (помимо неуспешных) в которых доступ к данным осуществляется через стандартные .Net-овские классы (SqlCommand). Соответственно есть класс доступа к данным и класс вокруг него с бизнес-логикой.
Я бы хотел представить класс доступа к данным на всеобщее обозрение, для того чтобы собрать критические замечания и модифицировать его. Я знаю что этот код должно быть стыдно показывать. Я знаю что будет много "вони", и вполне к этому готов. Мне не дает покоя что в завершенных проектах не возникает никаких проблем на этом уровне и соответственно мой подход к организации работы с БД имеет право на жизнь.

Пожалуйста, проанализируйте и дайте совет что можно изменить:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
using System;
using System.Data;
using System.Data.SqlClient;

//Provides simple operations with (ms) sql database
public class SQL
{
    private string _ConnectionString;
    private readonly SqlConnection sqlConnection = new SqlConnection();
    private readonly SqlDataAdapter sqlAdapter = new SqlDataAdapter();
    private SqlCommand sqlCommand = new SqlCommand();

    private Exception _Error;
    private DataSet dataSet = new DataSet("dataSet");
    private bool _IsInit;

    public bool IsInit
    {
        get
        {
            return _IsInit;
        }
    }
    public Exception Error
    {
        get
        {
            return _Error;
        }
    }

    public SQL()
    {
        _IsInit = false;
    }

    public SQL(string ConnectionString)
    {
        Init(ConnectionString);
    }

    public void Init(string ConnectionString)
    {
        _ConnectionString = ConnectionString;
        _IsInit = true;
        try
        {
            if (_ConnectionString == null & _IsInit == false) throw new Exception("Connection string is empty.");
            InitTables();
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            _IsInit = false;
            return;
        }
    }

    private void CheckIsInit()
    {
        _Error = null;
        if (_IsInit == false) throw new Exception("Connection to database does not initialized properly.");
    }

    //Opens sql connection
    private bool Open()
    {
        CheckIsInit();
        if (sqlConnection.State == ConnectionState.Closed)
        {
            sqlConnection.ConnectionString = _ConnectionString;
            sqlConnection.Open();
        }

        return true;
    }

    //Close sql connection
    private bool Close()
    {
        if (sqlConnection.State == ConnectionState.Open)
        {
            sqlConnection.Close();
        }

        return true;
    }

    //Convert sql type to .net
    private static Type DotNetType(string szType)
    {
        string DotNetType = "";
        switch (szType)
        {
            case "int":
                DotNetType = "System.Int32";
                break;
            case "smallint":
                DotNetType = "System.Int16";
                break;
            case "tinyint":
                DotNetType = "System.Byte";
                break;
            case "bigint":
                DotNetType = "System.Int64";
                break;
            case "money":
                DotNetType = "System.Decimal";
                break;
            case "smallmoney":
                DotNetType = "System.Decimal";
                break;
            case "numeric":
                DotNetType = "System.Decimal";
                break;
            case "decimal":
                DotNetType = "System.Decimal";
                break;
            case "real":
                DotNetType = "System.Single";
                break;
            case "float":
                DotNetType = "System.Double";
                break;
            case "bit":
                DotNetType = "System.Boolean";
                break;
            case "datetime":
                DotNetType = "System.DateTime";
                break;
            case "smalldatetime":
                DotNetType = "System.DateTime";
                break;
            case "rowversion":
                DotNetType = "System.Byte[]";
                break;
            case "uniqueidentifier":
                DotNetType = "System.Guid";
                break;
            case "ntext":
                DotNetType = "System.String";
                break;
            case "text":
                DotNetType = "System.String";
                break;
            case "varchar":
                DotNetType = "System.String";
                break;
            case "char":
                DotNetType = "System.String";
                break;
            case "nvarchar":
                DotNetType = "System.String";
                break;
            case "image":
                DotNetType = "System.Byte[]";
                break;
            case "varbinary":
                DotNetType = "System.Byte[]";
                break;
            case "binary":
                DotNetType = "System.Byte[]";
                break;
            default:
                DotNetType = "System.String";
                break;
        }
        return Type.GetType(DotNetType);
    }

    //Convert sql type to SqlDbType
    private static SqlDbType SQLDbType(string szType)
    {
        SqlDbType Result;
        switch (szType)
        {
            case "int":
                Result = SqlDbType.Int;
                break;
            case "smallint":
                Result = SqlDbType.SmallInt;
                break;
            case "tinyint":
                Result = SqlDbType.TinyInt;
                break;
            case "bigint":
                Result = SqlDbType.BigInt;
                break;
            case "money":
                Result = SqlDbType.Money;
                break;
            case "smallmoney":
                Result = SqlDbType.SmallMoney;
                break;
            case "numeric":
                Result = SqlDbType.Decimal;
                break;
            case "decimal":
                Result = SqlDbType.Decimal;
                break;
            case "real":
                Result = SqlDbType.Real;
                break;
            case "float":
                Result = SqlDbType.Float;
                break;
            case "bit":
                Result = SqlDbType.Bit;
                break;
            case "datetime":
                Result = SqlDbType.DateTime;
                break;
            case "smalldatetime":
                Result = SqlDbType.SmallDateTime;
                break;
            //case "rowversion":
            //Result = SqlDbType.;
            //break;
            case "uniqueidentifier":
                Result = SqlDbType.UniqueIdentifier;
                break;
            case "ntext":
                Result = SqlDbType.NText;
                break;
            case "text":
                Result = SqlDbType.Text;
                break;
            case "varchar":
                Result = SqlDbType.VarChar;
                break;
            case "char":
                Result = SqlDbType.Char;
                break;
            case "nvarchar":
                Result = SqlDbType.NVarChar;
                break;
            case "image":
                Result = SqlDbType.Image;
                break;
            case "varbinary":
                Result = SqlDbType.VarBinary;
                break;
            case "binary":
                Result = SqlDbType.Binary;
                break;
            case "xml":
                Result = SqlDbType.Xml;
                break;
            default:
                Result = SqlDbType.VarChar;
                break;
        }
        return Result;
    }

    //Inits tables in dataSet 
    private int InitTables()
    {
        dataSet.Tables.Clear();
        if (dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"] != null)
        {
            dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Clear();
            dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Columns.Clear();
        }

        else dataSet.Tables.Add("INFORMATION_SCHEMA.COLUMNS");
        dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Columns.Add("TABLE_NAME", Type.GetType("System.String"));
        dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Columns.Add("COLUMN_NAME", Type.GetType("System.String"));
        dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Columns.Add("DATA_TYPE", Type.GetType("System.String"));
        sqlCommand = new SqlCommand("select [TABLE_NAME], [COLUMN_NAME], [DATA_TYPE] from INFORMATION_SCHEMA.COLUMNS ORDER BY TABLE_NAME", sqlConnection);
        sqlAdapter.SelectCommand = sqlCommand;
        Open();
        sqlAdapter.Fill(dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"]);
        using (DataTable DBTables = new DataTable())
        {
            sqlCommand.CommandText = "select TABLE_NAME from INFORMATION_SCHEMA.TABLES  ORDER BY TABLE_NAME";
            sqlAdapter.Fill(DBTables);

            for (int i = 0; i < DBTables.Rows.Count; i++)
            {
                DataRow[] Columns = dataSet.Tables["INFORMATION_SCHEMA.COLUMNS"].Select(String.Format("TABLE_NAME = '{0}'", DBTables.Rows[i]["TABLE_NAME"]));
                string TableName = DBTables.Rows[i]["TABLE_NAME"].ToString();
                dataSet.Tables.Add(TableName);
                for (int n = 0; n < Columns.Length; n++)
                {
                    string ColumnName = Columns[n]["COLUMN_NAME"].ToString();
                    Type DataType = DotNetType(Columns[n]["DATA_TYPE"].ToString());

                    dataSet.Tables[TableName].Columns.Add(ColumnName, DataType);
                }
            }
        }
        Close();

        return 0;
    }

    //Fills specific data table in dataSet with data
    private DataTable FillTable(string Table, string Filter)
    {
        DataTable Result = new DataTable();
        try
        {
            CheckIsInit();
            lock (_ConnectionString)
            {
                sqlCommand.CommandText = String.Format("SELECT * FROM [{0}] {1}", Table, (Filter == null ? "" : " Where " + Filter));
                sqlAdapter.SelectCommand = sqlCommand;
            
                //Open();
                sqlAdapter.Fill(Result);
                //Close();
            }
        }
        catch (Exception ex)
        {
            _Error = ex;
            return null;
        }
        return Result;
    }

    //Inserting row to specific table. 
    //TableName - Table name in database.
    //DataItems - Inserting data items. Items should be in same order as corresponding columns in table.
    //To skip some columns, just put null instead of its data item.
    public int AddRow(string TableName, params object[] DataItems)
    {
        string Columns = "";
        string Values = "";
        int Result = 0;
        try
        {
            CheckIsInit();
            if (DataItems.Length != dataSet.Tables[TableName].Columns.Count) throw new Exception(String.Format("Number of data items doesn't match number of columns in table \"{0}\".", TableName));
            lock (_ConnectionString)
            {
                sqlCommand.Parameters.Clear();
                for (int i = 0; i < dataSet.Tables[TableName].Columns.Count; i++)
                {
                    // excepting columns
                    if (DataItems[i] == null) continue;
                    // adding column names
                    if (Columns != "") Columns += ",";
                    Columns += String.Format("[{0}]", dataSet.Tables[TableName].Columns[i]);
                    // filling with data
                    string ParamName = "@" + dataSet.Tables[TableName].Columns[i].ColumnName;
                    Values += ParamName + ",";
                    sqlCommand.Parameters.AddWithValue(ParamName, DataItems[i]);
                }
                Values = Values.Substring(0, Values.Length - 1);
                sqlCommand.CommandText = String.Format("INSERT INTO [{0}] ({1}) VALUES ({2}) SELECT @@IDENTITY", TableName, Columns, Values);
                string szRet = "";
            
                Open();
                szRet = sqlCommand.ExecuteScalar().ToString();
                Close();

                Result = Convert.ToInt32(szRet == "" ? "0" : szRet);
            }
            
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            return -1;
        }
        return Result;
    }

    //Updating rows in specific table. 
    //TableName - Table name in database.
    //Condition - Data selection codition, for example "id=1".
    //DataItems - Inserting data items. Items should be in same order as corresponding columns in table.
    //To skip some columns, just put null instead of its data item.
    public int UpdateRow(string TableName, string Condition, params object[] DataItems)
    {
        string Values = "";
        int Result;
        try
        {
            CheckIsInit();
            if (DataItems.Length != dataSet.Tables[TableName].Columns.Count) throw new Exception(String.Format("Number of data items doesn't match number of columns in table \"{0}\".", TableName));
            lock (_ConnectionString)
            {
                sqlCommand.Parameters.Clear();
                for (int i = 0; i < dataSet.Tables[TableName].Columns.Count; i++)
                {
                    // excepting columns
                    if (DataItems[i] == null) continue;
                    // adding columns names
                    if (Values != "") Values += ",";
                    Values += String.Format("[{0}]", dataSet.Tables[TableName].Columns[i]);
                    // filling with data
                    string ParamName = "@" + dataSet.Tables[TableName].Columns[i].ColumnName;
                    Values += " = " + ParamName;
                    sqlCommand.Parameters.AddWithValue(ParamName, DataItems[i]);
                }
                sqlCommand.CommandText = String.Format("UPDATE [{0}] SET {1} WHERE {2}", TableName, Values, Condition);
            
                Open();
                Result = sqlCommand.ExecuteNonQuery();
                Close();
            }
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            return -1;
        }
        return Result;
    }

    //Deleting rows from specific table.
    //TableName - Table name in database.
    //Condition - Data selection codition, for example "id=1".
    public int DeleteRow(string TableName, string Condition)
    {
        int Result;
        try
        {
            CheckIsInit();
            lock (_ConnectionString)
            {
                sqlCommand.CommandText = String.Format("DELETE FROM [{0}] WHERE {1}", TableName, Condition);
                Open();
                Result = sqlCommand.ExecuteNonQuery();
                Close();
            }
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            return -1;
        }
        return Result;
    }

    //Executes custom databse query.
    //Query - TSQL custom query.
    public int ExecuteQuery(string Query)
    {
        int Result = 0;
        try
        {
            CheckIsInit();
            lock (_ConnectionString)
            {
                sqlCommand.CommandText = Query;
                object ob = null;
            
                Open();
                ob = sqlCommand.ExecuteScalar();
                Close();

                Result = Convert.ToInt32(ob == null ? "0" : (ob.ToString() == "" ? "0" : ob));
            }
            
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            return -1;
        }
        return Result;
    }

    //Executes custom databse query with filling DataTable.
    //ResultTable - DataTable object contains query resul.
    //Query - TSQL custom query.
    public int ExecuteQueryAndFillDataTable(out DataTable ResultTable, string Query)
    {
        ResultTable = new DataTable();
        int ret = 0;
        try
        {
            CheckIsInit();
            lock (_ConnectionString)
            {
                sqlCommand.CommandText = Query;
                sqlAdapter.SelectCommand = sqlCommand;
            
                Open();
                ret = sqlAdapter.Fill(ResultTable);
                Close();
            }
        }
        catch (Exception Ex)
        {
            _Error = Ex;
            return -1;
        }
        return ret;
    }

    //Returns DataTable object with specific condition.
    //TableName - Table name in database.
    //Condition - Data selection codition, for example "id=1".
    public DataTable GetDataTable(string TableName, string Condition)
    {
        return FillTable(TableName, Condition);
    }

    public DataTable GetDataTablePage(string TableName, string Condition, int PageSize, int PageNumber, string OrderColumn, string Sorting = "Asc")
    {
        DataTable Result = new DataTable();

        string query = string.Format("SELECT * FROM (SELECT TOP {1} ROW_NUMBER() OVER(ORDER BY {4} " + Sorting + ") As [Number], * FROM {0} {3}) AS t1 WHERE [Number] NOT IN (SELECT TOP {2} ROW_NUMBER() OVER(ORDER BY {4} " + Sorting + ") As [Number] From {0})", TableName, PageSize * (PageNumber + 1), PageSize * PageNumber, (string.IsNullOrEmpty(Condition) ? "" : "WHERE " + Condition), OrderColumn);
        ExecuteQueryAndFillDataTable(out Result, query);
        return Result;
    }

    //Returns server date format.
    public string GetDateFormat()
    {
        string Result;
        try
        {
            CheckIsInit();
            sqlCommand = new SqlCommand("select date_format from sys.dm_exec_requests where session_id = @@spid", sqlConnection);
            Open();
            Result = sqlCommand.ExecuteScalar().ToString();
            Close();
        }
        catch (Exception ex)
        {
            _Error = ex;
            return null;
        }
        return Result;
    }
}
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557284
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
using System;
using System.Data;
using System.Data.SqlClient;

//Provides simple operations with (ms) sql database
public class SQL
{
    private string _ConnectionString;
    private readonly SqlConnection sqlConnection = new SqlConnection();
    private readonly SqlDataAdapter sqlAdapter = new SqlDataAdapter();
    private SqlCommand sqlCommand = new SqlCommand();

Сразу в топку, т.к. работает только с провайдером SQL Server-а.

Почитайте про DbProviderFactory и пространство имён System.Data.Common.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557299
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SemyglassПока что вопрос стоит так: какую(или какой) ORM использовать в приложении?Простите, а как Object-relational mapping коррелирует с тем, что Вы используете DataSet-ы и DataTable-ы?
Вы табличные данные в БД отображаете на табличные данные в памяти, тогда как ORM отображает первое на бизнес-объекты.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557383
Парамон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SemyglassПожалуйста, проанализируйте



Semyglassи дайте совет что можно изменить:
Поискать готовые обертки, если они нужны вообще.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557405
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASemyglassПока что вопрос стоит так: какую(или какой) ORM использовать в приложении?Простите, а как Object-relational mapping коррелирует с тем, что Вы используете DataSet-ы и DataTable-ы?
Вы табличные данные в БД отображаете на табличные данные в памяти, тогда как ORM отображает первое на бизнес-объекты.

Но ведь мне ничего не мешает использовать бизнес-объекты.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557412
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SemyglassskyANAпропущено...
Простите, а как Object-relational mapping коррелирует с тем, что Вы используете DataSet-ы и DataTable-ы?
Вы табличные данные в БД отображаете на табличные данные в памяти, тогда как ORM отображает первое на бизнес-объекты.

Но ведь мне ничего не мешает использовать бизнес-объекты.Покажите как?

Фактически Ваш класс не является классом доступа к данным в смысле понятия Data access layer .
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557565
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASemyglassпропущено...


Но ведь мне ничего не мешает использовать бизнес-объекты.Покажите как?

Фактически Ваш класс не является классом доступа к данным в смысле понятия Data access layer .

Как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Product
{
    string Id;
    string Name;
}
DataTable dt = sql.FillTable("Product",null);

Product p = new Product();
p.Id = dt.Rows[0]["Id"].TString();
p.Name = dt.Rows[0]["Name"].TString();



Не сложно сделать класс с бизнес-логикой в котором все это будет реализовано. Или я неправильно понимаю что Вы подразумеваете под бизнес-объектом.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557586
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SemyglassskyANAпропущено...
Покажите как?

Фактически Ваш класс не является классом доступа к данным в смысле понятия Data access layer .

Как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Product
{
    string Id;
    string Name;
}
DataTable dt = sql.FillTable("Product",null);

Product p = new Product();
p.Id = dt.Rows[0]["Id"].TString();
p.Name = dt.Rows[0]["Name"].TString();



Не сложно сделать класс с бизнес-логикой в котором все это будет реализовано. Или я неправильно понимаю что Вы подразумеваете под бизнес-объектом.То, что Вы изобразили, как раз и называется ORM (Object-relational mapping). Только через одно место.

К чему Вы упомянули тут бизнес-логику? Бизнес-логики тут нет.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557610
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANASemyglassпропущено...


Как-то так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Product
{
    string Id;
    string Name;
}
DataTable dt = sql.FillTable("Product",null);

Product p = new Product();
p.Id = dt.Rows[0]["Id"].TString();
p.Name = dt.Rows[0]["Name"].TString();



Не сложно сделать класс с бизнес-логикой в котором все это будет реализовано. Или я неправильно понимаю что Вы подразумеваете под бизнес-объектом.То, что Вы изобразили, как раз и называется ORM (Object-relational mapping). Только через одно место.

К чему Вы упомянули тут бизнес-логику? Бизнес-логики тут нет.

Ну так я и говорю что класс с бизнес-логикой не сложно будет сделать.

Суть вопроса в другом. Просто каждый раз когда мне приходится кому-то показать фрагмент этого кода, я наблюдаю фырканье и усмешки, но никогда не слышал и не видел объективной критики, что именно является узким местом и где кроется потенциальная опасность для системы использующей данный класс в качестве прослойки между БД и логикой.

Я решил создать этот пост чтобы для себя определить можно ли его использовать в дальнейшем или лучше изучить очередную ORM.

Я и сам знаю что он выглядит страшно и вполне кто-то может назвать это говно-кодом, но если он работает и хорошо выполняет все свои функции, то имеет право на существование. Кроме того именно в таком виде он работает на самом нагруженном моем проекте - это сайт на котором за сутки происходит более миллиона операций с БД (очень сложно точно посчитать). Сайт живет и никаких проблем с технической стороны не испытывает.

Я был бы очень признателен, если мне указали что вот так делать нельзя потому что может случиться вот то, или вот это...
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557636
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semyglass, критику чего Вы хотите услышать?

Вы пока не перечислили те функции, какие должен решать код, и другие требования.

Это не ORM, это не DAL, это тупо обёртка над наиболее частыми операциями, возникающими при работе конкретно с SQL Server, в Ваших проектах.

Если Вам понадобиться представить данные в объектном виде, или брать их из другой СУБД, или вруг не из СУБД, то код на свалку.

Также код можно ускорить, тупо заменив DataAdapter на DataReader, потому как первый юзает последний в методе Fill (уже медленне) + накладные расходы на создание и заполнение DataTable.
Ради любопытсва можете профайлером поисследовать сколько внутри метода Fill уходит на fetch данных из БД, а сколько на остальные операции.

Фраза "за сутки происходит более миллиона операций с БД" ни о чём не говорит. Миллион операций в сутки - это 11 с половиной операций в секунду. 10 пользователей зашли и прочитали данные, один что-то записал. Так себе нагрузка.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38557642
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А учитывая то, что данные раскиданы по нескольким таблицам, и отображение одной страницы - это несколько операций чтения, можно предположить, что меньше одного пользователя в секунду.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38558106
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

спасибо, поковыряю DataReader.

В случае с сайтом - как раз зачастую это операции обновления\вставки, для поддержания актуальности данных. Но согласен что миллион операций в сутки - это не так уж много, просто более нагруженного проекта пока не было.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38560470
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Semyglass,

а как вы будете делать операции разбиения выборки на страницы ?
совместную операцию - получение третьей страницы выборки и получения общего количества записей в выборке?
ваше изобретение неподдерживаемо на 100%. развивать его другим человеком нельзя.
...
Рейтинг: 0 / 0
Дайте оценку классу доступа к данным
    #38562907
Semyglass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrU,

Мне никогда не приходилось делать совместные операции получения кол-ва записей и одной страницы из выборки. Это делается двумя запросами. Как Вы себе это представляете? Должен быть метод который будет возвращать одновременно int и DataTable? Я вполне обходился одним Count и функцией получения страницы (она есть в моем классе).

Мне кажется так проще и надежнее.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Дайте оценку классу доступа к данным
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]