完璧に網羅はしていませんが・・・。
this
lbFieldCount.Text = dt.Rows.OfType<DataRow>().Sum( c =>
{
int iDec = 0;
int.TryParse( c["Size"].ToString(), out iDec );
switch( c["Type"].ToString() ) {
case "bigint": return 8;
case "int": return 4;
case "smallmoney": return 2;
case "tinyint": return 1;
case "numeric":
case "decimal":
if( iDec >= 1 && iDec <= 9 ) return 5;
if( iDec >= 10 && iDec <= 19 ) return 9;
if( iDec >= 20 && iDec <= 28 ) return 13;
if( iDec >= 29 && iDec <= 38 ) return 17;
break;
case "bit": return 1;
case "smallint": return 4;
case "money": return 8;
case "float":
if( iDec >= 1 && iDec <= 24 ) return 4;
if( iDec >= 25 && iDec <= 53 ) return 8;
break;
case "real": return 4;
case "date": return 3;
case "datetimeoffset":
if( iDec >= 0 && iDec <= 2 ) return 8;
if( iDec >= 3 && iDec <= 4 ) return 9;
if( iDec >= 5 && iDec <= 7 ) return 10;
return 10;
case "datetime2":
if( iDec >= 0 && iDec <= 2 ) return 6;
if( iDec >= 3 && iDec <= 4 ) return 7;
return 8;
case "smalldatetime": return 4;
case "datetime": return 8;
case "time":
if( iDec >= 0 && iDec <= 2 ) return 3;
if( iDec >= 3 && iDec <= 4 ) return 4;
if( iDec >= 5 && iDec <= 7 ) return 5;
return 5;
case "char": return iDec;
case "varchar": return iDec + 2;
case "text": return 0;// 2147483646;
case "nchar": return iDec * 2;
case "nvarchar": return iDec * 2 + 2;
case "ntext": return 0;// 2147483646;
case "binary": return iDec;
case "varbinary": return iDec + 2;
case "image": return 0;// 2147483646;
}
return 0;
}).ToString();
ちなみに return 0;// 2147483646;
は return 2147483646;
としたら落ちたのでやめました。
こんな書き方でいいんでしょうか?