我正在使用 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)
...我的麻烦比我的解决方案增长得更快...叹息...