2015-01-16 2 views
0

У меня есть таблица базы данных с двумя полями типа varbinary (max), которые я использую для хранения файлов.Загрузка файлов в varbinary (MAX)

Однако я не могу загрузить файлы, как ожидалось. Я долго был в тупике за эту проблему, и я не уверен, что могу сделать, чтобы ее разрешить. Существует сообщение об ошибке:

An exception of type 'System.Data.SqlClient.SqlException' occurred in 
System.Data.dll but was not handled in user code 
Additional information: Incorrect syntax near the keyword 'title'. 

Сво MUST для меня реализовать 3-уровневую архитектуру в ASP.NET.

Data Access Layer

public class Submission { 

    private string _title; 
    private byte[] _slides, _codes; 

    //Connection string 
    private string _connStr = Properties.Settings.Default.DBConnStr; 

    public Submission(string title, byte[] slides, byte[] codes) { 
    _title = title; 
    _slides = slides; 
    _codes = codes; 
    } 

    //UPLOAD files 
    public int SubmissionInsert() 
    { 
      string queryStr = "INSERT INTO Submission(title,slides,codes)" + 
       "VALUES('" + 
       _title + "', '" + 
       _slides + "', '" + 
       _codes + "')"; 

      SqlConnection con = new SqlConnection(_connStr); 
      SqlCommand cmd = new SqlCommand(queryStr, con); 

      con.Open(); 
      int nofRow = 0; 
      nofRow = cmd.ExecuteNonQuery(); 

      con.Close(); 

      return nofRow; 
    } 
} 

Business Logic Layer

public class SubmissionBLL 
{ 
    public string submissionUpload(string title, byte[] slides, byte[] codes) 
    { 
     string returnValue = ""; 

     if (title.Length == 0) 
      returnValue+= "Title cannot be empty"; 
     if (slides == null) 
      returnValue += "Slides cannot be empty"; 
     if (codes == null) 
      returnValue += "Codes cannot be empty"; 

     //if there are no errors 
     if (returnValue.Length == 0) 
     { 
      Submission sub = new Submission(title,slides,codes); 

      int nofRows = 0; 
      nofRows = sub.SubmissionInsert(); 

      if (nofRows > 0) 
       returnValue = "Submission is successful!"; 
      else 
       returnValue = "Submission failure. Please try again."; 
     } 

     return returnValue; 
    } 

Presentation Layer - Code-за

protected void btn_submit_Click(object sender, EventArgs e) 
    { 
     string input = ""; 
     byte[] slideArr = null, codeArr= null; 

     string strTestFilePath, strTestFileName, strContentType; 
     Int32 intFileSize, intFileLength; 
     Stream strmStream; 

     if (f_codes.HasFile) 
     { 
       strTestFilePath = f_codes.PostedFile.FileName; 
       strTestFileName = Path.GetFileName(strTestFilePath); 
       intFileSize = f_codes.PostedFile.ContentLength; 
       strContentType = f_codes.PostedFile.ContentType; 

       //Convert the source codes file to byte stream to save to database 
       strmStream = f_codes.PostedFile.InputStream; 
       intFileLength = (Int32)strmStream.Length; 
       codeArr = new byte[intFileLength + 1]; 
       strmStream.Read(codeArr, 0, intFileLength); 
       strmStream.Close(); 

     } 

     if (f_slide.HasFile) 
     { 
       strTestFilePath = f_slide.PostedFile.FileName; 
       strTestFileName = Path.GetFileName(strTestFilePath); 
       intFileSize = f_slide.PostedFile.ContentLength; 
       strContentType = f_slide.PostedFile.ContentType; 

       strmStream = f_slide.PostedFile.InputStream; 
       intFileLength = (Int32)strmStream.Length; 
       slideArr = new byte[intFileLength + 1]; 
       strmStream.Read(slideArr, 0, intFileLength); 
       strmStream.Close(); 
      } 

     //Pass to BLL 
     input = sub.submissionUpload(tb_title.Text,slideArr,codeArr); 
     //Display error messages 
     lbl_message.Text = input; 
    } 

Я пытался отладить с IntelliTrace и показывает сообщение

ADO.NET:Execute NonQuery «INSERT INTO представления (название, слайды, коды) VALUES ('My Water Saving Project',«System .Byte [] ',' System.Byte [] ') "


Я делаю это правильно? Я попытался запустить, и ошибка исключения по-прежнему настоящее время.

string queryStr = "INSERT INTO Submission(title,slides,codes)" + "VALUES('"+ 
      _title + "', '" + 
      "0x" + BitConverter.ToString(_slides).Replace("-", "")+ "', '" + 
      "0x" + BitConverter.ToString(_codes).Replace("-", "") + "')"; 
+0

Не может быть пробелов между первыми двумя строками в вашем SQL-запросе? '" INSERT INTO Submission (название, слайды, коды) "+" VALUES ('"' – supertopi

+0

Я включил пробел между двумя строками, но ошибка все еще присутствует. – Enovyne

+0

Вы также должны параметризовать свой SQL, так как иначе вы откроете себя для инъекций Кроме того, чтобы лучше помочь нам диагностировать вашу проблему, скопируйте текущее значение переменной 'queryStr' перед выполнением запроса. – Tejs

ответ

0

Ваша проблема с преобразованием типа. Если вы вставляете значение в виде строки (и вы используете эти одинарные кавычки), вам нужно вставить значения HEX и префикс с 0x.

Это должно помочь вам: "0x" + BitConverter.ToString (ByteArray,) .Надеть ("-", "")

0

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

Вы не должны преобразовать байт в строку. Вместо этого вы хотите использовать параметризованный запрос (во избежание инъекции sql) и вставьте эти массивы байтов прямо в базу данных.

public int SubmissionInsert(string title, byte[] slides, byte[] codes) 
{ 
    int nofRow; 
    string query = "INSERT INTO Submission (title, slides, codes)" + 
        "VALUES (@Title, @Slides, @Codes);"; 

    using (var con = new SqlConnection(_connStr)) 
    { 
     con.Open(); 
     using (var cmd = new SqlCommand(query, con)) 
     { 
      cmd.CommandType = CommandType.Text; 
      cmd.Parameters.AddWithValue("@Title", title); 
      cmd.Parameters.AddWithValue("@Slides", slides); 
      cmd.Parameters.AddWithValue("@Codes", codes); 
      nofRow = cmd.ExecuteNonQuery(); 
     } 
    } 
    return nofRow; 
} 
+0

Я следил за вашим методом и использовал параметризованный запрос. Однако появилось еще одно исключение. Исключено исключение типа «System.Data.SqlClient.SqlException» в System.Data.dll, но не обрабатывался в коде пользователя Дополнительная информация: Неправильный синтаксис рядом с ключевым словом 'title'. – Enovyne

+0

Можете ли вы запустить запрос на ввод вручную в ssms? Например, 'INSERT INTO Submission (название, слайды, коды) VALUES (« Мой проект сохранения воды », NULL, NULL)? – Win

Смежные вопросы