#vb.net #sql-server-2008 #datetime
#vb.net #sql-server-2008 #дата и время
Вопрос:
Я запускаю эту команду в vb
select tuid, finish_time, bay
from orders_table
where tuid between 1001 and 1005 order by finish_time asc
который возвращает
tuid finish_time bay
1005 2011-10-14 00:20:00.000 5
затем я запускаю эту команду в vb
While commander.Read()
str = "update orders_table set start_time = (" amp; commander("finish_time") amp; ") where orders_table.tuid =" amp; num amp; ""
Dim myCommand3 As SqlCommand = New SqlCommand(str, myConn2)
myCommand3.ExecuteNonQuery()
Когда я запускаю отладчик, чтобы посмотреть, что str отправляет в базу данных, я получаю следующее
str "update orders_table set start_time = (10/14/2011 12:20:00 AM) where orders_table.tuid =1006" String
Выдает ошибку с неправильным синтаксисом рядом с «12»
Он форматирует дату и время, а я этого не хочу… как я могу это исправить, чтобы это выглядело так
2011-10-14 00:20:00.000
Комментарии:
1. Аргумент — очень ПЛОХО использовать конкатенацию строк для построения вашего sql таким образом. НЕ ДЕЛАЙТЕ ЭТОГО!
Ответ №1:
Вот безопасная и рабочая версия вашего текущего кода:
str = "UPDATE orders_table SET start_time = @start_time WHERE orders_table.tuid = @num"
Dim myCommand3 As New SqlCommand(str, myConn2)
myCommand3.Parameters.Add("@start_time", SqlDbType.DateTime)
myCommand3.Parameters.Add("@num", SqlDbType.Int)
While commander.Read()
myCommand3.Parameters(0).Value = commander("finish_time")
myCommand3.Parameters(1).Value = num
myCommand3.ExecuteNonQuery()
End While
Но еще лучший способ — переписать ваш sql так, чтобы все это происходило на сервере, и вы даже не читали результаты выбора обратно в клиентский код. Вы можете записать все это в одном операторе sql.
Ответ №2:
Вместо ()
вы можете использовать '
или #
для разграничения даты и времени:
str = "update orders_table set start_time = '" amp; commander("finish_time") amp; "' where orders_table.tuid =" amp; num amp; ""
Однако это не рекомендуемый способ использования SQL (конкатенация строк), поскольку он открывает ваш код для SQL-инъекции.
Гораздо лучше использовать параметризованные запросы, это также позволит избежать всей проблемы экранирования значений. Смотрите Ответ, который дал @JoelCoehoorn.
Комментарии:
1. @user пожалуйста, не говорите мне, что вы не исправляете явную дыру в безопасности в своем коде: (
2. @oded — извините за понижение, но я не думаю, что будущим читателям стоит рассматривать исправление конкатенации строк как законный вариант.
3. @JoelCoehoorn — справедливое замечание. Не думал… Не то, чтобы я мог удалить свой ответ, теперь, когда он был принят…
Ответ №3:
вы формируете строку с помощью этого (я предполагаю это!)
commander("finish_time")
Просто не форматируйте его или не форматируйте его, как в базе данных, но разница заключается в том, как вы его форматируете..