在我的个人电脑(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();
如果在日期列中插入值并尝试插入字符串值,那么Oracle将使用NLS_date_format
会话参数作为格式掩码隐式调用to_date()
。如果此格式掩码不匹配,则会出现异常。
会话参数可以由各个用户在其会话中设置-因此,如果用户Alice具有预期的参数,这并不意味着用户Bob将具有相同的参数,并且您使用的相同查询将无法工作,因为您依赖于隐式转换值。甚至更糟的是,Bob今天和明天都有预期的参数,他决定更喜欢将日期格式化为dd-mon-yyyy
,并更改了nls_date_format
,突然,在不更改代码的情况下,一切都中断了,您将非常糟糕地调试错误。
如果要插入日期,则:
日期'2016-06-01'
);或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语言是美国语言。
下面是查询