如果数据库中存在记录,则更新单个列

时间:2009-10-06 17:51:32

标签: c# asp.net file-upload sql-server-2000

我有一个批量上传对象,用于一次批量上传大约25-40个图像文件。每张图片的大小约为100-150 kb。

在上传过程中,我为每个循环创建了一个获取图像文件名(减去文件扩展名)的循环,将其写入名为“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-150KB范围内。我假设图像文件的大小最终会增长。

当图像上传(再次)时,当然会在数据库中存在该图像的现有记录。 最佳方法是:

  1. 检查数据库中的现有记录(存储过程或SqlDataReader或创建数据集......?)
  2. 然后,如果记录存在,只需更新该记录,以便DateUpdated列获取今天的日期。
  3. 如果不存在记录,请正常插入记录。
  4. 需要考虑的事项:

    如果记录存在,我们将上传实际图像。它只会覆盖现有图像,以便新版本显示在网络上。

    我们在托管环境(DiscountAsp)上使用SQL Server 2000。

    我正在用C#编程。

    上传过程将由每月约2位经理使用几次(每次) - 这对我来说不是一大堆用法。

    虽然我是个小伙伴。开发人员,我猜测存储过程将是最佳选择。只是看起来效率更高 - 为每个循环执行此记录检查......但不确定。我需要额外的帮助来编写一个sproc,因为我没有太多的经验。

    谢谢大家......

2 个答案:

答案 0 :(得分:0)

好的 - 我正在回答我自己的问题。使用StoredProceedure如下:(我已经测试过,到目前为止,我需要它... ...

  

ALTER PROCEDURE dbo.addOrUpdateImageRecord

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

AS

BEGIN 从GraphicsLibrary中选择sku 在哪里sku = @sku END

如果(@@行数= 0)

BEGIN INSERT INTO GraphicsLibrary(addToZip,sku,imagePath,DateCreated) 价值观(@addToZip,@ sku,@ imagePath,@ DateCreated) END

ELSE

更新GraphicsLibrary SET DateUpdated = @DateUpdated 在哪里sku = @sku

/* SET NOCOUNT ON */
RETURN

答案 1 :(得分:0)

循环在托管代码中会更快(而不是在存储过程中)。我将使用以下代码与以下存储过程:

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