1

我正在尝试使用 c# 中的参数绑定从 ORACLE 读取表数据。执行 dataAdapter 时出现 ORA-12571 异常。

下面是我同时读取多个数据的代码。

public DataTable SelectFromServer(string qualifiedDBName, DataTable dataTable)        {
            try
            {
                if (this.Con.State == ConnectionState.Closed)
                {
                    this.OpenConnection();
                }
                DataTable resultTable = new DataTable();
                dataTable.TableName = qualifiedDBName;
                DbProviderFactory factory = DbProviderFactories.GetFactory(this.Con);
                using (DbCommand command = factory.CreateCommand())
                {
                   
                    command.Connection = this.Con;
                    command.CommandText = this.GenerateSqlToSelect(factory,command,dataTable);
                    DbDataAdapter adapter = factory.CreateDataAdapter();
                    adapter.SelectCommand = command;
                    adapter.Fill(resultTable);
                    return resultTable;
                }
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

下面是我用来生成选择查询的方法

  private string GenerateSqlToSelect(DbProviderFactory factory, DbCommand command, DataTable table)
        {

            //var values1 = new List<string>();
            var SelectQuery = new StringBuilder();
            var data = table.ToArray();
            var syntax = new OracleSyntax();

            command.GetType().GetProperty("ArrayBindCount").SetValue(command, table.Rows.Count, null);
         

            for (var i = 0; i < table.Columns.Count; i++)
            {
                var names = new StringBuilder();
                var values = new StringBuilder();
                var column = table.Columns[i];

                OracleParameter parameter = new OracleParameter();
                parameter.ParameterName = column.ColumnName;
                parameter.Direction = ParameterDirection.Input;
                parameter.DbType = column.DataType.GetDbType();
                parameter.Value = data[i];
                parameter.ArrayBindSize = GetDataLength(data[i]);
                if (SelectQuery.Length > 0)
                {
                    SelectQuery.Append(" and ");
                }
                names.AppendFormat("{0}", column.ColumnName);
                values.AppendFormat("{0}{1}", syntax.ParameterPrefix, column.ColumnName);
                SelectQuery.AppendFormat("{0} = {1}", names, values);
                command.Parameters.Add(parameter);
            }

            string operationString = "SELECT * FROM";
            string sqlQuery = string.Format("{0} {1} WHERE {2}", operationString,  this.FormatByQuote(syntax,table.TableName), SelectQuery);
            return sqlQuery;
        }

private int[] GetDataLength(object[] objs)
        {
            List<int> dataLengthIterator = new List<int>();
            foreach (object obj in objs)
            {
                dataLengthIterator.Add(obj.ToString().Length);
            }
            return dataLengthIterator.ToArray();
        }

this.FormatByQuote()方法只不过是获取引用的 TableName。

GenerateSqlToSelect() 方法的输出是

SELECT * FROM "CUSTOMER_MASTER" WHERE USER_ID= :USER_ID 和 LINE_NUMBER = :LINE_NUMBER

查询是根据 DataTable 输入生成的

尝试了多种解决方法,但无法获得发生异常的原因。

4

0 回答 0