Производительность базы данных класса Connection


Это мой общий класс для подключения к базе данных. Я использую этот класс, чтобы выполнить мои запросы через сайт.

Что бы ваши предложения о том, как улучшить производительность?

(Работает в MSSQL 2008 R2 с пакетом обновления 1 для Visual Studio 2010 с пакетом обновления 1 , на C# 4.0 - ASP.net 4.0)

Класс:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Web;
using System.Data.Sql;
using System.Data.SqlClient;
using System.Data;
using System.IO;

/// <summary>
/// Summary description for DbConnection
/// </summary>
public class DbConnection
{
    public static string srConnectionString = "server=localhost;database=myDB;uid=sa;pwd=MYPW;";

    public DbConnection()
    {

    }

    public static DataSet db_Select_Query(string strQuery)
    {
        DataSet dSet = new DataSet();

        try
        {
            using (SqlConnection connection = new SqlConnection(srConnectionString))
            {
                connection.Open();
                SqlDataAdapter DA = new SqlDataAdapter(strQuery, connection);
                DA.Fill(dSet);
            }
            return dSet;
        }

        catch (Exception)
        {
            using (SqlConnection connection = new SqlConnection(srConnectionString))
            {
                if (srConnectionString.IndexOf("select Id from tblAspErrors") != -1)
                {
                    connection.Open();
                    strQuery = strQuery.Replace("'", "''");
                    SqlCommand command = new SqlCommand("insert into tblSqlErrors values ('" + strQuery + "')", connection);
                    command.ExecuteNonQuery();
                }
            }
            return dSet;
        }
    }

    public static void db_Update_Delete_Query(string strQuery)
    {
        try
        {
            using (SqlConnection connection = new SqlConnection(srConnectionString))
            {
                connection.Open();
                SqlCommand command = new SqlCommand(strQuery, connection);
                command.ExecuteNonQuery();
            }
        }
        catch (Exception)
        {
            strQuery = strQuery.Replace("'", "''");
            using (SqlConnection connection = new SqlConnection(srConnectionString))
            {
                connection.Open();
                SqlCommand command = new SqlCommand("insert into tblSqlErrors values ('" + strQuery + "')", connection);
                command.ExecuteNonQuery();
            }

        }
    }
}


11662
2
задан 15 сентября 2011 в 01:09 Источник Поделиться
Комментарии
3 ответа

Вы не используете с DataContext, так что предполагаю что вы не хотите этого, я хотел бы предложить, что вы также рассмотрите пул подключений, таким образом, вы не должны нести стоимость подключения для каждого Select/удалить.

Кроме того, ваши уловы очень тяжелые, ты видишь много ошибок, которые нужно отслеживать? Вы можете видеть этот вопрос как альтернативу лесозаготовки ошибки сами: https://stackoverflow.com/questions/5076303/sql-server-error-messages

@kubal5003 - хороший момент на автоматическое подключение объединению, вот в MSDN , что обсуждает его и его брата, который содержит строку подключения, свойства и значения по умолчанию

3
ответ дан 23 сентября 2011 в 08:09 Источник Поделиться

Я не комментирую ваши проблемы с производительностью, но я хотел бы прокомментировать это...

public static void db_Update_Delete_Query(string strQuery)
{
try
{
using (SqlConnection connection = new SqlConnection(srConnectionString))
{
connection.Open();
SqlCommand command = new SqlCommand(strQuery, connection);
command.ExecuteNonQuery();
}
}
catch (Exception)
{
strQuery = strQuery.Replace("'", "''");
using (SqlConnection connection = new SqlConnection(srConnectionString))
{
connection.Open();
SqlCommand command = new SqlCommand("insert into tblSqlErrors values ('" + strQuery + "')", connection);
command.ExecuteNonQuery();
}

}
}

Во-первых, БД в блок catch-это, наверное, очень плохая идея. Я не уверен, почему вы думаете, что второй звонок будет работать, когда первый звонок не удался, в этом нет никакого смысла.

Что касается вашего вопроса, вам нужно включить больше информации. Я не специалист АДО любыми способами, поэтому я не собираюсь гадать, где ваша проблема, но вы как минимум должны предоставить нам:


  1. Ваши требования к производительности.

  2. Свои результаты тестов (выполнения эталонных тестов, верно?)

  3. Ваш сценарий использования.

3
ответ дан 26 сентября 2011 в 09:09 Источник Поделиться

SQL-инъекция в catch пункт, - просто использовать параметр для strQuery значение вместо того, чтобы пытаться избежать его.

Что сказал, Я не вижу никаких проблем с производительностью с этим - это в основном сырые ADO.NET, который более или менее быстро вы получите.

Набор данныхс немного тяжелыми, по сравнению с объекта DataReader, но это не может быть источником каких-либо проблем с производительностью.

Основной проблемой производительности любой базы данных будет запросы вы посылаете к нему - не Код доступа к БД.

1
ответ дан 18 июня 2013 в 02:06 Источник Поделиться