【问题标题】:Error converting data type NVarchar into int将数据类型 NVarchar 转换为 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??

标签: c# sql-server stored-procedures


【解决方案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 ,
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多