可想而知,解決這問題的正途是人工逐一檢查比對各欄位的長度。不過今天在盛怒之下,我做了一件不理性的事,寫了一小段暴力攻擊法,逐一縮短字串長度,直到指令執行成功為止,如此就可以知道那一個欄位長度要多短才會過關。
//Log Command Error
System.Diagnostics.Debug.WriteLine("Command Error!!");System.Diagnostics.Debug.WriteLine("CommandText=" + cmd.CommandText);foreach (OracleParameter p in cmd.Parameters)
{ System.Diagnostics.Debug.WriteLine(
string.Format("Parameter[{0}](Type:{1})(Len:{2})={3}", p.ParameterName,
p.DbType.ToString(),
p.Value.ToString().Length, p.Value.ToString())
);
}
//Brute Force Attack
(Warning: Never run these unless you know what you are doing)
using (OracleConnection bfcn = new OracleConnection(_cnnString))
{ bfcn.Open();
cmd.Connection = bfcn;
foreach (OracleParameter p in cmd.Parameters)
{ if (p.OracleType == OracleType.VarChar ||
p.OracleType == OracleType.NVarChar)
{ string v = p.Value.ToString();
string origVal = v;
for (int i = v.Length - 1; i >= 0; i--)
{ p.Value = v.Substring(0, i);
try
{ cmd.ExecuteNonQuery();
System.Diagnostics.Debug.WriteLine("Hallelujah"); System.Diagnostics.Debug.WriteLine(
string.Format("Parameter[{0}]-Len[{1}]", p.ParameterName,
i));
break;
}
catch
{ }
}
p.Value = origVal;
}
}
}