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);