2009-06-30 3 views
59

아래에 바이트 배열이 강조 표시되어 있는데 어떻게 SQL Server 데이터베이스 Varbinary 열에 삽입합니까?바이트 []를 SQL Server VARBINARY 열에 삽입하는 방법

byte[] arraytoinsert = new byte[10]{0,1,2,3,4,5,6,7,8,9}; 

string sql = 
    string.format 
    (
    "INSERT INTO mssqltable (varbinarycolumn) VALUES ({0});",WHATTODOHERE 
    ); 

미리 감사드립니다.

답변

69

내 솔루션은 연결 객체 등의 매개 변수화 쿼리를 사용하는 것 (해당 "위험"문자를 올바른 데이터 유형을 보장 포함하고 탈출) 데이터를 올바르게 포맷 돌봐 :

// Assuming "conn" is an open SqlConnection 
using(SqlCommand cmd = new SqlCommand("INSERT INTO mssqltable(varbinarycolumn) VALUES (@binaryValue)", conn)) 
{ 
    // Replace 8000, below, with the correct size of the field 
    cmd.Parameters.Add("@binaryValue", SqlDbType.VarBinary, 8000).Value = arraytoinsert; 
    cmd.ExecuteNonQuery(); 
} 

편집 : 완료 후 SinyCommand를 올바르게 처리하기 위해 John Saunders가 제안한 "사용"문장을 추가했습니다.

+3

Jason, "SqlCommand cmd = new ..."에 using 문을 넣으시겠습니까? 그렇지 않으면, 나는 downvote 의무가 느낄거야, 나는 그것을 싫어. –

+11

열이 VARBINARY (MAX) 인 경우 8000을 -1로 바꾸십시오 (http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/e61f0616-0866-4f3f-aeba-6a76e144e169/ 참조). –

74

이 시도 : 당신이 정말로 물론 문자열 연결이 아닌 매개 변수화 쿼리를 사용해야하지만

"0x" + BitConverter.ToString(arraytoinsert).Replace("-", "") 

...

+0

David, 답변 주셔서 감사합니다. 왜 매개 변수화 된 쿼리를 사용해야합니까? – divinci

+4

여기에서 최소한이지만 매개 변수화 된 쿼리를 컴파일하고 캐시하여 각 후속 쿼리와 함께 컴파일 비용을 절약 할 수 있습니다. 또한 SQL 주입 공격으로부터 보호합니다. 마지막으로, 매개 변수의 값을 직접 바이트 배열로 설정하고 BitConverter 항목을 피할 수 있습니다. –

+0

일반적으로 VARBINARIES로 작업하는 것이 좋다고 생각하지 마십시오. SQL Server는 매우 큰 VARBINARIES (2Gb였습니까?)를 허용하며이 방법으로는 "확장 성이 좋지 않습니다". 이 특별한 경우에 이것이 문제가 될지를 판단 할 수 없으므로 나는 -1을 떠날 것입니다. – peSHIr

1

이 시나리오에서 사용하려는 모든 배열이 예제와 같이 작다면 문제가 없습니다 .

큰 블롭 (예 : 에 많은 Mb 또는 심지어 Gbs 크기의 큰 바이너리 파일 저장)을 사용하는 경우 SQL Server의 특정 지원을 사용하여 하위 섹션 읽기/쓰기 그런 큰 얼룩. READTEXTUPDATETEXT 또는 현재 버전의 SQL Server SUBSTRING.

자세한 내용과 예제는 .NET Magazine (, 네덜란드어, 전체 소스 코드 포함)의 my 2006 기사 또는 Peter de Jonghe의 on CodeProject 영어 번역 및 일반화를 참조하십시오. 이 두 가지 모두 my weblog에서 연결됩니다.

0

체크 모든 본 이미지 링크는 https://drive.google.com/open?id=0B0-Ll2y6vo_sQ29hYndnbGZVZms

STEP1 단계 : 나는 테이블 형 VARBINARY의 필드를 생성

STEP2 : I 타입 SQL_VARIANT의 매개 변수를 받아 저장 프로 시저를 생성

STEP3 : 프론트 엔드 asp.net 페이지에서 객체 유형의 SQL 데이터 소스 매개 변수

을 작성했습니다.
 <tr> 
     <td> 
      UPLOAD DOCUMENT</td> 
     <td> 
      <asp:FileUpload ID="FileUpload1" runat="server" /> 
      <asp:Button ID="btnUpload" runat="server" Text="Upload" /> 
      <asp:SqlDataSource ID="sqldsFileUploadConn" runat="server" 
       ConnectionString="<%$ ConnectionStrings: %>" 
       InsertCommand="ph_SaveDocument"  
       InsertCommandType="StoredProcedure"> 
       <InsertParameters> 
        <asp:Parameter Name="DocBinaryForm" Type="Object" /> 
       </InsertParameters> 

      </asp:SqlDataSource> 
     </td> 
     <td> 
      &nbsp;</td> 
    </tr> 

4 단계 : 내 코드에서 뒤에, 나는 당신이 이런 식으로 뭔가를 할 수있는 SQL 데이터 소스 컨트롤

 Dim filebytes As Object 
     filebytes = FileUpload1.FileBytes() 
     sqldsFileUploadConn.InsertParameters("DocBinaryForm").DefaultValue = filebytes.ToString 
     Dim uploadstatus As Int16 = sqldsFileUploadConn.Insert() 

       ' ... code continues ... ' 
0

를 사용하여이 저장 프로 시저 호출을 통해는 FileUpload 컨트롤에서 FileBytes을 업로드하려고, 매우 간단하고 효율적인 솔루션 : 내가 한 것은 실제로 기본 자리 표시 자 대신 매개 변수를 사용하고 SqlParameter 개체를 만들고 다른 기존 실행 메서드를 사용했습니다. 예를 들어, 귀하의 시나리오에 대한 :

string sql = "INSERT INTO mssqltable (varbinarycolumn) VALUES (@img)"; 
SqlParameter param = new SqlParameter("img", arraytoinsert); //where img is your parameter name in the query 
ExecuteStoreCommand(sql, param); 

열려있는 SQL 연결이 설정되어 있으면 이것은 매력처럼 작동합니다.

관련 문제