복붙노트

[SQL] 어떻게 VARBINARY (최대) 컬럼에 이미지를 저장?

SQL

어떻게 VARBINARY (최대) 컬럼에 이미지를 저장?

SQL 서버 2008에 이미지를 삽입하는 동안 나는이 follwing을 SQL 예외를 얻고있다.

데이터베이스 이미지 열 데이터 유형에서 VARBINARY (MAX)입니다.

편집하다

코드 주석에서 해제

paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath));

해결법

  1. ==============================

    1.바이트 배열로 파일을 읽을 때 사용합니다 :

    바이트 배열로 파일을 읽을 때 사용합니다 :

        // Old fashioned way
        public static byte[] ReadFile(string filePath)
        {
            byte[] buffer;
            FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            try
            {
                int length = (int)fileStream.Length;  // get file length
                buffer = new byte[length];            // create buffer
                int count;                            // actual number of bytes read
                int sum = 0;                          // total number of bytes read
    
                // read until Read method returns 0 (end of the stream has been reached)
                while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
                    sum += count;  // sum is a buffer offset for next reading
            }
            finally
            {
                fileStream.Close();
            }
            return buffer;
        }
    

    또는

        // Thanks Magnus!
        byte[] data = System.IO.File.ReadAllBytes(filePath);
    

    그런 다음이 (내 이미지 정보와 instance.Data의 바이트 배열을 포함하는 이미지 클래스 "예"를 사용하고 있습니다)를 사용하여 이미지 데이터를 저장합니다

       using(SqlCommand cm = new SqlCommand("SaveImage", connection, transaction)){
           cm.CommandType = CommandType.StoredProcedure;
           cm.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int,0, ParameterDirection.InputOutput, false, 10, 0, "Id", DataRowVersion.Current, (SqlInt32)instance.Id));
           cm.Parameters.Add(new SqlParameter("@Title", SqlDbType.NVarChar,50, ParameterDirection.Input, false, 0, 0, "Title", DataRowVersion.Current, (SqlString)instance.Title));
           if (instance.Data.Length > 0)
           {
               cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,instance.Data.Length, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, (SqlBinary)instance.Data));
           }
           else
           {
               cm.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary,0, ParameterDirection.Input, false, 0, 0, "Data", DataRowVersion.Current, DBNull.Value));                    
           }
    
           cm.ExecuteNonQuery();
       )
    

    그리고 여기 예를 들어 저장 프로 시저입니다 :

    CREATE PROCEDURE SaveImage
    (
    @Id int OUTPUT 
    ,@Title nvarchar(50)
    ,@Data varbinary(MAX)
    )
    AS
    SET NOCOUNT ON
    SET XACT_ABORT ON
    
    IF @Id IS NULL OR @Id <= 0
    BEGIN
    SELECT @Id = ISNULL(MAX([Id]),0) + 1 FROM [dbo].[Images]
    END
    
    INSERT INTO [dbo].[Images] (
    [Id]
    ,[Title]
    ,[Data]
    ) VALUES (
    @Id
    ,@Title
    ,@Data
    )
    
  2. ==============================

    2.당신은 당신이 VARBINARY (최대) 컬럼에 텍스트를 삽입하려고하기 때문에 오류가있다; 따라서 이미지가 아니라 이미지에 대한 경로를 저장하지 않습니다.

    당신은 당신이 VARBINARY (최대) 컬럼에 텍스트를 삽입하려고하기 때문에 오류가있다; 따라서 이미지가 아니라 이미지에 대한 경로를 저장하지 않습니다.

    당신은 단지 PATH를 저장하려면, VARCHAR에 VARBINARY (최대)에서 열 유형을 변경 (최대) 그런 다음 이미지를 저장하는 바이트 싶지 않은 경우는 바이트 배열로 파일에서 이미지를 읽는 코드가 필요하고 당신은 데이터가 너무 좋아 삽입 :

    byte [] buffer = File.ReadAllBytes("Path/to/your/image/");
    ...
    
    SqlCommand command = ....
    command.CommandType=CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@image",buffer);
    command.ExecuteNonQuery();
    

    또는

    SqlCommand command = ....
    command.Text="INSERT INTO YOUR_TABLE_NAME (image) values (@image)";
    command.Parameters.AddWithValue("@image",buffer);
    command.ExecuteNonQuery();
    
  3. ==============================

    3.당신은 NVARCHAR (기본 텍스트) 데이터 형식으로 설정되어있는 컬럼에 이미지 데이터를 설정하려고하는 것 같습니다. 어느 VARBINARY (MAX)는 올바른 컬럼에 이미지 데이터를 설정 -하거나, 아직 존재하지 않을 경우 테이블에 해당 열을 추가합니다. 즉 참으로 올바른 열이며 단지 시작하는 잘못된 데이터 유형으로 생성 된 경우 아니면은 ALTER TABLE 명령을 통해이 VARBINARY (MAX) 데이터 형식으로 사용하고있는 현재 열을 변경할 수 있습니다.

    당신은 NVARCHAR (기본 텍스트) 데이터 형식으로 설정되어있는 컬럼에 이미지 데이터를 설정하려고하는 것 같습니다. 어느 VARBINARY (MAX)는 올바른 컬럼에 이미지 데이터를 설정 -하거나, 아직 존재하지 않을 경우 테이블에 해당 열을 추가합니다. 즉 참으로 올바른 열이며 단지 시작하는 잘못된 데이터 유형으로 생성 된 경우 아니면은 ALTER TABLE 명령을 통해이 VARBINARY (MAX) 데이터 형식으로 사용하고있는 현재 열을 변경할 수 있습니다.

  4. ==============================

    4.이 두 기사에서보세요 :

    이 두 기사에서보세요 :

    그들은 그것을 수행하는 방법뿐만 아니라 보여,하지만 어떻게 스트림 의미를 사용하여 효율적으로 작업을 수행 할 수 있습니다. 메모리 내의 바이트에 전체 이미지를로드하는 순 용액 [] 내 ASP 처리에서 너무 많은 메모리를 사용한다. 표시된 코드는 MVC를 사용하지만, 당신은 쉽게 APS 양식에 적응 할 수 있습니다.

  5. from https://stackoverflow.com/questions/7324190/how-to-store-images-to-a-varbinarymax-column by cc-by-sa and MIT license