Большой двоичный объект, вставка базы данных SQL

#c# #asp.net #sql #blob

#c# #asp.net #sql #Большой двоичный объект

Вопрос:

У меня ошибка, которую я не могу исправить… Я действительно не знаю, почему.

Я использую этот код для загрузки файла в свою базу данных, я хочу использовать большой двоичный объект сейчас.

 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();

                    }
 

В моей базе данных данные полей в файлах таблиц являются переменными (макс.) .
Параметр для поля ДАННЫХ в запросе — это байты файла, который я пытаюсь загрузить .

Произошла ошибка: «Ошибка неявного преобразования типа данных varchar в varbinary (max) не допускается. Используйте функцию CONVERT для выполнения этого запроса «.

Может кто-нибудь сказать мне, почему?

Большое вам спасибо.

Комментарии:

1. Подобный код просто напрашивается на атаку SQL-инъекцией . Пожалуйста, используйте параметризованные запросы.

Ответ №1:

Я думаю, проблема в том, что вы передаете байт [] своего изображения в виде строки, потому что вы заключаете его в одинарные кавычки.

Удалите одинарные кавычки здесь:

 '"   FileUpload1.FileBytes   "'"
 

Еще одна рекомендация: используйте параметры для ваших запросов. Вы избавите себя от атак sql-инъекций, ваши запросы будут выполняться быстрее, и вы устраните подобные ошибки в будущем.

ОБНОВЛЕНИЕ — использование параметров:

 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();
 

Комментарии:

1. Хорошо, готово! Но почему я получил эту ошибку сейчас? Ошибка Имя объекта или столбца отсутствует или пустое. Для операторов SELECT INTO убедитесь, что у каждого столбца есть имя. Для других операторов ищите пустые псевдонимы. Псевдонимы, определенные как «» или [], не допускаются. Измените псевдоним на допустимое имя. Неправильный синтаксис рядом с «.

2. @Emged теперь у вас неправильный синтаксис. Распечатайте инструкцию sql, которую вы отправляете на SQL Server, и посмотрите, как она выглядит.

3. Да .. ВСТАВИТЬ В файлы (имя, путь, загрузка пользователя, дата, данные) ЗНАЧЕНИЯ (‘WSB BOXE 20.jpg ‘,’Проекты // ТЕСТ/’,’Администратор’,’28.10.2011 12:41:16 вечера’, Система. Байт[] );ВЫБЕРИТЕ ПРИВЕДЕНИЕ(scope_identity() КАК int) Это выглядит не очень хорошо..

4. Я должен иметь возможность видеть числа вместо системы. Байт [] , верно?

5. @Emged я вижу… Вы передаете массив байтов во встроенном sql следующим образом. Вместо этого используйте параметры. Пример будет приведен через 5 секунд.