2015-04-20 5 views
0
Dim Query As String 
Dim con As SqlConnection = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Minimarket;Integrated Security=True") 
     Query = "INSERT INTO Barang(kode_bar,kode_kat,nama_bar,satuan, hbeli, hjual, stok, expired)VALUES(" 
     Query = Query + txtkodebar.Text + ",'" + cmbkodekat.Text + "','" + txtnamabar.Text + "','" + txtsatuan.Text + "','" + txthbeli.Text + "','" + txthjual.Text + "','" + txtstok.Text + "','" + Format(dtpex.Text, "yyyy-MM-dd HH:mm:ss") + "'" 
     con.Open() 
     Dim cmd As SqlCommand = New SqlCommand(Query, con) 
     Dim i As Integer = cmd.ExecuteNonQuery() 
     If (i > 0) Then 
      MessageBox.Show("Data berhasil disimpan") 
     Else 
      MessageBox.Show("Data gagal disimpan") 
     End If 
     con.Close() 

* Кто-нибудь может мне помочь? когда я нажимаю кнопку save, появляется ошибка неправильного синтаксиса рядом с ',' в cmd.executenonquery. что я должен делать сейчас? я упал отказаться: '(*ошибка команды * неправильный синтаксис рядом ',' *

+4

** [ИСПОЛЬЗУЕТ ПАРАМЕТРИРОВАННЫЕ ВОПРОСЫ !!!] (http://bobby-tables.com/) ** Извинения за крик, но это так важно **, а не только для безопасности, но и для производительности , Параметрированные запросы правильно набраны и могут повторно использовать кэшированные планы. Нет никакой веской причины не использовать их. – GarethD

+1

'Query = Query + txtkodebar.Text +", '"' вам не хватает кавычек вокруг 'txtkodebar.Text' – ElGavilan

+0

Помимо вашей проблемы, этот код открыт для атак SQL Injection. Вы никогда не хотите брать текст пользователя и включать его непосредственно как встроенную строку. Вот статья, в которой объясняется проблема вашего кода: http://blogs.msdn.com/b/cdndevs/archive/2013/04/01/security-code-review-techniques-sql-injection-edition.aspx – CertifiedCrazy

ответ

0

У вас не хватает места между истек) и ЗНАЧЕНИЕ, вы также недостающие кавычки txtkodebar.Text, см исправленного codebelow:

Dim Query As String 
Dim con As SqlConnection = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Minimarket;Integrated Security=True") 
    Query = "INSERT INTO Barang(kode_bar,kode_kat,nama_bar,satuan, hbeli, hjual, stok, expired) VALUES(" 
    Query = Query + "'" + txtkodebar.Text + "','" + cmbkodekat.Text + "','" + txtnamabar.Text + "','" + txtsatuan.Text + "','" + txthbeli.Text + "','" + txthjual.Text + "','" + txtstok.Text + "','" + Format(dtpex.Text, "yyyy-MM-dd HH:mm:ss") + "')" 
    con.Open() 
    Dim cmd As SqlCommand = New SqlCommand(Query, con) 
    Dim i As Integer = cmd.ExecuteNonQuery() 
    If (i > 0) Then 
     MessageBox.Show("Data berhasil disimpan") 
    Else 
     MessageBox.Show("Data gagal disimpan") 
    End If 
    con.Close() 

Как заявил @GarethD, вы также должны прочитать параметризованные запросы, так как ваш текущий запрос уязвим для SQL-инъекции.

+0

У меня есть изменение, как ур, но в команде * есть еще ошибка: * Неверный синтаксис рядом с 'yyyy-MM-dd HH: mm: ss'. * Я считаю, что формат был верным для типа таблицы данных «datetime», но почему это формат все еще неправильный? : o –

+0

Можете ли вы разместить содержание запроса? – Jaco

+0

Я скорректировал код выше, я добавил закрытие, заторможенное) после даты. – Jaco

