将数据类型 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 时转换失败
SQL 异常:将 nvarchar 值“[anyvalue]”转换为数据类型 int 时转换失败
System.Data.SqlClient.SqlException:“将 nvarchar 值 'STORES' 转换为数据类型 int 时转换失败。”