在我的电脑(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
类型。
我使用消息框调试了代码并得到了这个结果:
我看不出这两个语句之间有什么区别,当我执行int rowsupdated = command.ExecuteNonQuery();
我已经比较了区域设置,它们在两个系统上都是相同的(德语)。还有什么可能导致这个问题?感谢
填写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();
答案 0 :(得分:4)
如果要将值插入日期列并尝试插入字符串值,则Oracle将使用TO_DATE()
会话参数作为格式掩码隐式调用NLS_DATE_FORMAT
。如果此格式掩码不匹配,则会出现异常。
会话参数可以由其会话中的各个用户设置 - 因此,如果用户Alice具有预期参数,这并不意味着用户Bob将具有相同的参数,并且您使用的相同查询将无法正常工作,因为您依赖于隐式地施放价值。或者甚至更糟糕的是,鲍勃今天有预期的参数,然后明天决定他希望他的日期格式化为DD-MON-YYYY
并更改他的NLS_DATE_FORMAT
并且突然,在不更改代码的情况下,一切都会中断,你将会调试错误时非常糟糕。
如果您想插入日期,请:
DATE '2016-06-01'
);或TO_DATE()
(即TO_DATE( '" + dr[0].ToString() + "', 'DD.MM.YYYY' )
)。您可以阅读bind variables in the Oracle Documentation或this SO question。