当前位置: 首页 > 知识库问答 >
问题:

ORA-01843:第二台pc上的月份问题无效

萧永长
2023-03-14

在我的个人电脑(Win7)上,该语句运行无误。如果我将c#.exe复制到程序最终应该运行的服务器(Win2012 server),那么我将得到错误

ORA-01843:不是有效月份

我读取了一个CSV-文件,并用以下语句将其插入到oracle-db中

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

用于填充datatable的部分(dr的源代码):

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个答案

子车征
2023-03-14

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

会话参数可以由各个用户在其会话中设置-因此,如果用户Alice具有预期的参数,这并不意味着用户Bob将具有相同的参数,并且您使用的相同查询将无法工作,因为您依赖于隐式转换值。甚至更糟的是,Bob今天和明天都有预期的参数,他决定更喜欢将日期格式化为dd-mon-yyyy,并更改了nls_date_format,突然,在不更改代码的情况下,一切都中断了,您将非常糟糕地调试错误。

如果要插入日期,则:

  1. 将其作为绑定变量传递(最佳选项),而不将其转换为字符串;或
  2. 使用日期文本(即日期'2016-06-01');或
  3. 使用to_date()和指定的格式掩码(即to_date('“+dr[0].tostring()+”‘,'dd.mm.yyyy'))。

您可以在Oracle文档或这个SO问题中了解绑定变量

 类似资料:
  • 我在Oracle DB中有一个列,它是数据类型。存储在此列中的典型值类似于。我试图得到所有的记录,其中该专栏有记录后2015年8月1日。 但是,我得到的是。我哪里做错了?

  • 问题内容: 我使用此查询创建了一个表现 在,当我尝试使用插入一些数据时,遇到此错误。 我做错了什么? 问题答案: 不是日期,而是一个字符串。 当使用session参数的值作为格式掩码将Oracle非日期文字插入到列中时,Oracle将对其进行隐式处理( 注意:这是一个session参数,属于客户端;它不是全局设置 )。如果非日期文字与该格式匹配,则它将起作用(如果不匹配,则它将不起作用)-但是,如

  • 我为PHP更改了OCI8版本,由于该查询不起作用: 我收到这个消息: 消息:oci_execute():ora-01843:不是有效月份 它与Toad一起用于Oracle11。你有什么解决办法吗? 谢谢:)

  • NLS语言是美国语言。