Если запись существует в базе данных, ОБНОВИТЬ один столбец - PullRequest
0 голосов
/ 06 октября 2009

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

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

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

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. Если записи не существует, вставьте запись как обычно.

Что нужно учитывать:

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2009

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

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
0 голосов
/ 07 октября 2009

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

ALTER PROCEDURE dbo.addOrUpdateImageRecord

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

AS

НАЧАТЬ ВЫБЕРИТЕ sku FROM GraphicsLibrary ГДЕ sku = @ sku END

, если (@@ RowCount = 0)

НАЧАТЬ INSERT INTO GraphicsLibrary (addToZip, sku, imagePath, DateCreated) ЗНАЧЕНИЯ (@addToZip, @sku, @imagePath, @DateCreated) END

ELSE

ОБНОВЛЕНИЕ GraphicsLibrary SET DateUpdated = @DateUpdated ГДЕ sku = @ sku

/* SET NOCOUNT ON */
RETURN
...