حصلت على ORA-01843 عندما أحاول إدراج التاريخ والوقت إلى Oracle

StackOverflow https://stackoverflow.com/questions/1567104

سؤال

لدي ANB B بتنسيق سلسلة

A = 14/01/2007

ب = 22:10:39

أحاول إدراج التاريخ والوقت:

SQL = "insert into MyTbl(Tdate,Ttime) value ('" + Convert.ToDateTime(A) + "','" + Convert.ToDateTime(B) + "')";

لقد حصلت على خطأ ORA-01843 ، ماذا يمكنني أن أفعل؟

شكرا لك مقدما

هل كانت مفيدة؟

المحلول

الخطأ بسبب الشهر ، حاول:

to_date (A ، 'Dd/mm/yyyy')

نصائح أخرى

لا تستخدم SQL الخام لإدراج القيم. استخدم استعلام معلمة بدلاً من ذلك. تحليل سلاسلك في .NET DateTime (أو DateTimeOffset) و TimeSpan القيم بالطريقة العادية ، ثم استخدم شيء مثل:

string sql = "insert into MyTbl(Tdate,Ttime) values (:date, :time)";
using (OracleCommand cmd = new OracleCommand(sql, connection))
{
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.Add("date", OracleType.DateTime).Value = date;
    cmd.Parameters.Add("time", OracleType.IntervalDayToSecond).Value = time;
    cmd.ExecuteNonQuery();
}

(من الواضح ضبط أنواع الحقول الفعلية.)

تذكر أن Oracle ليس لديها مجال للوقت فقط.

أنت تحاول إدخال حقل زمني فقط في وقت البيانات. أظن أن CLR يتحول B إلى 00/00/00 22:10:39 ، وهو ليس تاريخ أوراكل صالح. علي سبيل المثال:

SQL> select to_date('00/00/00', 'MM/DD/YY') from dual;
select to_date('00/00/00', 'MM/DD/YY') from dual
               *
ERROR at line 1:
ORA-01843: not a valid month

في كلتا الحالتين ، من المحتمل أن لا يعيد Convert.TodateTime (ب) الشيء الصحيح.

هذا ايضا:

"insert into MyTbl(Tdate,Ttime) value ("

يجب أن يكون هذا:

"insert into MyTbl(Tdate,Ttime) values ("

... لكنني أعتقد أن هذا مجرد خطأ مطبعي هنا.

ومع ذلك ، جربت طريقة جون ، لم ينجح الأمر بالنسبة لي للتاريخ أيضًا. لذلك وجدت هذه الطريقة ل DateTime. ربما يساعد هذا شخص ما في المستقبل القادم أيضًا.

OracleParameter oPrm;
oPrm = cmd.CreateParameter();
oPrm.ParameterName = ":myDate";
oPrm.OracleDbType = OracleDbType.Date;
oPrm.Value = DateTime.Now;  //for date
cmd.Parameters.Add(oPrm);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top