2016-05-17 5 views
-1
sqlCommand1 = new SqlCommand("INSERT INTO dbo.Orders(Title,Seats,Payment,DateNTime)"+ 
      "VALUES ('"+ movieName+"',"+numTickets+",'"+creditCardType+"',"+DateTime.Now+")", sqlConnection1); 
     sqlCommand1.Connection.Open(); 
     sqlCommand1.ExecuteNonQuery(); 
     sqlCommand1.Connection.Close(); 

Не знаю, что не так с этим фрагментом кода. Название и оплата хранятся как типы nvarchar, Seats as int и DateNTime как DateTime. Может кто-нибудь мне помочь?ExecuteNonQuery Неправильный синтаксис рядом с ','

Заранее спасибо

+3

Использование параметризованных запросов вместо конкатенации строк в операторы sql. Это защитит вас от SQL-инъекций, а также решит проблему с синтаксической ошибкой. –

+0

Какие РСУБД (поставщик и версия)? У всех из них есть функция для получения текущего времени (например, GETDATE() в SQL Server) ... – Shnugo

+0

Не могли бы вы отладить это заявление и разместить здесь то, что находится в переменной «sqlCommand1»? –

ответ

2

Потребность цитаты для дат, а также:

,'" + DateTime.Now.ToString("yyyyMMdd") + "')" 

Но это очень опасный код, который вы знаете. Вы действительно должны использовать параметризованный запрос для таких вещей!

Вы будете в беде, если пользователь вводит в текстовое поле Название что-то вроде этого:

some text', 1, 1, '20100101'); drop table dbo.Orders--

И вы уволены в тот же день.

+0

Могу быть OP нужно время там ... – Shnugo

+0

@ Шнуго, может быть, он просто изменит, что я надеюсь :) –

+0

@GiorgiNakeuri Это сработало! благодаря! Как насчет времени? Безусловно, это только показывает мне дату. Если я хочу видеть дату и время, мне нужно написать «yyyyMMddHHmm»? что-то вроде того? – Jadenkun

0

Попробуйте использовать следующие

sqlCommand1 = new SqlCommand("INSERT INTO dbo.Orders(Title,Seats,Payment,DateNTime)"+ 
      "VALUES ('"+ movieName+"',"+numTickets+",'"+creditCardType+"','"+DateTime.Now+"')", sqlConnection1); 
     sqlCommand1.Connection.Open(); 
     sqlCommand1.ExecuteNonQuery(); 
     sqlCommand1.Connection.Close(); 

Даже после этого изменения, если вы получаете сообщение об ошибке, пожалуйста, сообщите тип данных о праве собственности, мест, оплаты, DateNTime

1

Весьма вероятно, что ошибка лежит здесь:

... ,"+DateTime.Now+")" 

Вы должны убедиться, что строковое выражение для DateTime.Now является синтаксическим методом в SQL.

  1. Не помещайте значения в SQL Comman (читать о инъекции SQL)
  2. Подробнее о параметрах и как передать их
  3. Никогда не полагайтесь на культуре зависимых финиковых временных форматов ... (читать об ISO8601 или ODBC)
0

У вас также есть форма даты.

sqlCommand1 = new SqlCommand("INSERT INTO dbo.Orders(Title,Seats,Payment,DateNTime)"+ 
     "VALUES ('"+ movieName+"',"+numTickets+",'"+creditCardType+"','"+DateTime.Now.ToString("yyyyMMdd")+"')", sqlConnection1); 
    sqlCommand1.Connection.Open(); 
    sqlCommand1.ExecuteNonQuery(); 
    sqlCommand1.Connection.Close(); 
1

Угадайте, что это вызвано кодом C#, вы должны использовать параметры вместо конкатенации строк в операторы sql.

Это и защитит вас от sql injection атак и исправить ошибку синтаксиса:

Этот код должен вероятно работать для вас, хотя это написано прямо здесь, и я не проверял:

using (var sqlConnection1 = new SqlConnection("ConnectionString")) 
{ 
    using (var sqlCommand1 = new SqlCommand("INSERT INTO dbo.Orders(Title,Seats,Payment,DateNTime)" + 
    "VALUES (@movieName, @numTickets, @creditCardType, @DateTime.Now)", sqlConnection1)) 
    { 
     sqlCommand1.Parameters.Add("@movieName", SqlDbType.VarChar).Value = movieName; 
     sqlCommand1.Parameters.Add("@numTickets", SqlDbType.VarChar).Value = numTickets; 
     sqlCommand1.Parameters.Add("@creditCardType", SqlDbType.Int).Value = creditCardType; 
     sqlCommand1.Parameters.Add("@movieName", SqlDbType.DateTime).Value = DateTime.Now; 

     sqlCommand1.Connection.Open(); 
     sqlCommand1.ExecuteNonQuery(); 
    } 
} 
Смежные вопросы