【问题标题】:Insert '20-001' into SQL Server database results in an error将“20-001”插入 SQL Server 数据库会导致错误
【发布时间】:2020-08-25 02:50:21
【问题描述】:

我在 .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)

【问题讨论】:

  • 不要使用addwithvalue
  • 并显示用于执行 sql 语句的完整应用程序代码。
  • 使用Add 方法。显式初始化器可以处理更具挑战性的情况,例如sqlCommand.Parameters.Add( new SqlParameter() { ParameterName = "@Filename", SqlDbType = SqlDbType.VarChar, Size = 256, Direction = System.Data.ParameterDirection.InputOutput, Value = "Foo.bar" } );.
  • 链接到的文章解释了如何正确添加它们。
  • 另外,由于您正在执行一个执行INSERT 的存储过程,因此不会返回结果集,您应该真正使用SqlCommand.ExecuteNonQuery() 而不是ExecuteReader ...。

标签: .net sql-server


【解决方案1】:

错误

将 nvarchar 值 '22 001' 转换为数据类型 int 时转换失败

是因为

  1. 存储过程参数和传入的值类型不匹配,或者
  2. 传入插入语句的值与表数据类型之间的类型不匹配

评论:

  1. cmd.Parameters.AddWithValue接受所有数据类型,那么你的代码在这里就OK了

  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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多