将图像插入数据库时​​出现问题

时间:2011-03-02 08:45:02

标签: asp.net sql

    if (uploadimg.PostedFile != null && uploadimg.PostedFile.FileName != "")
    {

        string img_id = "1";
        byte[] myimage = new byte[uploadimg.PostedFile.ContentLength];
        HttpPostedFile Image = uploadimg.PostedFile;
        Image.InputStream.Read(myimage, 0, (int)uploadimg.PostedFile.ContentLength);

        SqlConnection myConnection = new SqlConnection("Data Source=DELL-PC\\SQLEXPRESS;Initial Catalog=eclass;Persist Security Info=True;integrated security = true");
        SqlCommand storeimage = new SqlCommand("INSERT INTO ImageGallery " + "(img_id,image_Size,image_Content) " + " values (@img_id,@imagesize,@image)", myConnection);
        storeimage.Parameters.AddWithValue("@img_id",img_id);
       // storeimage.Parameters.Add("@id",SqlDbType.VarChar,100) = uploadimg.PostedFile.ContentType;
        //storeimage.Parameters.Add('@id',id);
        storeimage.Parameters.Add("@imagesize", SqlDbType.BigInt, 99999).Value = uploadimg.PostedFile.ContentLength;
        storeimage.Parameters.Add("@image", SqlDbType.Image, myimage.Length).Value = myimage;



        try
        {
            myConnection.Open();
            storeimage.ExecuteNonQuery();
            myConnection.Close();

        }
        catch (Exception e)
        {
            Response.Write(e.ToString());
        }
    }

我应该在我的c#代码中进行哪些更改,以便我可以避免我的主键约束的sql异常,因为我使用了我的触发器

创建触发器trig_image 在ImageGallery上 插入后 一开始 声明@id int; set @ id = 1; 更新ImageGallery设置img_id ='img'+ cast(@id as varchar(10)) 设置@ id = @ id + 1; 结束 去

和列是img_id varchar(50),image_size bigint,image_content image

4 个答案:

答案 0 :(得分:1)

默认情况下,SQL Server会尝试将“img”转换为整数以向其添加@id。变化:

set img_id = 'img' + @id

set img_id = 'img' + cast(@id as varchar(12))

答案 1 :(得分:1)

问题出在您的触发器声明中。

您必须将@id变量显式转换为varchar。

declare @id int; 
set @id=1; 

update ImageGallery 
set img_id='img'+ convert(varchar(10), @id)

set @id=@id+1

编辑:

您可能会遇到PK约束违规,因为:

  • 您正在尝试更新所有img_id而不是刚刚插入的
  • 您始终将@id变量设置为1,因此每次触发器运行时,@Id值始终为1

另一种选择是更改表格结构,并将img_id作为integer identity column。这将使您不必手动计算ID,因为SQL Server将自动增加每个插入的值。

您可以在向客户端显示之前轻松添加'img'前缀。

e.g

示例选择

Select 'img' + convert(varchar(10), img_id) as 'Formatted_Img_id'
from ImageGallery

示例更新

Update ImageGallery
Set Description = 'blah blah test'
Where img_id = Replace(img_id, 'img','')

答案 2 :(得分:1)

你的触发器非常危险......每次插入时,你拥有的代码都会更新表ImageGallery中的所有行 - 这真的是你想要的吗? ?

另外 - 要使用img001, img002等单独的列,我会使用计算列

ALTER TABLE dbo.ImageGallery
  ADD ImageText AS 'img' + CAST(img_id AS VARCHAR(5)) PERSISTED

有了这个,你会得到一个名为ImageText的新列,它会自动保存值img1img2等等 - 而不需要任何杂乱的触发器或任何东西 - 它只是作品!

答案 3 :(得分:0)

字段image_id的日期类型是什么?

我认为它是INT类型。我建议使用日期类型varchar。