SQL-сервер.NET не может быть выбран, пока я не вставлю сначала

Я пытаюсь получить все строки из таблицы, используя хранимую процедуру для sqlserver. на.Net, когда я вызываю процедуру, я получаю System.FormatException, Но если я вызываю тот же самый код ПОСЛЕ ТОГО, КАК я вставляю что-нибудь в эту таблицу, используя другую хранимую процедуру, она работает отлично.

Это хранимая процедура SELECT:

    ALTER PROCEDURE [dbo].[SP_VAS_PRO]
(
   @i_operation                        CHAR(1),
   @i_option                           CHAR(1),

   @i_Id                               INT OUTPUT,

   @i_pName                            VARCHAR(MAX),
   @i_pDesc                            VARCHAR(MAX),
   @i_active                           INT
)
AS 
BEGIN
/*==========================================*/
/*           OPERACIONES DE CONSULTA        */
/*==========================================*/
   IF @i_operation = 'S' 
   BEGIN


      IF @i_option = 'A'
      BEGIN      
         SELECT    id
                  ,pName
                  ,pDesc
                  ,active
              FROM VAS_PROYECT
      END
  END

И это код, который вызывает процедуру:

public Project()
        {
            db = DatabaseFactory.CreateDatabase("VasaroCore");

            command = db.GetStoredProcCommand("SP_VAS_PRO");

            db.AddInParameter(command, "i_operation", DbType.String, "");
            db.AddInParameter(command, "i_option", DbType.String, "");

            db.AddParameter(command, "i_Id", DbType.Int32, ParameterDirection.InputOutput, "", DataRowVersion.Current, 32);
            db.SetParameterValue(command, "i_Id", null);
            db.AddInParameter(command, "i_pName", DbType.AnsiString, "");
            db.AddInParameter(command, "i_pDesc", DbType.AnsiString, "");
            db.AddInParameter(command, "i_active", DbType.Int32, "");
        }

 public List<Objects.Project> ListProjects()
        {
            List<Objects.Project> res = new List<Objects.Project>();

            Objects.Project item = null;

            db.SetParameterValue(command, "i_operation", 'S');
            db.SetParameterValue(command, "i_option", 'A');

            IDataReader dr = null;

            try
            {
                dr = db.ExecuteReader(command);


                while (dr.Read())
                {
                    item = ConstructProject(dr);
                    res.Add(item);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                bool rethrow = ExceptionPolicy.HandleException(ex, "DataAccess Policy");

                if (rethrow)
                {
                    throw;
                }

            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
            }

            return res;
        }

Как видите, я не делаю никаких преобразований, но ошибка говорит:Error converting the value of the String parameter to Int32.".

Ошибка StackTrace:

System.FormatException: Error al convertir el valor del parámetro de String a Int32. ---> System.FormatException: La cadena de entrada no tiene el formato correcto.
   en System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   en System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   en System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   en System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   en System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   --- Fin del seguimiento de la pila de la excepción interna ---
   en System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType, Boolean& coercedToDataFeed, Boolean& typeChanged, Boolean allowStreaming)
   en System.Data.SqlClient.SqlParameter.GetCoercedValue()
   en System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
   en System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters)
   en System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc)
   en System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest)
   en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
   en System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   en System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   en System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   en System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
   en Microsoft.Practices.EnterpriseLibrary.Data.Database.DoExecuteReader(DbCommand command, CommandBehavior cmdBehavior)
   en Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteReader(DbCommand command)
   en Vasaro.Data.Access.Project.ListProjects() en C:\Users\CAMAYA\source\repos\vasaro\Vasaro.Data.Access\Project.cs:línea 93

1 ответ

Решение

Основная причина ошибки находится ниже строки -

db.AddInParameter(command, "i_active", DbType.Int32, "");

Вы передаете пустую строку Int32 параметр, который потерпит неудачу.

Также вы должны рассмотреть возможность использования DBNull.value вместо null при назначении значений параметрам.

db.SetParameterValue(command, "i_Id", DBNull.Value);
db.AddInParameter(command, "i_active", DbType.Int32, DBNull.Value);
Другие вопросы по тегам