ORA-01843:在第二台电脑上没有有效的月份问题

时间:2016-06-03 07:47:48

标签: c# oracle date datetime

在我的电脑(Win7)上,语句正在运行且没有错误。如果我将c#.exe复制到最终运行程序的服务器(Win2012服务器),那么我会收到错误

  

ORA-01843:不是有效月份

我读了一个csv文件并将其插入带有语句

的oracle-db中
command.CommandText = "INSERT INTO table (DATUM, ...) VALUES('" + dr[0].ToString() + "',..."')";

dr[0].ToString()的值为"01.06.2016"

DATUM在oracle-db中是DATE类型。

我使用消息框调试了代码并得到了这个结果:

enter image description here

我看不出这两个语句之间有什么区别,当我执行int rowsupdated = command.ExecuteNonQuery();

时,服务器左侧的语句正在调用错误

我已经比较了区域设置,它们在两个系统上都是相同的(德语)。还有什么可能导致这个问题?感谢

填写Datatabledr的来源)的部分:

StreamReader oStreamReader = new StreamReader(Zielverzeichnis + Dateiname, System.Text.Encoding.UTF8); //nach, für Umlaute

                    DataTable dtCSV_Import = null;
                    int RowCount = 0;
                    string[] ColumnNames = null;
                    string[] oStreamDataValues = null;
                    //using while loop read the stream data till end
                    while (!oStreamReader.EndOfStream)
                    {
                        String oStreamRowData = oStreamReader.ReadLine().Trim();
                        if (oStreamRowData.Length > 0)
                        {
                            oStreamDataValues = oStreamRowData.Split(';');
                            //Bcoz the first row contains column names, we will poluate 
                            //the column name by
                            //reading the first row and RowCount-0 will be true only once
                            if (RowCount == 0)
                            {
                                RowCount = 1;
                                ColumnNames = oStreamRowData.Split(';');
                                dtCSV_Import = new DataTable();

                                //using foreach looping through all the column names
                                foreach (string csvcolumn in ColumnNames)
                                {
                                    DataColumn oDataColumn = new DataColumn(csvcolumn.ToUpper(), typeof(string));

                                    //setting the default value of empty.string to newly created column
                                    oDataColumn.DefaultValue = string.Empty;

                                    //adding the newly created column to the table
                                    dtCSV_Import.Columns.Add(oDataColumn);
                                }
                            }
                            else
                            {
                                //creates a new DataRow with the same schema as of the oDataTable            
                                DataRow oDataRow = dtCSV_Import.NewRow();

                                //using foreach looping through all the column names
                                //Prüfen was kleiner ist, Spalten aus XML oder tatsächliche Spalten in der CSV -> sonst Fehler [i]
                                if (oStreamDataValues.Length < ColumnNames.Length)
                                {
                                    for (int i = 0; i < oStreamDataValues.Length; i++)
                                    {
                                        oDataRow[ColumnNames[i]] = oStreamDataValues[i] == null ? string.Empty : oStreamDataValues[i].ToString();
                                    }
                                }
                                else
                                {
                                    for (int i = 0; i < ColumnNames.Length; i++)
                                    {
                                        oDataRow[ColumnNames[i]] = oStreamDataValues[i] == null ? string.Empty : oStreamDataValues[i].ToString();
                                    }
                                }

                                //adding the newly created row with data to the oDataTable       
                                dtCSV_Import.Rows.Add(oDataRow);
                            }
                        }
                    }
                    //close the oStreamReader object
                    oStreamReader.Close();
                    //release all the resources used by the oStreamReader object
                    oStreamReader.Dispose();

1 个答案:

答案 0 :(得分:4)

如果要将值插入日期列并尝试插入字符串值,则Oracle将使用TO_DATE()会话参数作为格式掩码隐式调用NLS_DATE_FORMAT。如果此格式掩码不匹配,则会出现异常。

会话参数可以由其会话中的各个用户设置 - 因此,如果用户Alice具有预期参数,这并不意味着用户Bob将具有相同的参数,并且您使用的相同查询将无法正常工作,因为您依赖于隐式地施放价值。或者甚至更糟糕的是,鲍勃今天有预期的参数,然后明天决定他希望他的日期格式化为DD-MON-YYYY并更改他的NLS_DATE_FORMAT并且突然,在不更改代码的情况下,一切都会中断,你将会调试错误时非常糟糕。

如果您想插入日期,请​​:

  1. 将其作为绑定变量(最佳选项)传递,而不将其转换为字符串;或
  2. 使用日期文字(即DATE '2016-06-01');或
  3. 使用指定格式掩码的TO_DATE()(即TO_DATE( '" + dr[0].ToString() + "', 'DD.MM.YYYY' ))。
  4. 您可以阅读bind variables in the Oracle Documentationthis SO question