Будет ли использование хранимых процедур усложнять мою работу, или это потребует слишком много времени или производительности? - PullRequest
0 голосов
/ 30 июля 2011

В настоящее время я работаю над проектом для колледжа по написанию программы для хранения информации о других компаниях, с которыми они взаимодействуют (например, контактная информация, информация о доставке и т. Д.), И о том, что находится в их общем запасе в любой момент времени (например,Марка, модель, количество товара на складе, информация о производителе / ​​поставщике и т. Д.) И информация о клиенте.

Мне интересно, нужно ли использовать огромное количество хранимых процедур, чтобы использовать преимущества обработки ошибок и транзакций с использованиемT-SQL, или было бы быстрее просто использовать класс System.Data.SqlClient.SqlCommand для выполнения простых запросов?У меня есть пример кода, который я разработал для хранения информации о клиенте в базе данных с использованием T-SQL и C #, что не было проблемой.Наша задача гласит, что о нас будут судить по сложности и эффективности нашей программы.

Это хранимая процедура, которую я использовал:

CREATE PROCEDURE uspAddCustomers @Name varchar(30), @Surname varchar(30), @Addressline1 varchar(300),@Addressline2 varchar(300),@Telephone varchar(12),@CellPhone varchar(12),@Email Varchar(100)
AS
BEGIN TRY
    BEGIN TRANSACTION TrnAddCustomer;
        INSERT INTO [TCTdb].[dbo].[Customers]
                   ([Name]
                   ,[Surname]
                   ,[Addressline1]
                   ,[Addressline2]
                   ,[Telephone]
                   ,[Cellphone]
                   ,[Email])
             VALUES
                   (@Name
                   ,@Surname
                   ,@Addressline1
                   ,@Addressline2
                   ,@Telephone
                   ,@CellPhone
                   ,@Email)
    COMMIT TRANSACTION TrnAddCustomer;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION TrnAddCustomer;

    DECLARE @ErrorMessage NVARCHAR(4000);
    DECLARE @ErrorSeverity INT;
    DECLARE @ErrorState INT;

    SELECT 
        @ErrorMessage = ERROR_MESSAGE(),
        @ErrorSeverity = ERROR_SEVERITY(),
        @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage,
               @ErrorSeverity,
               @ErrorState
               );
END CATCH
GO

Это фрагменты кода, которые я использовал для вызова хранимой процедуры:

private void btnAdd_Click(object sender, EventArgs e)
{
    try
    {
        SQLCommands comm = new SQLCommands(); //Custom Class containing method below.
        comm.AddCustomer(tbName.Text, tbSurname.Text, tbAddressline1.Text, tbAddressline2.Text, tbPhoneNumber.Text, tbCellphoneNumber.Text, tbEmail.Text);
        MessageBox.Show("Success! Note, if the data you inserted was too long, it may have been subjected to truncation to fit in the Database.", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        tbName.Text = tbSurname.Text = tbPhoneNumber.Text = tbCellphoneNumber.Text = tbAddressline2.Text = tbAddressline1.Text = tbEmail.Text = string.Empty;
    }
    catch
    {
        MessageBox.Show("It appears something has gone wrong. Please contact the Supervisor if this problem keeps reoccurring", "Unknown Error", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    }
}

AND

 public void AddCustomer(params string[] parameters)
    {
        try
        {
            comm = new SqlCommand("UspAddCustomers", conn); // Stored Procedure
            comm.Parameters.AddWithValue("@Name", parameters[0]);
            comm.Parameters.AddWithValue("@Surname", parameters[1]);
            comm.Parameters.AddWithValue("@Addressline1", parameters[2]);
            comm.Parameters.AddWithValue("@Addressline2", parameters[3]);
            comm.Parameters.AddWithValue("@Telephone", parameters[4]);
            comm.Parameters.AddWithValue("@CellPhone", parameters[5]);
            comm.Parameters.AddWithValue("@Email", parameters[6]);
            comm.CommandType = CommandType.StoredProcedure;
            comm.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message, "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
        }
    }

Вопрос: Итак, чтобы пересмотреть мой вопрос, я собирался использовать этот тип кода для обработки всего CRUD для моих таблиц в моей базе данных.Я обеспокоен тем, что это может повлиять на производительность моей программы, потому что там задействовано много таблиц.Желательно ли продолжать так или я должен рассмотреть возможность использования более простых методов для манипулирования данными в моей базе данных?

Причина, по которой я подумал об использовании этого метода, заключалась в том, чтобы повысить сложность

Ответы [ 4 ]

3 голосов
/ 30 июля 2011

Поскольку вы используете C #, рассматривали ли вы использование LINQ-to-SQL? Это довольно сложный фреймворк, встроенный в .NET, но очень простой в использовании и устраняющий необходимость в большом количестве кода фреймворка на более низких уровнях вашего кода. Это может сэкономить вам много времени, но, возможно, только если у вас есть время, чтобы ознакомиться с LINQ-to-SQL. Я использовал его в среде, где мы не используем хранимые процедуры (запросы и обновления эффективно генерируются LINQ-to-SQL на основе запросов и методов LINQ, написанных в коде), но я считаю, что вы также можете сказать это использовать хранимые процедуры.

Я не уверен, как они оценивают сложность. Если это основано на том, сколько кода вы пишете, то это может быть шагом в неправильном направлении, так как я думаю, что вы написали бы намного меньше кода. Но в целом я думаю, что в решении LINQ-to-SQL будет задействовано больше сложности / изощренности, поскольку оно переводит запросы LINQ в запросы SQL внутри и в результате может быть перенесено на другие платформы баз данных.

1 голос
/ 30 июля 2011

, хотя на самом деле это не ответ на вопрос, одна вещь наверняка - ваш метод:

 public void AddCustomer(params string[] parameters)

- ужасная идея.Как вы узнаете, какой параметр передать?Вы должны объявить этот метод с деталями, необходимыми для заполнения таблицы:

 public void AddCustomer(string fisrtName, string lastName, string addressLine1, string addressLine2, string telephone, string cellphone, string emailAddress)

или даже лучше инкапсулировать адрес в классе Address, телефонные данные в классе PhoneDetails и, соответственно, Customer класс, который имеет Address и PhoneDetails, а также имя и фамилию, а затем передает это вашему методу.

0 голосов
/ 30 июля 2011

Я бы всегда предпочел простые запросы перед сохраненными процессами.Хранимые процедуры трудно отлаживать, учитывая, что мы не видим фактический запрос из IDE.Поскольку вы хотели бы завершить его быстро, чтобы упростить отладку, вам следует обратиться к простым запросам.Если в дальнейшем приложение будет обслуживаться и поддерживаться в больших масштабах, хранимый процесс должен быть лучше.Но в вашем случае я считаю, что стандартные запросы приложений будут лучше.

0 голосов
/ 30 июля 2011

Задумывались ли вы об использовании объектно-реляционного картографа, такого как NHibernate (он может принести вам дополнительные очки брауни)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...