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
答案 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
的新列,它会自动保存值img1
,img2
等等 - 而不需要任何杂乱的触发器或任何东西 - 它只是作品!
答案 3 :(得分:0)
字段image_id的日期类型是什么?
我认为它是INT类型。我建议使用日期类型varchar。