Система.Значение ArgumentException не попадает в ожидаемый диапазон, проблема SQL



Я использую .Net Compact 3.5 Windows 7 CE.



У меня есть приложение с примерно 50 пользователями, я настроил его так, чтобы я получал электронное письмо каждый раз, когда транзакция базы данных не удалась, с запросом.



Время от времени я получал электронное письмо с трассировкой стека, которая начиналась так:




Система.ArgumentException: значение не попадает в ожидаемый диапазон.

в системе.Данные.В sqlclient.Коллекции sqlparametercollection.Validate (Int32 index, sqlparameter value)

около Система.Данные.В sqlclient.Коллекции sqlparametercollection.AddWithoutEvents (значение SqlParameter)

в системе.Данные.В sqlclient.Коллекции sqlparametercollection.Add (sqlparameter value)

в Медвмс.База данных.startSqlConnection (String query, sqlparameter[] parameters, sqlconnection connection, sqlcommand cmd)

в Медвмс.База данных. c _ _ DisplayClasse.b_ _ 8 ()

в Медвмс.База данных.повтор(действие)

в Медвмс.База данных.executeNonQuery (String query, sqlparameter [] parameters, String connectionString)...




SQL-запрос, который вызывает эту проблему, не всегда один и тот же. Я запускаю тот же запрос через несколько секунд после получения сообщения электронной почты в среде SQL Server Management Studio без каких-либо проблем.



Я хотел бы знать, почему это может происходить. Это мой первый вопрос, поэтому, пожалуйста, дайте мне знать, если я делаю что-то не так. Я был бы рад ответить на любые вопросы, чтобы предоставить более подробную информацию.

Это пример кода, который вызвал бы это Ошибка:



SqlParameter[] parameters = new SqlParameter[1];
parameters[0] = new SqlParameter("@salesOrder", this.salesOrderNumber);

string query = @"
Select InvTermsOverride from SorMaster where SalesOrder = Convert(int, @salesOrder) and InvTermsOverride = '07' --07 is for COD";

DataTable dt = Database.executeSelectQuery(query, parameters, Country.getCurrent().getSysproConnectionStrReportServer());


Это запрос, который фактически передается:



Select InvTermsOverride from SorMaster where SalesOrder = Convert(int, '000000001138325') and InvTermsOverride = '07' --07 is for COD


Вот соответствующие методы из класса Database:



public static DataTable executeSelectQuery(String query, SqlParameter[] parameters, string connectionString)
{
DataTable dt = new DataTable();

using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = null;

try
{
retry(() =>
{
cmd = startSqlConnection(query, parameters, connection, cmd);
using (SqlDataReader reader = cmd.ExecuteReader())
{
dt.Load(reader);
}
});
}
catch (Exception ex)
{
onDbConnectionCatch(cmd, ex);
}
finally
{
cmd.Dispose();
connection.Close();
}
}

return dt;
}

public static void executeNonQuery(String query, SqlParameter[] parameters, string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlCommand cmd = null;

try
{
retry(() =>
{
cmd = startSqlConnection(query, parameters, connection, cmd);
cmd.ExecuteNonQuery();
});
}
catch (Exception ex)
{
onDbConnectionCatch(cmd, ex);
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}

private static void retry(Action action)
{
int retryCount = 3;
int retryInterval = 1000;
Exception lastException = null;

for (int retry = 0; retry < retryCount; retry++)
{
try
{
if (retry > 0)
System.Threading.Thread.Sleep(retryInterval);
action();

lastException = null;
return;
}
catch (Exception ex)
{
lastException = ex;
}
}

if (lastException != null)
{
throw lastException;
}
}

private static SqlCommand startSqlConnection(String query, SqlParameter[] parameters, SqlConnection connection, SqlCommand cmd)
{
if (connection.State != ConnectionState.Open)
{
connection.Open();
}

cmd = new SqlCommand(query, connection);

if (parameters != null)
{
foreach (SqlParameter sp in parameters)
{
if (sp != null)
{
cmd.Parameters.Add(sp);
}
}
}

return cmd;
}

private static void onDbConnectionCatch(SqlCommand cmd, Exception ex)
{
try
{
new BigButtonMessageBox("", "Unable connect to database").ShowDialog();
sendEmailWithSqlQuery(cmd, ex);
}
catch
{
}
}

private static void sendEmailWithSqlQuery(SqlCommand cmd, Exception ex)
{
string query2 = "cmd was null";

if (cmd != null)
{
query2 = cmd.CommandText;

foreach (SqlParameter p in cmd.Parameters)
{
query2 = query2.Replace(p.ParameterName, "'" + p.Value.ToString() + "'");
}
}

InternetTools.sendEmail("DB ERROR", ex.ToString() + "rn" + query2);
}
779   1  

1 ответ:

У меня была та же проблема, что и Не могу решить "Sqlparameter уже содержится в другом SqlparameterCollection"

По какой-то причине SQL CE имеет другую ошибку.

Из-за моего метода повтора, я не мог повторно использовать объект SqlParameter, все еще не уверен, почему это не разрешено

В любом случае я изменился

cmd.Parameters.Add(sp);

К

cmd.Parameters.Add(sp.ParameterName, sp.Value);

Comments

    Ничего не найдено.