0

Причина вы получаете эту ошибку эта часть вашего запроса:

Query = Query + txtkodebar.Text + ",'" 

Это приводит не кавычками txtkodebar.Text. Вы можете это исправить, изменив его следующим образом:

Query = Query + "'" + txtkodebar.Text + "','" 

, но гораздо лучший способ, чтобы исправить это было бы использовать параметризованные запросы, которые не только делают этот запрос гораздо менее склонны к ошибкам, она также устраняет очень плохое отверстие безопасности у вас здесь. Что произойдет, если кто-то передаст «dummy','2015-01-01');DROP DATABASE;» в txtstok.Text?

+0

о, Боже .... я сделал невозможный код ... извините ... huft ... этот код так сильно ... –

0

Скорее всего, у вас есть что-то вроде O'shea в одном из ваших текстовых полей, а это значит, что, поскольку вы используете конкатенацию строк, чтобы построить строку запроса, а не параметры, вы получите неправильную строку.

Если переключиться на использование собственно параметризованные запросов, вы удалите шансы, что это произойдет, и будет посылать правильно отформатированный инструкцию SQL на сервер:

Dim Query As String 
Query = "INSERT INTO Barang(kode_bar,kode_kat,nama_bar,satuan, hbeli, hjual, stok, expired)" & _ 
     "VALUES(@kode_bar,@kode_kat,@nama_bar,@satuan, @hbeli, @hjual, @stok, @expired)" 

Using conn As New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Minimarket;Integrated Security=True") 
    Using cmd As New SqlCommand(Query, conn) 
     cmd.Parameters.Add("@kode_bar", SqlDbType.Int).Value = txtkodebar.Text 
     cmd.Parameters.Add("@kode_kat", SqlDbType.VarChar, 50).Value = cmbkodekat.Text 
     cmd.Parameters.Add("@nama_bar", SqlDbType.VarChar, 50).Value = txtnamabar.Text 
     cmd.Parameters.Add("@satuan", SqlDbType.VarChar, 50).Value = txtsatuan.Text 
     cmd.Parameters.Add("@hbeli", SqlDbType.VarChar, 50).Value = txthbeli.Text 
     cmd.Parameters.Add("@hjual", SqlDbType.VarChar, 50).Value = txthjual.Text 
     cmd.Parameters.Add("@stok", SqlDbType.VarChar, 50).Value = txtstok.Text 
     cmd.Parameters.Add("@expired", SqlDbType.DateTime).Value = DateTime.ParseExact(dtpex.Text, "yyyy-MM-dd HH:mm:ss", Nothing) 

     conn.Open() 
     Dim i As Integer = cmd.ExecuteNonQuery() 
     If (i > 0) Then 
      MessageBox.Show("Data berhasil disimpan") 
     Else 
      MessageBox.Show("Data gagal disimpan") 
     End If 
    End Using 
End Using 

я должен был угадать ваши типы данных , но должно быть достаточно ясно, как переключаться между различными типами. Это также около 5 лет с тех пор, как я написал что-нибудь в VB.NET, поэтому, пожалуйста, простите любые синтаксические ошибки.

+0

yea ...это код может разрешить от неправильного синтаксиса рядом с ";" но есть и другая команда с ошибкой вроде этого: «String не была признана допустимым DateTime». я не знаю, что случилось с этим форматом cz, я думал, что это правильно для datatype datetime ... –

+0

Я думаю, что ошибка возникает из этого: 'DateTime.ParseExact (dtpex.Text," yyyy-MM-dd HH: mm: ss ", Nothing) ', вы уверены, что' dtpex.Text' является допустимым дата-временем? – GarethD

+0

У меня есть check in mydatabase sql server, тип данных был datetime, поэтому в Visual Basic 2010 я использую date time picker (dtpex.text) для даты ввода истекших вещей, которые я вставляю в mydatabase ... –

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