У меня есть запрос, который должен всегда возвращать один int. Теперь я зарегистрировал его, возвращая строку, совершенно не связанную с тем, чем она должна быть.
Мы получили несколько случайных исключений FormatException, которые мы отследили до нескольких запросов к базе данных. После некоторой дополнительной регистрации я обнаружил, что этим утром запрос ниже вернул строку "гладиатор". Website.PkID - это столбец типа int, который работает большую часть времени, но в некоторых случаях он с треском проваливается и возвращает либо int, который уже есть (больше, чем любой действующий WebsiteID), либо случайную строку.
Этот конкретный запрос выполняется один раз за начало сеанса. Он не использует совместно используемое соединение, поэтому у меня возникают проблемы с пониманием того, как он может получить такой смешанный результат. Может ли быть какая-то коррупция в пулах соединений?
Не думаю, что проблема связана с этим запросом. Я видел похожие FormatException (из-за неожиданного результата), поступающие также из запросов LINQ. Мы также обнаружили некоторые из этих ошибок примерно в одно и то же время:
Произошла ошибка транспортного уровня при отправке запроса на сервер. (провайдер: провайдер TCP, ошибка: 0 - существующее соединение было принудительно закрыто удаленным хостом.
Может ли быть проблема с подключением? Или, может быть, мы получаем смешанные наборы результатов между сервером БД и веб-сервером? Это действительно заставило меня почесать голову.
Оскорбляющий запрос:
public static int GetActiveWebSiteID(string storeID, string statusID)
{
int retval;
string sql = @"SELECT isnull(MAX(PkID),0) FROM WebSite
WHERE StoreID = @StoreID
AND WebSiteStatusID = @WebSiteStatusID";
SqlConnection conn = new SqlConnection(Settings.ConnString);
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@StoreID", (object)storeID ?? DBNull.Value);
cmd.Parameters.AddWithValue("@WebSiteStatusID", (object)statusID ?? DBNull.Value);
conn.Open();
using(conn)
{
var scalar = cmd.ExecuteScalar(); // <-- This value returned here should only ever be an int, but randomly is a string
retval = Convert.ToInt32(scalar);
}
return retval;
}
Вышеупомянутый запрос работал хорошо в течение многих лет до недавнего времени. Теперь у нас есть куча дополнительных запросов LINQ в приложении (не уверен, что это изменит). У нас работает .Net 3.5.