Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数不工作的Oracle SQL?_C#_Sql_Oracle_Dynamic Sql - Fatal编程技术网

C# 参数不工作的Oracle SQL?

C# 参数不工作的Oracle SQL?,c#,sql,oracle,dynamic-sql,C#,Sql,Oracle,Dynamic Sql,我熟悉SQL Server,但不熟悉Oracle。我正在使用我在一些示例中发现的数组技术进行批量插入或更新。但是,我一定是做得不对,因为我得到了关于“invalid table.column”的错误。我有一种感觉,这与我试图在内嵌SQL和命令参数中分配参数名的方式有关。在这个例子中,我看到他们对参数使用数值,如“:1,:2,:3”,但如果可能,我希望使用“:parameterName1,:parametername2,:parametername3” 这就是我正在做的 sbQuery.Appen

我熟悉SQL Server,但不熟悉Oracle。我正在使用我在一些示例中发现的数组技术进行批量插入或更新。但是,我一定是做得不对,因为我得到了关于“invalid table.column”的错误。我有一种感觉,这与我试图在内嵌SQL和命令参数中分配参数名的方式有关。在这个例子中,我看到他们对参数使用数值,如“:1,:2,:3”,但如果可能,我希望使用“:parameterName1,:parametername2,:parametername3”

这就是我正在做的

sbQuery.Append("update SAP_EMPLOYEE set ");
sbQuery.Append(" EMP_ID = :p_EmployeeId, EVENT_FROM_DT = :p_EventFromDate, EVENT_TYP = :p_EventType, EVENT_RSN = :p_EventRsn,");
sbQuery.Append(" where Emp = :p_Employee");
然后我创建数组将值添加到

string[] arrEmployee = new string[listEmployee.Count];
string[] arrEmployeeId = new string[listEmployee.Count];
DateTime[] arrEventFromDt = new DateTime[listEmployee.Count];
string[] arrEventTyp = new string[listEmployee.Count];
string[] arrEventRsn = new string[listEmployee.Count];
填充数组

int i = 0;
foreach (SAP_EMPLOYEE item in listEmployee)
{
    arrEmployee[i] = item.EMP;
    arrEmployeeId[i] = item.EMP_ID;
    if(item.EVENT_FROM_DT.HasValue)
    {
        arrEventFromDt[i] = item.EVENT_FROM_DT.Value;
    }
    arrEventTyp[i] = item.EVENT_TYP;
    arrEventRsn[i] = item.EVENT_RSN;

    i++;
}
然后调用连接cmd和query

OracleConnection objConnection = new OracleConnection(connString);
using (objConnection)
{
    objConnection.Open();

    //create Oracle parameters and pass arrays of data
    OracleParameter p_Employee = new OracleParameter();
    p_Employee.OracleDbType = OracleDbType.Varchar2;
    p_Employee.Value = arrEmployee;

    OracleParameter p_EmployeeId = new OracleParameter();
    p_EmployeeId.OracleDbType = OracleDbType.Varchar2;
    p_EmployeeId.Value = arrEmployeeId;

    OracleParameter p_EventFromDate = new OracleParameter();
    p_EventFromDate.OracleDbType = OracleDbType.Date;
    p_EventFromDate.Value = arrEventFromDt;

    OracleParameter p_EventType = new OracleParameter();
    p_EventType.OracleDbType = OracleDbType.Char;
    p_EventType.Value = arrEventTyp;

    OracleParameter p_EventRsn = new OracleParameter();
    p_EventType.OracleDbType = OracleDbType.Char;
    p_EventType.Value = arrEventRsn;


    OracleCommand objCmd = objConnection.CreateCommand();
    objCmd.CommandText = sbQuery.ToString();
    objCmd.ArrayBindCount = arrEmployee.Length;

    objCmd.Parameters.Add(p_Employee);
    objCmd.Parameters.Add(p_EmployeeId);
    objCmd.Parameters.Add(p_EventFromDate);
    objCmd.Parameters.Add(p_EventType);
    objCmd.Parameters.Add(p_EventRsn);

    objCmd.ExecuteNonQuery();
}

看起来在更新列的末尾有一个额外的逗号:…EVENT_RSN=:p_EventRsn,感谢您的查找,但这只是因为我删除了一堆查询。它使用的字段大约有30个,但为了简单起见,我只提取了一小部分的代码。您是否检查了您在Oracle DB中连接的架构是否在指定的表上有适当的权限进行更新,以及您指定的表是否在连接架构中?不确定我到底做了什么来修复它,但我返回并注释掉了大部分代码,只插入了两个字段。这很有效,所以我又添加了两个字段,以此类推,直到所有字段都被添加。现在,我已经开始处理最后一个字段,这是一个日期问题。甲骨文日期和我相处得不太好,但如果我不能很快弄明白的话,我将不得不发布一个单独的问题。