#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 секунд.