日期时间格式更改 oledbCommand.executeNonQuery
datetime format changes upon oledbCommand.executeNonQuery
我在我的网站上有一个 sql 插入查询,它在 "dd/MM/yyyy HH:mm:ss" 中插入了一些字符串和整数,以及一个日期时间,直到今天它运行良好。然而,从今天开始,出于某种奇怪的原因,在查询的 executeNonQuery 方法期间,日期时间的格式更改为 "MM/dd/yyyy HH:mm:ss"。我不知道为什么会这样,这让我发疯。任何人都可以阐明为什么会发生这种情况以及我如何防止这种变化?任何帮助将不胜感激。
查询:
"INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus)VALUES(#" + o.OrderDate + "#," + o.MemberID + ","+o.CityID+",'" + o.OrderAdress + "',"+o.CreditCardID+",'Not sent')"
o 是一个包含所有数据的对象。
DateTime 值没有格式,但如果您希望连接,请强制对值的字符串表达式设置格式:
"INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus) VALUES(#" + o.OrderDate.ToString("yyyy'/'MM'/'dd") + "#," + o.MemberID + "," + o.CityID + ",'" + o.OrderAdress + "'," + o.CreditCardID + ",'Not sent')"
不过,使用参数要简单得多。
尝试在连接字符串时构建查询时出现大问题。这对于暴露于 SQL-Injection 来说是一件大事。最好的方法是使用参数化查询,您可以到处查看并找到它们,您可能只是没有意识到它们。
基本上在您的查询中,您使用“?”作为你想要的参数的占位符,然后添加一个具有实际值/数据类型的参数对象,OleDb 查询将把它放在它的位置并具有正确的数据类型,所以你不必担心格式化字符串从特定日期开始。
此外,对于名字,如果您有一个人的名字 "O'Conner" 怎么办?您刚刚预先终止了查询字符串,否则会失败。你会严重挠头的。
说了这么多,让我们回到您的查询,让它更具可读性,并对其进行参数化...
您将 ms-access 称为数据库和 OleDb,这意味着您正在用 C# 或 VB 或其他语言编写。我将使用 C# 进行演示,您可以根据需要更改为您的开发语言。
using(OleDbConnection connection1 = new OleDbConnection( WhateverYourConnectionString )
{
connection1.Open();
using(OleDbCommand sqlcmd = new OleDbCommand("", connection1))
{
// simplified query and you can see the "?" place-holders
sqlcmd.CommandText =
@"INSERT INTO Orders
( OrderDate,
MemberID,
CityID,
OrderAdress,
CreditCardID,
OrderStatus )
VALUES
( ?,
?,
?,
?,
?,
'Not sent' )";
// Now, add your parameters in the SAME ORDER as the "?" in the query
sqlcmd.Parameters.AddWithValue("parmForDate", o.OrderDate );
sqlcmd.Parameters.AddWithValue("parmForMember", o.MemberID );
sqlcmd.Parameters.AddWithValue("parmForCity", o.CityID );
sqlcmd.Parameters.AddWithValue("parmForAddress", o.OrderAddress );
sqlcmd.Parameters.AddWithValue("parmForCard", o.CreditCardID );
// since the last parameter is fixed, you can put that in explicitly.
// you can similarly put fixed field of other strings, numbers.
// Now you can execute it
sqlcmd.ExecuteNonQuery();
}
connection1.Close()
}
我在我的网站上有一个 sql 插入查询,它在 "dd/MM/yyyy HH:mm:ss" 中插入了一些字符串和整数,以及一个日期时间,直到今天它运行良好。然而,从今天开始,出于某种奇怪的原因,在查询的 executeNonQuery 方法期间,日期时间的格式更改为 "MM/dd/yyyy HH:mm:ss"。我不知道为什么会这样,这让我发疯。任何人都可以阐明为什么会发生这种情况以及我如何防止这种变化?任何帮助将不胜感激。
查询:
"INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus)VALUES(#" + o.OrderDate + "#," + o.MemberID + ","+o.CityID+",'" + o.OrderAdress + "',"+o.CreditCardID+",'Not sent')"
o 是一个包含所有数据的对象。
DateTime 值没有格式,但如果您希望连接,请强制对值的字符串表达式设置格式:
"INSERT INTO Orders(OrderDate,MemberID,CityID,OrderAdress,CreditCardID,OrderStatus) VALUES(#" + o.OrderDate.ToString("yyyy'/'MM'/'dd") + "#," + o.MemberID + "," + o.CityID + ",'" + o.OrderAdress + "'," + o.CreditCardID + ",'Not sent')"
不过,使用参数要简单得多。
尝试在连接字符串时构建查询时出现大问题。这对于暴露于 SQL-Injection 来说是一件大事。最好的方法是使用参数化查询,您可以到处查看并找到它们,您可能只是没有意识到它们。
基本上在您的查询中,您使用“?”作为你想要的参数的占位符,然后添加一个具有实际值/数据类型的参数对象,OleDb 查询将把它放在它的位置并具有正确的数据类型,所以你不必担心格式化字符串从特定日期开始。
此外,对于名字,如果您有一个人的名字 "O'Conner" 怎么办?您刚刚预先终止了查询字符串,否则会失败。你会严重挠头的。
说了这么多,让我们回到您的查询,让它更具可读性,并对其进行参数化...
您将 ms-access 称为数据库和 OleDb,这意味着您正在用 C# 或 VB 或其他语言编写。我将使用 C# 进行演示,您可以根据需要更改为您的开发语言。
using(OleDbConnection connection1 = new OleDbConnection( WhateverYourConnectionString )
{
connection1.Open();
using(OleDbCommand sqlcmd = new OleDbCommand("", connection1))
{
// simplified query and you can see the "?" place-holders
sqlcmd.CommandText =
@"INSERT INTO Orders
( OrderDate,
MemberID,
CityID,
OrderAdress,
CreditCardID,
OrderStatus )
VALUES
( ?,
?,
?,
?,
?,
'Not sent' )";
// Now, add your parameters in the SAME ORDER as the "?" in the query
sqlcmd.Parameters.AddWithValue("parmForDate", o.OrderDate );
sqlcmd.Parameters.AddWithValue("parmForMember", o.MemberID );
sqlcmd.Parameters.AddWithValue("parmForCity", o.CityID );
sqlcmd.Parameters.AddWithValue("parmForAddress", o.OrderAddress );
sqlcmd.Parameters.AddWithValue("parmForCard", o.CreditCardID );
// since the last parameter is fixed, you can put that in explicitly.
// you can similarly put fixed field of other strings, numbers.
// Now you can execute it
sqlcmd.ExecuteNonQuery();
}
connection1.Close()
}