1

我正在使用 ProgressDB 表,该表将列定义为最大长度x的字符串,但绝不是形状或形式实际上强制执行此限制;我发现了几种情况,其中列数据明显大于定义的列长度。(发现这甚至是可能的,这是一个令人不快的震惊)。可以想象,可能有一种方法可以在数据库端强制执行这些约束,但由于多种原因,目前这并不实用。

我的应用程序在遇到这样的非法数据时以一种相当壮观的方式爆炸。我可以在行读取级别捕获异常,但我真正想做的是读取行并忽略异常,因为我正在操作字符串数据并且根本不关心长度。

IDataReader有没有办法使用界面来做到这一点?这些是大型数据集,在其中进行操作DataTable并不是一个现实的解决方案。

更新这是一件有趣(令人沮丧)的事情:我试图捕捉IDataReader.Read()这样的坏事:

var reading = true;
do
{
    try
    {
        reading = r.Read();
        if (reading)
        {
            var columns = new string[columnCount - 1];
            try
            {
                for (int i = 0; i < (columnCount - 1); i++)
                {
                    columns[i] = Convert.ToString(r.GetValue(i));
                }
                writer.Write(string.Join(this.ColumnDelimiter, columns) + this.RowDelimiter);
            }
            catch (Exception ex)
            {
                Log.Error(string.Format("Exception dumping table {0}.  At the point of the error, the columns resembled:\r\n{1}\r\n\r\nThe exception was: {2}",
                    this.TableName, string.Join(this.ColumnDelimiter, columns.Select(c => c ?? string.Empty).ToArray()), ex.ToString()), ex);
            }
        }
    }
    catch(Exception ex)
    {
        Log.Error("Error reading row.", ex);
    }

} while (reading);

...但是当我运行它时,应用程序吐了一个未捕获的异常:

2012-04-17 16:14:22,863 [1] ERROR GHM.ODBCSqlDump.Parser [(null)] - Error reading row.
System.Data.Odbc.OdbcException (0x80131937): ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Column [ColumnName] in table [TableName] has value exceeding its max length or precision.
   at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)
   at System.Data.Odbc.OdbcDataReader.Read()
   at GHM.ODBCSqlDump.Parser.Execute(Stream streamOut)

Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Data.Common.UnsafeNativeMethods.SQLFetch(OdbcStatementHandle StatementHandle)
   at System.Data.Odbc.OdbcStatementHandle.Fetch()
   at System.Data.Odbc.OdbcDataReader.Read()
   at GHM.ODBCSqlDump.Parser.Execute(Stream streamOut)
   at GHM.DatabaseDump.Executor.ExecuteGroup(TransferGroup group)
   at GHM.DatabaseDump.Executor.Execute()
   at GHM.DatabaseDump.Program.Main(String[] args)

...我的麻烦比我的解决方案增长得更快...叹息...

4

2 回答 2

1

哇,这太乱了。您能否修改您的 SQL SELECT 语句以在每个可能导致溢出的文本字段上执行字段的定义长度在SUBSTRING(1, n)哪里?n您将无法取回每个字段中的所有数据(从一开始就是坏数据),但至少它可能会阻止异常。

抱歉,我不是 ProgressDB 的人,所以我正在根据 T-SQL 构建解决方案。

于 2012-04-17T21:00:08.687 回答
0

在进行中的表的定义中有一个叫做width的字段,其中定义了sql或odbc源的长度。该字段必须足够长以适合所有数据。否则你最终会得到那个错误。

于 2013-10-03T15:27:27.497 回答