我有一个批量上传对象,用于一次批量上传大约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范围内。我假设图像文件的大小最终会增长。
当图像上传(再次)时,当然会在数据库中存在该图像的现有记录。 最佳方法是:
需要考虑的事项:
如果记录存在,我们将上传实际图像。它只会覆盖现有图像,以便新版本显示在网络上。
我们在托管环境(DiscountAsp)上使用SQL Server 2000。
我正在用C#编程。
上传过程将由每月约2位经理使用几次(每次) - 这对我来说不是一大堆用法。
虽然我是个小伙伴。开发人员,我猜测存储过程将是最佳选择。只是看起来效率更高 - 为每个循环执行此记录检查......但不确定。我需要额外的帮助来编写一个sproc,因为我没有太多的经验。
谢谢大家......
答案 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