Если запись существует в базе данных, ОБНОВИТЬ один столбец

У меня есть объект массовой загрузки, который используется для массовой загрузки примерно 25-40 файлов изображений за раз. Каждое изображение имеет размер около 100-150 кб.

Во время загрузки я создал цикл for each, который берет имя файла изображения (минус расширение файла), чтобы записать его в столбец с именем «sku». Кроме того, для каждого загружаемого файла дата записывается в столбец с именем DateUpdated, а также некоторые данные пути к изображению.

Вот мой код С#:

protected void graphicMultiFileButton_Click(object sender, EventArgs e)
 {

 //graphicMultiFile is the ID of the bulk uploading object ( provided by Dean Brettle: http://www.brettle.com/neatupload  )

   if (graphicMultiFile.Files.Length > 0)

          {
           foreach (UploadedFile file in graphicMultiFile.Files)
             {
                 //strip ".jpg" from file name (will be assigned as SKU)
                  string sku = file.FileName.Substring(0, file.FileName.Length - 4);

                 //assign the directory where the images will be stored on the server
                 string directoryPath = Server.MapPath("~/images/graphicsLib/" + file.FileName);

                 //ensure that if image existes on server that it will get overwritten next time it's uploaded:
                 file.MoveTo(directoryPath, MoveToOptions.Overwrite);

                 //current sql that inserts a record to the db
                SqlCommand comm;
                SqlConnection conn;
                string connectionString = ConfigurationManager.ConnectionStrings["DataConnect"].ConnectionString;
                conn = new SqlConnection(connectionString);
                 comm = new SqlCommand("INSERT INTO GraphicsLibrary (sku, imagePath, DateUpdated) VALUES (@sku, @imagePath, @DateUpdated)", conn);

                comm.Parameters.Add("@sku", System.Data.SqlDbType.VarChar, 50);
                comm.Parameters["@sku"].Value = sku;

               comm.Parameters.Add("@imagePath", System.Data.SqlDbType.VarChar, 300);
               comm.Parameters["@imagePath"].Value = "images/graphicsLib/" + file.FileName;

               comm.Parameters.Add("@DateUpdated", System.Data.SqlDbType.DateTime);
              comm.Parameters["@DateUpdated"].Value = DateTime.Now;

             conn.Open();
             comm.ExecuteNonQuery();
             conn.Close();


           }
         }
      }

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

Это связано с тем, что эти изображения продуктов постоянно пересматриваются и улучшаются.

Для каждого нового/улучшенного изображения имя файла и расширение останутся прежними, поэтому при первой загрузке изображения 321-54321.jpg на сервер новая/улучшенная версия этого изображения по-прежнему будет иметь имя файла изображения 321-54321.jpg.

Я не могу точно сказать, останутся ли размеры файлов в диапазоне 100-150 КБ. Я предполагаю, что размер файла изображения со временем будет расти.

Когда изображения будут загружены (снова), в базе данных, конечно же, будет существующая запись для этого изображения. Как лучше всего:

  1. Проверить базу данных на наличие существующей записи (хранимая процедура или SqlDataReader или создать DataSet...?)
  2. Затем, если запись существует, просто ОБНОВИТЕ эту запись, чтобы столбец DateUpdated получил сегодняшнюю дату.
  3. Если записи не существует, выполните INSERT записи как обычно.

Что следует учитывать:

Если запись существует, мы позволим загрузить фактическое изображение. Он просто перезапишет существующее изображение, чтобы новая версия отображалась в Интернете.

Мы используем SQL Server 2000 в размещенной среде (DiscountAsp).

Я программирую на С#.

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

Хотя я младший. разработчик, я предполагаю, что хранимая процедура будет подходящим вариантом. Просто кажется более эффективным - сделать эту проверку записи вне цикла for each... но не уверен. Мне понадобится дополнительная помощь в написании sproc, так как у меня не так много опыта с ними.

Спасибо всем...


person Doug    schedule 06.10.2009    source источник


Ответы (2)


Цикл будет быстрее в управляемом коде (а не в хранимой процедуре). Я бы использовал следующий код со следующей хранимой процедурой:

if (graphicMultiFile.Files.Length > 0)          
        {       
            string connectionString = ConfigurationManager.ConnectionStrings["DataConnect"].ConnectionString;                
            foreach (UploadedFile file in graphicMultiFile.Files)             
            {                 
                string sku = file.FileName.Substring(0, file.FileName.Length - 4);                 
                string directoryPath = Server.MapPath("~/images/graphicsLib/" + file.FileName);                 
                file.MoveTo(directoryPath, MoveToOptions.Overwrite);                 

                SqlConnection conn = new SqlConnection(connectionString);       
                SqlCommand comm = new SqlCommand("exec addOrUpdateImageRecord @sku, @imagePath");                
                comm.Parameters.Add("@sku", System.Data.SqlDbType.VarChar, 50);                
                comm.Parameters["@sku"].Value = sku;               
                comm.Parameters.Add("@imagePath", System.Data.SqlDbType.VarChar, 300);               
                comm.Parameters["@imagePath"].Value = "images/graphicsLib/" + file.FileName;               
                conn.Open();             
                comm.ExecuteNonQuery();             
                conn.Close();           
            }         
        }      

Вот код хранимой процедуры:

CREATE PROCEDURE dbo.addOrUpdateImageRecord(
        @sku varchar(50),
        @imagePath varchar(300))

AS

    DECLARE @ExistenceCheck int
    SELECT @ExistenceCheck = COUNT(*)
    FROM GraphicsLibrary 
    WHERE sku=@sku 

    IF(@ExistenceCheck=0)
    BEGIN 
        INSERT INTO GraphicsLibrary (sku, imagePath, DateCreated) 
        VALUES(@sku, @imagePath, GETDATE()) 
    END
    ELSE
    BEGIN
        UPDATE GraphicsLibrary 
        SET DateUpdated = GETDATE() 
        WHERE sku = @sku
    END


GO
person Carl Rippon    schedule 07.10.2009
comment
Спасибо рип. Код процедуры вашего магазина выглядит лучше, чем то, что я придумал. Позвольте мне дать ему тест. - Дуг - person Doug; 08.10.2009

ОК - я отвечаю на свой вопрос. Используя StoredProceedure следующим образом: (я тестировал и до сих пор работает так, как мне нужно...)

ПРОЦЕДУРА ИЗМЕНЕНИЯ dbo.addOrUpdateImageRecord

(
@addToZip bit,
@sku varchar(50),
@imagePath varchar(300),
@DateCreated DateTime, 
@DateUpdated DateTime
)

AS

НАЧАТЬ ВЫБРАТЬ sku ИЗ GraphicsLibrary, ГДЕ sku=@sku КОНЕЦ

если(@@RowCount=0)

BEGIN INSERT INTO GraphicsLibrary (addToZip, sku, imagePath, DateCreated) VALUES(@addToZip, @sku, @imagePath, @DateCreated) END

ЕЩЕ

UPDATE GraphicsLibrary SET DateUpdated = @DateUpdated WHERE sku = @sku

/* SET NOCOUNT ON */
RETURN
person Doug    schedule 06.10.2009