Vb.net захват времени с sql server и неправильное его форматирование

#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")
  

Просто не форматируйте его или не форматируйте его, как в базе данных, но разница заключается в том, как вы его форматируете..