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.

Другие вопросы по тегам