2011-10-14 39 views
0

我在VB運行此命令Vb.net抓住從SQL Server的時間和格式化錯誤

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 = (" & commander("finish_time") & ") where orders_table.tuid =" & num & "" 
    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」不正確的語法

它的格式datetime和我不想要它......如何解決它,所以它看起來像這樣

2011-10-14 00:20:00.000 
+6

精靈 - 這是**非常壞**使用字符串連接來建立你的SQL這種方式。 **不要這樣做!** –

回答

1

而不是()可以使用'#來分隔日期時間:

str = "update orders_table set start_time = '" & commander("finish_time") & "' where orders_table.tuid =" & num & "" 

這是不是推薦使用SQL的方式,但是(字符串連接),因爲它打開您的代碼高達SQL Injection

它是很多更好地使用參數化查詢,這將避免整個值的轉義問題。看到@JoelCoehoorn給出的答案。

+0

做了這個把戲謝謝 – user867621

+0

@用戶請不要告訴我你沒有修復你的代碼中明顯的安全漏洞:( –

+1

@代表 - 對不起downvote,但我對於未來的讀者來說,將字符串連接修復看作是一個合理的選擇是一個不錯的主意。 –

0

你在格式化這個字符串(我相信這!)

commander("finish_time") 

只要不格式化,或格式化它像在數據庫中,但不同之處在於你如何格式化..

4

這裏是一個安全和當前代碼的工作版本:

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語句中寫入所有內容。