将数据类型 NVarchar 转换为 int 时出错

Posted

技术标签:

【中文标题】将数据类型 NVarchar 转换为 int 时出错【英文标题】:Error converting data type NVarchar into int 【发布时间】:2015-12-24 03:45:36 【问题描述】:

我同时在两个表中插入数据...

CREATE PROCEDURE inserttwo
(
     @BookID int,
     @BookName nvarchar(50),
     @DateIssue datetime,
     @ReturnDate datetime,
     @PersonID int
)
AS
    INSERT INTO tblReturn(BookID, BookName, DateIssue, ReturnDate, PersonID)
    VALUES(@BookID, @BookName, @DateIssue, @ReturnDate, @PersonID)

    INSERT INTO tblIssue(BookID, BookName, DateIssue, ReturnDate, PersonID)
    VALUES(@BookID, @BookName, @DateIssue, @ReturnDate, @PersonID)

然后我正在通过存储过程更新和删除这些表...

删除查询:

ALTER PROCEDURE [dbo].[Issuedelete]
(@BookID int)
AS
    DELETE FROM tblIssue
    WHERE BookID = @BookID  

更新查询:

ALTER PROCEDURE [dbo].[IssueUpdate]
   (@BookID int,
    @BookName nvarchar(50),
    @DateIssue datetime,
    @ReturnDate datetime,
    @PersonID int)
AS
    UPDATE tblIssue
    SET [BookID]     = @BookID , 
        [BookName]   = @BookName,
        [DateIssue]  = @DateIssue,
        [ReturnDate] = @ReturnDate,
        [PersonID]   = @PersonID
    WHERE BookID = @BookID

要从 tblIssue 中删除的 C# 代码:

private void btnDelete_Click(object sender, EventArgs e)

    try
    
        string c = ConfigurationManager.ConnectionStrings["LMS"].ConnectionString;

        SqlConnection con = new SqlConnection(c);
        con.Open();

        SqlCommand cmd = new SqlCommand("Issuedelete", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@BookID", ComBox1BookID.Text);

        cmd.ExecuteNonQuery();
        con.Close();
        storedproc();
    
    catch(Exception ex)
    
        MessageBox.Show(ex.Message);
    

更新tblIssue的C#代码:

private void btnupdate_Click(object sender, EventArgs e)

    try
    
        string c = ConfigurationManager.ConnectionStrings["LMS"].ConnectionString;

        SqlConnection con = new SqlConnection(c);
        con.Open();

        SqlCommand cmd = new SqlCommand("IssueUpdate", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@BookID", ComBox1BookID.Text);
        cmd.Parameters.AddWithValue("@BookName", ComBox2BName.Text);
        cmd.Parameters.AddWithValue("@DateIssue", IssueDate.Value.ToString());
        cmd.Parameters.AddWithValue("@ReturnDate", ReturnDate.Value.ToString());
        cmd.Parameters.AddWithValue("@PersonID", CBox3PerID.Text);

        cmd.ExecuteNonQuery();

        con.Close();
        storedproc();
    
    catch (Exception ex)
    
        Console.WriteLine("SqlError" + ex);
    

编译后报错

无法将数据类型转换为 int

我尝试了其他方法,通过使用 OleDB 和 SqlDbType 更改参数......但它不是删除和更新记录......当我更新和删除到 tblReturn 时也遇到同样的问题......请帮帮我? ?? :(

【问题讨论】:

那么您在编译时或运行应用程序时是否遇到错误? @dotnetom 当我运行 n 更新我的记录时,它给出了一个错误... 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果... @marc_s 我用 cmd.Parameters.Add("@BookID", SqlDbType.Int); 更改了 AddWithValue()我收到一个错误:“字符串输入格式不正确”。 @Warda:您是否试图将int 值设置为不是真正的int?? 【参考方案1】:

您正在向整数和日期时间参数发送文本值,请将更新按钮单击事件代码更改为

        private void btnupdate_Click(object sender, EventArgs e)
        
            try
            

                string c = ConfigurationManager.ConnectionStrings["LMS"].ConnectionString;
                SqlConnection con = new SqlConnection(c);
                con.Open();
                SqlCommand cmd = new SqlCommand("IssueUpdate", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@BookID", Convert.ToInt32(ComBox1BookID.Text));
                cmd.Parameters.AddWithValue("@BookName", ComBox2BName.Text);
                cmd.Parameters.AddWithValue("@DateIssue", IssueDate.Value);
                cmd.Parameters.AddWithValue("@ReturnDate", ReturnDate.Value);
                cmd.Parameters.AddWithValue("@PersonID",Convert.ToInt32(CBox3PerID.Text));
                cmd.ExecuteNonQuery();
                con.Close();
                storedproc();
            
            catch (Exception ex)
            
                Console.WriteLine("SqlError" + ex);

            
        

更新 在更新存储过程中 set 之后删除此行

[BookID] =@BookID ,

如果它是一个标识列,它会在更新它时抛出异常。

更新 2

试试这个cmd.Parameters.Add("@BookID", SqlDbType.Int).Value = Convert.ToInt32(ComBox1BookID.Text); 如果您使用 add 函数添加参数

【讨论】:

@Rahul,我正要写,检查更新的解决方案。 作为旁注(对于 OP 和任何其他阅读此评论的人),请停止使用 AddWithValue(),因为它在推断可能会导致性能损失和错误结果的类型时存在问题。而是使用cmd.Parameters.Add() @Rahul 不,不接受 this , cmd.Parameters.Add() @ShaminderSAujla 没有给出任何错误...但是,它没有更新和删除... @Warda,检查我更新的解决方案。从更新存储过程中删除 [BookID] = @BookID ,

以上是关于将数据类型 NVarchar 转换为 int 时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 nvarchar 值...转换为数据类型 int 时转换失败

将数据类型 NVarchar 转换为 int 时出错

SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败

System.Data.SqlClient.SqlException:“将 nvarchar 值 'STORES' 转换为数据类型 int 时转换失败。”

nvarchar 值转换为数据类型为 int 发生语法错误

将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败