Вставка ’20-001′ в базу данных SQL Server приводит к ошибке

#.net #sql-server

#.net #sql-сервер #sql-server

Вопрос:

Я обнаружил ошибку при разработке в .NET. Я сталкиваюсь с проблемой при использовании хранимой процедуры. Я устанавливаю переменную @A следующим образом:

 @A NVARCHAR(50) = ""
  

После подключения к базе данных .NET и отправки на ’20-001′

 cmd.Parameters.AddWithValue("@a", test.a);
  

Но я получаю сообщение об ошибке

System.Data.SqlClient.SQLException (0x80131904): ошибка преобразования при преобразовании значения nvarchar ’22 001′ в тип данных int.

Мой код

 [HttpPost]
public JsonResult test([FromBody]test test)
{
    int result = 0;

    if (ModelState.IsValid)
    {
         SqlConnection conn = new SqlConnection(source());
         conn.Open();

         SqlCommand cmd = new SqlCommand("[test].[test]", conn);
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.AddWithValue("@FLAG", test.test);
         cmd.Parameters.AddWithValue("@REQTYPE", "test_INSERT");
         cmd.Parameters.AddWithValue("@test", test.a);

         using(SqlDataReader reader = cmd.ExecuteReader())
         {
             while(reader.Read())
             { 
                 result = (int)reader[0];
             }

             reader.Close();
         }
    }

    if (result != 0)
    {
        return Json(new { success = false });
    }

    return Json(new { success = true });
}
  

Хранимая процедура:

 @a NVARCHAR(50) = ''
INSERT INTO test(a) VALUES (@a)
  

Комментарии:

1. Не используйте addwithvalue .

2. И покажите полный код приложения, который вы используете для выполнения вашей инструкции sql.

3. Используйте Add метод. Явный инициализатор может обрабатывать более сложные случаи, например sqlCommand.Parameters.Add( new SqlParameter() { ParameterName = "@Filename", SqlDbType = SqlDbType.VarChar, Size = 256, Direction = System.Data.ParameterDirection.InputOutput, Value = "Foo.bar" } ); .

4. В статье, на которую дана ссылка, объясняется, как их правильно добавить.

5. Кроме того, поскольку вы выполняете хранимую процедуру, которая выполняет INSERT и, следовательно, не возвращает набор результатов обратно, вам действительно следует использовать SqlCommand.ExecuteNonQuery() вместо ExecuteReader ….

Ответ №1:

Ошибка

Ошибка преобразования при преобразовании значения nvarchar ’22 001′ в тип данных int

из-за

  1. несоответствие типа между параметром хранимой процедуры и значением, переданным в, или
  2. несоответствие типа между значением, переданным в инструкцию insert, и типом данных таблицы

Комментарии:

  1. cmd.Parameters.AddWithValue принимает все типы данных, тогда ваш код здесь в порядке

  2. В вашей хранимой процедуре вы должны определить входной параметр @test as nvarchar(50)

  3. В целевой таблице test столбец a должен иметь nvarchar(50) тип данных

Вот так

 CREATE TABLE test_table 
(
     a nvarchar(50)
)
GO

ALTER PROCEDURE [test].[test] 
    (@FLAG nvarchar(200),
     @REQTYPE nvarchar(200),
     @test nvarchar(50))
AS
    INSERT INTO test_table (a) 
    VALUES (@test)
GO