我在 Oracle 中有 Date Var,我尝试从我的 C# 程序中插入数据
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
我得到一个错误,我该怎么办?
cmd.CommandText = "INSERT INTO Table (myDate)VALUES(:dateParam)";
cmd.Parameters.Add(new OracleParameter("dateParam", OracleDbType.Date))
.Value = DateTime.Now;
cmd.ExecuteNonQuery();
使用参数。它将解决您的问题并防止注射。
Oracle 期望它是一个实际的日期值,而不仅仅是一个看起来像日期的字符串。您必须使用该TO_DATE()
函数来解释您的字符串是如何格式化的,如下所示:
INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
尝试使用 DateTime.TryParse(text) 或 DateTime.Parse(text)
最简单的方法:
DateTime inputDate = Convert.ToDateTime("01/01/2019"); //<---Input Sample Date in format
string queryParameters = String.Format("SELECT * FROM TABLE WHERE DATE = '{0}')", inputDate.ToString("dd-MMM-yyyy")); //<-- Converts System.DateTime into Oracle DateTime
//Forget looking anywhere else for an answer, copy and paste and reform this very code
//and see the results
请绑定您的变量(如 ocdecio 所说)!它不仅可以防止 sql 注入,而且速度更快。特别是在多并发的情况下。在这里阅读示例:http: //download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB。
“绑定变量是 SQL 语句中的占位符,当数据库收到一条 SQL 语句时,它会判断该语句是否已经执行并存储在内存中。如果该语句确实存在于内存中,Oracle 数据库可以重用它并跳过解析和优化语句。使用绑定变量使语句可以在不同的输入值下重复使用。使用绑定变量还可以提高数据库中的查询性能,消除对输入中文字引号的特殊处理的需要,并防止 SQL 注入攻击。 "
我知道这是一个问得很糟糕的问题,但是当我遇到同样的问题并遇到这个问题时,我看到了一些糟糕的答案。这就是我解决它的方法,我将使用 OP 的上下文来回答:
将日期解析为DateTime
变量:
DateTime myDate = DateTime.Parse(txt);
然后参数化您的查询:
sql = "insert into Table(MyDate) values (:myDate)";
设置一个OracleParameter
:
OracleParameter param = new OracleParameter();
param.ParameterName = "myDate";
param.OracleDbType = OracleDbType.Date;
param.Value = myDate;
假设您已经有了OracleConnection
as connection
,设置您的命令并添加您的参数:
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.Parameters.Add(param);
执行:
cmd.ExecuteNonQuery();
不要把时间浪费在任何TO_DATE
废话上。这适用于当您直接使用 SQL*Plus 或 Oracle SQL Developer 添加内容时,或者您可能希望以期望的精确格式发送 STRING 变量的值(不是 DateTime 变量),并且您在其中的构造中TO_DATE
分配TO_DATE
您的查询或存储过程(即to_date('2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS')
。使用DateTime
变量并将其分配给OracleParameter
带有OracleDbType
of的变量OracleDbType.Date
,假设您DATE
的表中有一个字段并且可以解析txt
为DateTime
变量,但是,这是最好和最简单的。