command.ExecuteScalar не возвращает значение, которое я знаю, существует
Я пробовал разные способы сделать это, но ни один из них не работает. Процедура продолжает возвращать 0, так как результат равен нулю.
Это мой код:
string strSql = "SELECT [ID] FROM [PurchaseOrder].[dbo].[FMSSupplier] where (ExternalRef = @ExternalRef) and (CompanyID = @CompanyID)";
try
{
SqlCommand command = new SqlCommand(strSql);
command.Connection = new SqlConnection(PO_ConnectionString);
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@ExternalRef",SqlDbType.NVarChar ,50){Value = strExternalRef});
command.Parameters.Add(new SqlParameter("@CompanyID", SqlDbType.Int) { Value = intCompanyID });
if (command.Connection.State == ConnectionState.Closed) command.Connection.Open();
var result = command.ExecuteScalar();
if (result != null)
{
return (int)result;
}
else
{
return 0;
}
}
Я проверил это в SQL Server, запись существует:
SELECT [ID]
FROM [PurchaseOrder].[dbo].[FMSSupplier]
WHERE (ExternalRef = 'EDE01') and (CompanyID = 24)
Идентификатор записи НЕ равен нулю, и ConnectionString работает в других случаях.
Это значения двух моих параметров: CompanyID = 24 strExternalRef = EDE01
2 ответа
Первый и самый важный, проверка
if (command.Connection.State == ConnectionState.Closed) command.Connection.Open();
Не гарантирует, что соединение откроется. Зачем?
Государство может быть:
Broken
Connecting
//..etc
Во-вторых, я не знаю, назначаете ли вы значение intCompanyID , strExternalRef
значения (возможно, вы делаете в фрагменте, который вы не показываете нам)...
В любом случае попробуйте, если это работает в качестве первого шага отладки:
try
{
SqlCommand command = new SqlCommand(strSql);
command.Connection = new SqlConnection(PO_ConnectionString);
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@ExternalRef",SqlDbType.NVarChar ,50){Value ="EDE01"});
command.Parameters.Add(new SqlParameter("@CompanyID", SqlDbType.Int) { Value = 24});
command.Connection.Open();
var result = command.ExecuteScalar();
if (result != null)
{
return (int)result;
}
else
{
return 0;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Убедитесь, что ваш параметр использует тот же SqlDbType, что и столбец базы данных. В моем случае я устанавливал параметр команды с помощью SqlDbType.VarChar, когда соответствующий столбец базы данных использовал NVarChar.