[SQL] 어떻게 VARBINARY (최대) 컬럼에 이미지를 저장?
SQL어떻게 VARBINARY (최대) 컬럼에 이미지를 저장?
SQL 서버 2008에 이미지를 삽입하는 동안 나는이 follwing을 SQL 예외를 얻고있다.
데이터베이스 이미지 열 데이터 유형에서 VARBINARY (MAX)입니다.
편집하다
코드 주석에서 해제
paramaters.Add(getParam("@imageFilePath", DbType.AnsiString, imageFilePath));
해결법
-
==============================
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.당신은 당신이 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.당신은 NVARCHAR (기본 텍스트) 데이터 형식으로 설정되어있는 컬럼에 이미지 데이터를 설정하려고하는 것 같습니다. 어느 VARBINARY (MAX)는 올바른 컬럼에 이미지 데이터를 설정 -하거나, 아직 존재하지 않을 경우 테이블에 해당 열을 추가합니다. 즉 참으로 올바른 열이며 단지 시작하는 잘못된 데이터 유형으로 생성 된 경우 아니면은 ALTER TABLE 명령을 통해이 VARBINARY (MAX) 데이터 형식으로 사용하고있는 현재 열을 변경할 수 있습니다.
당신은 NVARCHAR (기본 텍스트) 데이터 형식으로 설정되어있는 컬럼에 이미지 데이터를 설정하려고하는 것 같습니다. 어느 VARBINARY (MAX)는 올바른 컬럼에 이미지 데이터를 설정 -하거나, 아직 존재하지 않을 경우 테이블에 해당 열을 추가합니다. 즉 참으로 올바른 열이며 단지 시작하는 잘못된 데이터 유형으로 생성 된 경우 아니면은 ALTER TABLE 명령을 통해이 VARBINARY (MAX) 데이터 형식으로 사용하고있는 현재 열을 변경할 수 있습니다.
-
==============================
4.이 두 기사에서보세요 :
이 두 기사에서보세요 :
그들은 그것을 수행하는 방법뿐만 아니라 보여,하지만 어떻게 스트림 의미를 사용하여 효율적으로 작업을 수행 할 수 있습니다. 메모리 내의 바이트에 전체 이미지를로드하는 순 용액 [] 내 ASP 처리에서 너무 많은 메모리를 사용한다. 표시된 코드는 MVC를 사용하지만, 당신은 쉽게 APS 양식에 적응 할 수 있습니다.
from https://stackoverflow.com/questions/7324190/how-to-store-images-to-a-varbinarymax-column by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 부모 - 자식 체인에 대한 SQL 쿼리 (0) | 2020.06.15 |
---|---|
[SQL] 어떻게 JTable의에서 JCheckBox에 추가하는? (0) | 2020.06.15 |
[SQL] JDBC와 SQL에서 날짜 사이세요? (0) | 2020.06.15 |
[SQL] 표에서 저장 프로 시저의 목록 (0) | 2020.06.15 |
[SQL] 어떻게 MySQL의 집계 기능을 결합? (0) | 2020.06.15 |