我在Oracle中有Date Var,我尝试从我的C#程序中插入数据
sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";
我收到错误,我该怎么办?
答案 0 :(得分:10)
cmd.CommandText = "INSERT INTO Table (myDate)VALUES(:dateParam)";
cmd.Parameters.Add(new OracleParameter("dateParam", OracleDbType.Date))
.Value = DateTime.Now;
cmd.ExecuteNonQuery();
答案 1 :(得分:8)
使用参数。它将解决您的问题并防止注射。
答案 2 :(得分:5)
Oracle期望它是一个实际的日期值,而不仅仅是一个看起来像日期的字符串。您必须使用TO_DATE()
函数来解释字符串的格式,如下所示:
INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
答案 3 :(得分:1)
尝试使用DateTime.TryParse(text)或DateTime.Parse(text)
答案 4 :(得分:1)
请绑定您的变量(如ocdecio告诉)!它不仅可以防止sql注入,而且速度也快得多。特别是在多并发情况下。请在此处阅读:http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB。
“绑定变量是SQL语句中的占位符。当数据库收到SQL语句时,它确定该语句是否已经执行并存储在内存中。如果该语句确实存在于内存中,Oracle数据库可以重用它并跳过解析和优化语句的任务。使用绑定变量使语句可以使用不同的输入值重用。使用绑定变量还可以提高数据库中的查询性能,无需特殊处理文字引号输入,并防止SQL注入攻击。“
答案 5 :(得分:0)
我知道这是一个问题很少的问题,但是当我遇到同样的问题时,我看到了一些不好的答案。这就是我解决它的方法,我将使用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
作为connection
,请设置您的命令并添加参数:
OracleCommand cmd = new OracleCommand(sql, connection);
cmd.Parameters.Add(param);
执行:
cmd.ExecuteNonQuery();
NOT 在任何TO_DATE
废话上浪费你的时间。这适用于直接使用SQL * Plus或Oracle SQL Developer添加内容,或者您希望以TO_DATE
期望的EXACT格式发送STRING变量值(不是DateTime变量)的MAYBE,以及您在您的查询或存储过程中的TO_DATE
构造内进行分配(即to_date('2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS')
。使用DateTime
变量并将其分配给OracleParameter
OracleDbType
OracleDbType.Date
,假设您的表格中有DATE
字段,并且可以将txt
解析为DateTime
变量,但最好也是最简单的。
答案 6 :(得分:0)
最简单的方法:
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