kantagrawal Ответов: 2

Как передать целочисленное значение 0 в качестве параметра SQL.


я хочу передать int значение 0 в качестве параметра SQL. но при выполнении метода он становится нулевым. но я хочу вставить 0.

я тоже пытался:

SQLPmtr[2] = new SqlParameter("@DebitNinUnit", SqlDbType.Int, 0);


но, получая ту же ошибку.

Что я уже пробовал:

SqlParameter[] SQLPmtr = null;
SQLPmtr = new SqlParameter[6];
                SQLPmtr[0] = new SqlParameter("@UserID", UserID);
                SQLPmtr[1] = new SqlParameter("@Description", "New Account Created");
                SQLPmtr[2] = new SqlParameter("@DebitNinUnit", 0);
                SQLPmtr[3] = new SqlParameter("@CreditNinUnit",0);
                SQLPmtr[4] = new SqlParameter("@TransactionDate", CurrentDateTime);
                SQLPmtr[5] = new SqlParameter("@ClosingNinUnitBalance", 0);
                MyCommonFunction.ExecuteQuery("Insert Into TblAccountDetail(UserID,Description,DebitNinUnit,CreditNinUnit,TransactionDate,ClosingNinUnitBalance) Values(@UserID,@Description,@DebitNinUnit,@CreditNinUnit,@TransactionDate,@ClosingNinUnitBalance)",connection, SQLPmtr);




// Моя функция для выполнения запроса
public void ExecuteQuery(string CmdString, SqlConnection connection, SqlParameter[] SQLPmtr = null)
        {
            cmd = new SqlCommand(CmdString, connection, transaction);
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 120;
            if (SQLPmtr != null)
            {
                cmd.Parameters.Clear();
                for (int i = 0; i < SQLPmtr.Length; i++)
                {
                    cmd.Parameters.Add(SQLPmtr[i]);
                }
            }
            cmd.ExecuteNonQuery(); 
        }

Maciej Los

получение той же ошибки - Что за ошибка?

Herman&lt;T&gt;.Instance

Один совет, который не решит вашу проблему:
Так как вы используете SqlParameter[] SQLPmtr
Вы можете заявить::
if (SqlPmtr != null && SQLPmtr.Length > 0) cmd.Parameters.AddRange(SQLPmtr);

phil.o

0 - это вполне допустимое целочисленное значение. Вам не нужно передавать иначе, чем любое другое ненулевое допустимое целочисленное значение.
Итак, мы возвращаемся к вопросу и тому, что Мацей спросил вас: что это за ошибка, о которой вы говорите, но не описываете? Пожалуйста, улучшите свой вопрос и предоставьте сообщение об ошибке.

2 Ответов

Рейтинг:
9

Richard Deeming

Вы столкнулись с проблемой разрешения перегрузки.

new SqlParameter("@DebitNinUnit", 0)
Это вызывает SqlParameter(string, SqlDbType) перегрузка, когда вы ожидали, что он вызовет SqlParameter(string, object) перегрузка.

Константа 0 неявно конвертируется в любой Enum тип, и компилятор решает, что это неявное преобразование является лучшим соответствием, чем боксирование int в object.

Если бы вы проходили мимо int переменная вместо этого, то это будет работать так, как ожидалось:
static readonly int Zero = 0;
...
new SqlParameter("@DebitNinUnit", Zero) // Calls the (string, object) overload correctly.
Однако, если вы прошли а const, это все равно вызовет неправильную перегрузку.

Демонстрация: Enum Overload Resolution | онлайн-компилятор C# | .NET Fiddle[^]


Что касается вашего второго варианта:
new SqlParameter("@DebitNinUnit", SqlDbType.Int, 0)
В этом случае 0 это Size параметра, а не его Value.


У вас есть три варианта:
  1. Передайте переменную вместо литерала 0;
  2. Установите литерал ноль перед вызовом конструктора;
  3. Установите Value собственность, вместо того чтобы передать значение в конструктор;

// Option 1:
static readonly int Zero = 0;
...
new SqlParameter("@DebitNinUnit", Zero)

// Option 2:
new SqlParameter("@DebitNinUnit", (object)0)

// Option 3:
new SqlParameter("@DebitNinUnit", SqlDbType.Int) { Value = 0 }


phil.o

Впечатляющий. Ну и жучок!

Maciej Los

Отличный и потрясающий ответ!

Рейтинг:
2

Maciej Los

Насколько я вижу, вы передаете правильное значение в параметре:

SQLPmtr[2] = new SqlParameter("@DebitNinUnit", 0);

Там может быть целый ряд причин, которые вы получаете null на стороне базы данных, вместо правильного значения.

В соответствии с комментарием, опубликованным digimanus, вы можете улучшить свой метод, путем:
- возврат количества затронутых строк,
- добавление try catch блок для обработки ошибок.
Видеть:
public int ExecuteQuery(string CmdString, SqlConnection connection, SqlParameter[] SQLPmtr = null)
{
	int retVal = 0;
	try
	{
		cmd = new SqlCommand(CmdString, connection, transaction);
		//check connection state!
	    if(connection.State != ConnectionState.Open) connection.Open();
		cmd.CommandType = CommandType.Text;
	    cmd.CommandTimeout = 120;
		//add parameters
	    if (SQLPmtr != null && SQLPmtr.Length > 0) 
			cmd.Parameters.AddRange(SQLPmtr);
		//	        
	    retVal = cmd.ExecuteNonQuery(); 
	}
	catch(SqlException ex)
	{
		//display error message!
	}
	return retVal;
}


kantagrawal

мы получаем ошибку типа int параметр тип :

Параметризованный запрос '(@UserID int,@Description nvarchar(19),@DebitNinUnit bigint,@Cre' ожидает параметр '@DebitNinUnit', который не был указан.

kantagrawal

на самом деле мы вставляем 0 в параметр sql. но при выполнении запроса это целочисленное значение становится нулевым.

Richard Deeming

На самом деле, это неприятная проблема разрешения перегрузки. Константа 0 неявно приведено к SqlDbType перечисление, а не быть упакованным в коробку к object- значит , он вызывает не ту перегрузку. :)