2016-04-19 3 views
0
Dim SALESINSERT As New SqlCommand("INSERT INTO Tbl_Sales (Sale_id, Transaction_No, Customer_id, Item_id, Amount, Date) VALUES(" _ 
           & SalesIdMax + 1 & "," & Transaction_label.Text & "," & 1 & "," & Label4.Text & "," & TextBox1.Text & _ 
           "," & DateTimePicker1.Value.Date & ")", sqlcon) 

sqlcon.Open() 
SALESINSERT.ExecuteNonQuery() 
sqlcon.Close() 

SALESINSERT = Nothing   

У меня этот код. Все работает отлично, но проблема связана с датой. По какой-то причине он вставляет одну и ту же дату каждый раз: «1/1/1900».Вставить дату в базу данных SQL Server через vb.net

Когда я отлаживал код, чтобы увидеть текст команды SQL, все было нормально, и дата была прекрасной, и я выполнил ее в SQL-запросе, и все было в порядке.

Но в VB это не так.

Я не знаю, почему он не работает.

Возможно, у меня есть предложения по его устранению.

+3

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

+2

Во-первых, я настоятельно рекомендую вам использовать [Option Strict On] (https://msdn.microsoft.com/en-us/library/zcd4xwzs .aspx). Затем используйте параметры SQL для значений в запросе. –

+0

«Все работает нормально?» Это сбивает с толку, поскольку этот код не может работать –

ответ

1

Если вы всегда используете параметризованные запросы, вы избежите проблем с представлением дат в виде строк.

Вы можете использовать параметры SQL (я должен был угадать тип данных столбца базы данных) для вашего запроса, как это:

Dim salesinsert As New SqlCommand("INSERT INTO Tbl_Sales ([Sale_id], [Transaction_No], [Customer_id], [Item_id], [Amount], [Date])" & 
            " VALUES(@SaleId, @TransactionNo, @CustomerId, @ItemId, @Amount, @Date)", sqlcon) 

salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@SaleId", .SqlDbType = SqlDbType.Int, .Value = SalesIdMax + 1}) 
salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@TransactionNo", .SqlDbType = SqlDbType.NVarChar, .Size = 20, .Value = Transaction_label.Text}) 
salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@CustomerId", .SqlDbType = SqlDbType.Int, .Value = 1}) 
salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@ItemId", .SqlDbType = SqlDbType.NVarChar, .Size = 20, .Value = Label4.Text}) 
salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@Amount", .SqlDbType = SqlDbType.Decimal, .Value = CDec(TextBox1.Text)}) 
salesinsert.Parameters.Add(New SqlParameter With {.ParameterName = "@Date", .SqlDbType = SqlDbType.DateTime, .Value = DateTimePicker1.Value}) 

sqlcon.Open() 
salesinsert.ExecuteNonQuery() 
sqlcon.Close() 

salesinsert.Dispose() 
  • Я сбежавших имена столбцов в квадратных скобках - это позволяет избежать проблем с использованием SQL reserved keywords как имена столбцов. Легче всегда избегать имен столбцов.
  • Вы не должны устанавливать SALESINSERT = Nothing - вместо этого используйте salesinsert.Dispose(), так как это правильно очищает неуправляемые ресурсы.
  • Вам необходимо изменить каждый .SqlDbType.Size для строк) в соответствии с типами данных столбцов базы данных. Десятичные значения должны соответствовать, а также определены .Scale и .
  • Элементы управления могут использовать описательные имена - TextBox1 не предполагает, что в нем будет количество.
  • Значения должны быть проверены перед запуском запроса, например. может ли текст суммы быть преобразован в десятичное число и является ли это разумным значением.
+0

хорошо, что будет делать это, но я задаюсь вопросом о том, как вы добавляете параметры, потому что я просто использовал этот способ «SALESINSERT.Parameters.Add (« @ trans », SqlDbType.BigInt) .Value = Transaction_label.Текст ", и это не помогло, почему? – Abram

+0

хорошо, что это сделает, но я задаюсь вопросом о том, как вы добавляете параметры, потому что я просто использовал этот способ 'SALESINSERT.Parameters.Add (« @ trans », SqlDbType.BigInt) .Value = Transaction_label.Text', и он не сделал работа почему это? – Abram

+0

@Abram 1) Мне нравится использовать '.Add (New SqlParameter С {....' потому что он делает очевидным, что параметры * и он работает *. 2) У вас ошибка несоответствия типа данных. Вы не можете назначить строку числу - если вы используете Option Strict On, тогда компилятор укажет на это. –

0

Используйте одинарные кавычки для значения даты ",'" & DateTimePicker1.Value.Date & "')"

Или

",#" & DateTimePicker1.Value.Date & "#)" 
0

Проблема с форматом указанной даты. вы можете избежать этой проблемы, форматируя ввод dateTime, используя .ToString(). т.е.

DateTimePicker1.Value.Date.ToString("yyyy-MM-dd HH:mm:ss") 

Тогда возникает реальная проблема injection; чтобы избежать необходимости использовать parameterised queries вместо текстовых запросов.

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