2011-10-28 3 views
0

해결할 수없는 오류가 있습니다 ... 이유를 모르겠습니다.BLOB, SQL 데이터베이스 삽입

저는이 코드를 사용하여 데이터베이스에 파일을 업로드합니다. 지금 BLOB을 사용하고 싶습니다.

if (FileUpload1.HasFile) 
        try 
        { 

         //FileUpload1.SaveAs("C:\\inetpub\\wwwroot\\ClientPortalCs\\" 
         //+ GetTheCurrentDirectory(MyTreeView.SelectedNode) 
         //+ "\\" + FileUpload1.FileName); 
         //LabelFile.Text = "File name: " + 
         //FileUpload1.PostedFile.FileName + "<br>" + 
         //FileUpload1.PostedFile.ContentLength + " kb<br>" + 
         //"Content type: " + FileUpload1.PostedFile.ContentType; 

         dbConnection.Open(); 
         dynamic queryString = ("INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES ('" 
         + FileUpload1.FileName + "','" + GetTheCurrentDirectory(MyTreeView.SelectedNode) + "','" + Request.Cookies["UserSettings"]["UserName"] + "','" + DateTime.Now + "','" + FileUpload1.FileBytes + "');" 
         + "SELECT CAST(scope_identity() AS int)"); 

         SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); 

         int newFid = (Int32)theCommand1.ExecuteScalar(); 

         dynamic queryStringFolder = ("INSERT INTO FILES_FOLDERS (Folder_Id,File_Id) VALUES ('" 
         + MyTreeView.SelectedValue + "'," + "'" + newFid + "')"); 
         theCommand1 = new SqlCommand(queryStringFolder, dbConnection); 

         theCommand1.ExecuteNonQuery(); 

         dbConnection.Close(); 

        } 

내 데이터베이스에서 테이블 파일의 DATA 필드는 varbinary (최대)입니다. 쿼리의 DATA 필드에 대한 매개 변수는 업로드하려고하는 파일의 바이트입니다. "VARBINARY (최대)로 데이터 유형 VARCHAR에서 오류 암시 적 변환이 허용되지 않습니다이 쿼리를 실행하려면 CONVERT 함수를 사용합니다.."

누군가가 말해 왜 수 :

오류는 발생?

대단히 감사합니다.

+0

코드는 단지 [SQL 주입 공격]을 구걸한다 (http://xkcd.com/327/). 매개 변수가있는 쿼리를 사용하십시오. – GvS

답변

2

문제는 이미지의 바이트 []를 작은 따옴표로 묶으므로 문자열로 전달한다는 것입니다.

이 근처 작은 따옴표를 제거 : 당신의 쿼리를 사용하여 매개 변수 :

'" + FileUpload1.FileBytes + "'" 

하나 더 추천. SQL 주입 공격으로부터 자신을 구할 수 있으며 쿼리가 더 빨리 실행될 수 있으며 향후 이러한 종류의 실수를 제거 할 수 있습니다.

UPDATE - 사용 매개 변수 :이 같은

string queryString = "INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES (@Name,@Path,@UserUpload,@Date,@Data)"; 
SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); 
theCommand1.Parameters.AddWithValue("@Name",FileUpload1.FileName); 
theCommand1.Parameters.AddWithValue("@Path",GetTheCurrentDirectory(MyTreeView.SelectedNode)); 
theCommand1.Parameters.AddWithValue("@UserUpload",Request.Cookies["UserSettings"]["UserName"]); 
theCommand1.Parameters.AddWithValue("@Data",FileUpload1.FileBytes); 
theCommand1.Parameters.AddWithValue("@Date",DateTime.Now); 

int newFid = (Int32)theCommand1.ExecuteScalar(); 
+0

Ok done! 그런데 왜 지금이 오류가 발생 했습니까? 오류 개체 또는 열 이름이 없거나 비어 있습니다. SELECT INTO 문의 경우 각 열에 이름이 있는지 확인하십시오. 다른 명령문의 경우 빈 별칭 이름을 찾으십시오. ""또는 []로 정의 된 별명은 허용되지 않습니다. 유효한 이름으로 별명을 변경하십시오. ''근처의 구문이 잘못되었습니다. – Kiwimoisi

+0

@ 올바르지 않은 구문이 있습니다. SQL Server로 보내는 SQL 문을 인쇄하여 어떻게 보이는지보십시오. – Icarus

+0

예 .. INSERT INTO 파일 (이름, 경로, UserUpload, 날짜, 데이터) VALUES ('WSB BOXE 20.jpg', 'Projects // TEST /', 'Admin', '10/28/2011 12:41 : 16 PM ', System.Byte []); SELECT CAST (scope_identity() AS int) 좋지 않습니다. – Kiwimoisi

관련 문제