Этот унаследованный код вызывается из огромного количества мест в приложении:
public void DBCommand(string dynSQL, bool Silent)
{
checkConnection();
SqlCeCommand cmd = objCon.CreateCommand();
SqlCeTransaction trans = this.GetConnection().BeginTransaction();
cmd.Transaction = trans;
try
{
cmd.CommandText = dynSQL;
cmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex)
{
MessageBox.Show(
string.Format("DBCommand Except in DBConnection.DBCommand: {0}. InnerException: {1}", ex.Message, ex.InnerException));//TODO: Remove
try
{
trans.Rollback();
}
catch (SqlCeException)
{
// Handle possible exception here
}
// MessageBox.Show(
// string.Format("DBCommand Except in DBConnection.DBCommand: {0}. InnerException: {1}", ex.Message, ex.InnerException));//TODO: Remove
WriteDBCommandException(dynSQL, ex, Silent);
}
}
Когда определенный файл загружается и его содержимое вставляется в базу данных, я получаю это сообщение пять раз. Тем не менее, Message и InnerException исключения всегда являются пустыми строками.
Я даже (возможно, несколько суеверно или нелогично) переместил MessageBox.Show() из одного места в другое, чтобы посмотреть, будет ли это иметь какое-либо значение (это не имеет значения).
Исключение отображается, но не дает никакой полезной информации о проблеме; Я просмотрел (вручную или, точнее, я полагаю, буквально отсканировал оптически) данные, о которых идет речь, и все вроде бы в порядке.
Так почему же это сообщение об исключении плачет и плачет, но не говорит о том, в чем проблема, как колики, но немой ребенок (рот широко открыт, слезы текут, но не издают ни звука)?
ОБНОВИТЬ
Хорошо, я адаптировал фрагмент кода ErikEJ (не смог использовать HelpLink или StringIsNullOrEmpty, поскольку я использую инструменты давным-давно, во времена Элли Ооп, Берты Батт и Арти Шоу):
// from method that throws the exception
catch (SqlCeException sqlfail)
{
MessageBox.Show(GetSQLCEErrorInfo(sqlfail));
}
catch (Exception ex)
. . .
public static string GetSQLCEErrorInfo(SqlCeException args)
{
SqlCeErrorCollection errorCollection = args.Errors;
StringBuilder bld = new StringBuilder();
Exception inner = args.InnerException;
if (null != inner)
{
bld.Append("\nInner Exception: " + inner.ToString());
}
// Enumerate the errors to a message box.
foreach (SqlCeError err in errorCollection)
{
bld.Append("\n Error Code: " + err.HResult.ToString("X",
System.Globalization.CultureInfo.InvariantCulture));
bld.Append("\n Message : " + err.Message);
bld.Append("\n Minor Err.: " + err.NativeError);
bld.Append("\n Source : " + err.Source);
// Enumerate each numeric parameter for the error.
foreach (int numPar in err.NumericErrorParameters)
{
if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);
}
// Enumerate each string parameter for the error.
foreach (string errPar in err.ErrorParameters)
{
if ((null != errPar) && (errPar.Trim() != string.Empty)) //IsNullOrEmpty(errPar))
{
bld.Append("\n Err. Par. : " + errPar);
}
}
}
return bld.ToString();
}
... и я вижу следующее:
Error Code: 80040E14
Message : There was an error parsing the query. [Token line number, Token line offset,, Token in error,,]
Minor Err.: 25501
Source : Microsoft SQL Server 2000 Windows CE Edition
Num. Par. : 1
Num. Par. : 47
Err. Par. " [
...потом:
Exception: SLQ Server CE does not support parallel transactions.
Location. DBConnection.GetInstance(siteNo)
(Я получаю оба из них дважды); но почему только дважды? Он вставляет несколько сотен записей... можно было бы подумать, что если он потерпит неудачу один раз, он будет ошибаться каждый раз.