-2

我在 Oracle 中有 Date Var,我尝试从我的 C# 程序中插入数据

sql = "insert into Table(MyDate) values (" + convert.todatetime(txt) + ")";

我得到一个错误,我该怎么办?

4

7 回答 7

12
cmd.CommandText = "INSERT INTO Table (myDate)VALUES(:dateParam)";

cmd.Parameters.Add(new OracleParameter("dateParam", OracleDbType.Date))
    .Value = DateTime.Now;

cmd.ExecuteNonQuery();
于 2009-03-30T18:23:10.820 回答
8

使用参数。它将解决您的问题并防止注射。

于 2009-03-30T18:09:26.237 回答
6

Oracle 期望它是一个实际的日期值,而不仅仅是一个看起来像日期的字符串。您必须使用该TO_DATE()函数来解释您的字符串是如何格式化的,如下所示:

INSERT INTO Table (myDate)
VALUES(TO_DATE('2009-03-30 12:30:00', 'YYYY-MM-DD HH:mi:ss'));
于 2009-03-30T18:10:14.487 回答
1

尝试使用 DateTime.TryParse(text) 或 DateTime.Parse(text)

于 2009-03-30T18:11:49.710 回答
1

最简单的方法:

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
于 2019-03-06T16:46:13.047 回答
0

请绑定您的变量(如 ocdecio 所说)!它不仅可以防止 sql 注入,而且速度更快。特别是在多并发的情况下。在这里阅读示例:http: //download.oracle.com/docs/cd/B28359_01/appdev.111/b28844/building_odp.htm#CEGCGDAB

“绑定变量是 SQL 语句中的占位符,当数据库收到一条 SQL 语句时,它会判断该语句是否已经执行并存储在内存中。如果该语句确实存在于内存中,Oracle 数据库可以重用它并跳过解析和优化语句。使用绑定变量使语句可以在不同的输入值下重复使用。使用绑定变量还可以提高数据库中的查询性能,消除对输入中文字引号的特殊处理的需要,并防止 SQL 注入攻击。 "

于 2009-03-30T18:29:26.453 回答
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;

假设您已经有了OracleConnectionas 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带有OracleDbTypeof的变量OracleDbType.Date,假设您DATE的表中有一个字段并且可以解析txtDateTime变量,但是,这是最好和最简单的。

于 2016-10-05T17:15:46.927 回答