.NET SQL 服务器无法 Select 直到我先插入

.NET SQL server Cannot Select until I insert first

我正在尝试使用 sqlserver 的存储过程从 table 中获取所有行。 在 .Net 上,当我调用该过程时,我得到 System.FormatException。但是,如果我在使用另一个存储过程向 table 插入任何内容后调用完全相同的代码,它就可以正常工作。

这是 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

错误的根本原因在 -

行下方
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);