gpt4 book ai didi

c# - ORA-01843 : not a valid month - issue on second pc

转载 作者:行者123 更新时间:2023-11-30 20:35:45 25 4
gpt4 key购买 nike

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

ORA-01843: not a valid month

我读取了一个 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();

时,服务器的左边调用错误

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

填充数据表的部分(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 session 参数作为格式掩码隐式调用 TO_DATE() .如果此格式掩码不匹配,那么您将得到一个异常。

session 参数可以由各个用户在他们的 session 中设置 - 所以如果用户 Alice 具有预期的参数,这并不意味着用户 Bob 将具有相同的参数并且您正在使用的相同查询将不会像您所依赖的那样工作隐式转换值。或者更糟的是,Bob 今天有预期的参数,然后明天决定他更喜欢他的日期格式为 DD-MON-YYYY 并更改他的 NLS_DATE_FORMAT 突然,没有改变你的代码,一切都崩溃了,你将很难调试错误。

如果要插入日期,则:

  1. 将其作为绑定(bind)变量传递(最佳选择)而不将其转换为字符串;或
  2. 使用日期文字(即 DATE '2016-06-01');或
  3. TO_DATE() 与指定的格式掩码一起使用(即 TO_DATE( '"+ dr[0].ToString() + "', 'DD.MM.YYYY' )).

您可以阅读有关 bind variables in the Oracle Documentation 的信息或在 this SO question .

关于c# - ORA-01843 : not a valid month - issue on second pc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37608810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com