возникли проблемы с вставкой изображения в базу данных - PullRequest
0 голосов
/ 02 марта 2011
    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 в галерее изображений После вставки как начать объявить @id int; set @ id = 1; обновить ImageGallery set img_id = 'img' + cast (@id as varchar (10)) set @ id = @ id + 1; конец идти

и столбцы: img_id varchar (50), image_size bigint, image_content image

Ответы [ 4 ]

1 голос
/ 02 марта 2011

Ваш триггер очень опасен ..... код, который у вас есть, будет обновлять все строки в вашей таблице ImageGallery каждый раз, когда происходит вставка - это действительно то, что вы хотите ??

Также - чтобы иметь отдельный столбец с img001, img002 и т. Д., Я бы использовал вычисляемый столбец :

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

С этим вы получите новый столбец с именем ImageText, который будет содержать значения img1, img2 и т. Д. - автоматически, без необходимости в грязном триггере или чем-либо еще - он просто работает!

1 голос
/ 02 марта 2011

По умолчанию SQL Server будет пытаться преобразовать img в целое число, чтобы добавить к нему @id.Изменить:

set img_id = 'img' + @id

на

set img_id = 'img' + cast(@id as varchar(12))
1 голос
/ 02 марта 2011

Проблема в вашем триггере.

Вы должны явно преобразовать переменную @id в varchar.

declare @id int; 
set @id=1; 

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

set @id=@id+1

EDIT:

Вы, вероятно, получаете нарушение ограничения PK, потому что:

  • Вы пытаетесь обновить все img_id вместо того, который вы только что вставили
  • Вы всегда устанавливаете переменную @id в 1, поэтому при каждом запуске триггера значение @Id всегда будет 1

Другой вариант - изменить структуру таблицы и указать img_id в виде столбца с целочисленной идентификацией . Это избавит вас от необходимости вручную вычислять идентификатор, поскольку SQL Server будет автоматически увеличивать значение при каждой вставке.

Вы можете легко добавить префикс 'img' перед отображением на клиенте.

1027 * например *

пример выбора

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','')
0 голосов
/ 02 марта 2011

Какой тип даты у поля image_id?

Я предполагаю, что оно имеет тип INT.Я рекомендую использовать тип даты varchar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...