Member 13421231 Ответов: 1

Ошибка вставки изображения в базу данных


Я хочу вставить изображение в базу данных, но получил ошибку " дополнительная информация: неправильный синтаксис рядом с '@images'. "






<pre lang="c#">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;
namespace Carprogram
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SqlConnection connection = new SqlConnection("Data Source=NAWAF;Initial Catalog=CAR;Integrated Security=True");
        string imgloc="";
        SqlCommand cmd;
         private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
          OpenFileDialog dialog = new OpenFileDialog ();
             dialog.Filter = "png files(*.png)|*.png|jpg files(*.jpg)|*.jpg|All files(*.*)|*.*";
             if(dialog.ShowDialog()==DialogResult.OK)
             {
                 imgloc =dialog.FileName.ToString();
                 pictureBox1.ImageLocation=imgloc;

             }
        }


        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void save_Click(object sender, EventArgs e)
        {


            byte[] images = null;
            FileStream Streem = new FileStream(imgloc, FileMode.Open, FileAccess.Read);
            BinaryReader brs = new BinaryReader(Streem);
            images = brs.ReadBytes((int)Streem.Length);

            SqlConnection con = new SqlConnection("Data Source=NAWAF;Initial Catalog=CAR;Integrated Security=True");
            con.Open();
            SqlCommand cmd = new SqlCommand(@"INSERT INTO [CAR].[dbo].[vehicleinfo]
                ( [modely]
                 ,[make]
                 ,[model]
                 ,[Color]
                 ,[type]
                 ,[odometer]
                 ,[vin]
                 ,[vehicle]
                 ,[driverop]
                 ,[department]
                 ,[img])
                
                VALUES
                     ('" + modely.Text + "' ,'" + make.Text + "' , '" + model.Text + "' , '" + color.Text + "' , '" + type.Text + "''" + odometer.Text + "' ,'" + vin.Text + "' , '" + vehicle.Text + "' , '" + driverop.Text + "' , '" + department.Text + "',@images",con);


            cmd.Parameters.Add("@images", images);
            cmd.ExecuteNonQuery();

            con.Close();









        }

       
    }
}


Что я уже пробовал:

cmd.Parameters.add(new SqlParameter"@images",images);

1 Ответов

Рейтинг:
5

OriginalGriff

Не делай этого так! Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку с точки зрения SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x'; DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Вы знаете, что такое параметризованный запрос, поэтому используйте их... а затем добавьте закрывающую скобку к вашему SQL-оператору...


Member 13421231

Я постараюсь использовать параметризованный запрос
вы можете помочь с этим?

OriginalGriff

Вы знаете, как их использовать - вы уже используете один из них в этом коде!

Member 13421231

я копирую это из видео на youtube, я учусь и новичок в sql & c#

OriginalGriff

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

Итак, какая часть вашего запроса параметризована? Соберите для меня небольшой образец, и я объясню, что происходит.

Member 13421231

я знаю, как вставить изображение в БД , но чего я не знаю, так это как вставить изображение в базу данных, поэтому я искал на youtube и узнал, что это объясняет
настоящий кодекс "

**
Sqlconnection connection = new SqlConnection ("источник данных=NAWAF;начальный каталог=CAR;Интегрированная безопасность=True");
строка imgloc="";
Команда sqlcommand cmd в;
**

**
byte[] images = null;
FileStream Streem = новый FileStream(imgloc, FileMode.Открытия, Флагами Fileaccess.Читать);
BinaryReader brs = новый BinaryReader(Streem);
images = brs. ReadBytes ((int)Streem.Длина);
**

"

эти две части я копирую с youtube

OriginalGriff

И что он делает? Почему он это делает? Или вы просто копируете код из случайных мест и запускаете его, не глядя на то, что он вообще делает? Потому что это очень опасно! Если вы не понимаете код, не пытайтесь его запустить - или вы не слышали о вымогателях, вирусах, троянах ... ?

Member 13421231

ты все усложняешь для меня

спасибо за ваше время и помощь

OriginalGriff

Нет, я пытаюсь облегчить тебе жизнь в будущем.
В данный момент Вы пытаетесь выбрать легкий путь: получить код, скрепить его болтами, надеяться, что он сработает. Но когда этого не происходит, как сегодня ... ты понятия не имеешь, что делать.
То, что я пытаюсь заставить вас сделать, это другое: приложите немного усилий сейчас, чтобы узнать, как и почему вы делаете вещи, чтобы на следующей неделе вы могли сделать это для себя. Если вы не узнаете "почему", а также" что", этого никогда не произойдет.

Парень с YouTube объяснил, почему вы это делаете или что он делает? Я сомневаюсь в этом - потому что он знает об этом столько же, сколько и ты, но этот кусочек, который он скрутил вместе, сработал, когда он попробовал!

Member 13421231

я знаю, что вы хотите помочь мне, и я хочу, узнав все, что я буду помогать людям не так, как дать ему совет о sql-инъекции , я дам ему полный ответ после того, как исправлю его код и дам ему два кода один без параметризованных запросов, а другой с параметризованными запросами после того , как сделаю все это , я дам ему совет о sql-инъекции, это легенда помощи, а не как ? Почему? - куда ? тебе нужна помощь или мне ?

OriginalGriff

Что ж, я знаю, что делаю ... поэтому я подозреваю, что именно вам нужна помощь: смейтесь:

Итак, начните учиться: вы знаете, почему мы используем их сейчас, но как выглядит параметризованный запрос?

Member 13421231

я пытаюсь, но я нашел так мало информации о c# и sql

OriginalGriff

Ты ведь шутишь, правда? Быстрый поиск на этом сайте показывает около 10 000 статей, связанных только с SQL и C# - это игнорирует форумы, вопросы, ответы ... и Google найдет еще огромное количество.