将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败
Posted
技术标签:
【中文标题】将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败【英文标题】:Failed when converting the nvarchar value to to data type int and other SQL Server errors 【发布时间】:2021-08-16 09:30:22 【问题描述】:我有一个这样的 SQL Server 表:
create table LectureNotice
(
NoticeId int identity(1,1),
NoticeTitle varchar(50),
NoticeContent varchar(1000),
CreatedDate varchar(20),
LecturerId int,
CreatedBy varchar(50),
CourseId int,
NoticeViewNumber int
);
我想使用以下查询将数据插入表中
private void btnCrudInsert_Click(object sender, EventArgs e)
string query = @"insert into LectureNotice values(@NoticeId, @NoticeTitle, @NoticeContent, @CreatedDate, @LecturerId,
@CreatedBy, @CourseId)";
using (SqlConnection connection = new SqlConnection(Helper.ConnectionHelper("KLAS_DB")))
try
if (connection.State == ConnectionState.Closed)
connection.Open();
SqlCommand cmd = new SqlCommand(query, connection);
cmd.Parameters.AddWithValue("@NoticeId", noticeId);
cmd.Parameters.AddWithValue("@NoticeTitle", txtTitle.Text.Trim());
cmd.Parameters.AddWithValue("@NoticeContent", txtContent.Text.Trim());
cmd.Parameters.AddWithValue("@CreatedDate", txtCreatedDate.Text.ToString().Trim());
cmd.Parameters.AddWithValue("@LecturerId", int.Parse(txtLecturerId.Text.Trim()));
cmd.Parameters.AddWithValue("@CreatedBy", txtLecturer.Text.Trim());
cmd.Parameters.AddWithValue("@CourseId", int.Parse(txtCourseId.Text));
cmd.ExecuteNonQuery();
catch (Exception ex)
MessageBox.Show("btnCrudInsert" + ex.Message);
connection.Close();
当我执行查询时,发生了一些错误。如下:
我尝试在文本框中插入2021-05-28
,然后错误显示为failed when converting nvarchar value to type int
。即使在 SQL Server 表中,我也将createdDate
定义为varchar
。
在CreatedBy
列中,当我将值插入时,错误还显示failed when converting nvarchar value to type int
。
-
最终错误出现在
NoticeContent
中,我设置了varchar(max)
,但是当我通过text box
将值插入其中时,错误显示为binary or string value would be truncated
。
我的LectureNotice
表是从其他 2 个表继承而来的好处是
create table Course
(
CourseId int,
CourseName varchar(50),
CourseType varchar(50),
CourseCredit int,
Enrollment int,
primary key(CourseId)
);
create table Lecturer
(
Id int,
FirstName varchar(50),
LastName varchar(50),
Email varchar(50),
PhoneNumber varchar(13),
Department varchar(50),
LecturerType varchar(50),
primary key(Id)
);
还有一些过滤器,例如
alter table LectureNotice
add constraint FK_Lnotice_CourseId
foreign key(CourseId) references Course(CourseId)
on update cascade
on delete set null;
go
alter table LectureNotice
add constraint FK_Lnotice_LecturerId
foreign key(LecturerId) references Lecturer(Id)
on update cascade
on delete set null;
go
我已尝试并查找其他解决方案,但没有一个与我相同。
【问题讨论】:
【参考方案1】:始终明确列出要插入的表中的列
insert into LectureNotice ( ... )
NoticeId
是 tble 中的一个 identity
列,为什么还要在其中插入值 values(@NoticeId ...)
?
当您没有在insert statement
中指定列名时,SQL Server
将第一个值匹配到第一个非标识列。你的情况
Column `NoticeTitle` to `@NoticeId`
Column 'NoticeContent' to `@NoticeTitle`
Column 'CreatedDate' to `@NoticeContent`
. . .
现在你看到问题了吗?
最佳实践,始终在insert
中指定列名
INSERT INTO LectureNotice ( NoticeTitle, NoticeContent, CreatedDate . . .)
VALUES ( @NoticeTitle, @NoticeContent, @CreatedDate ...)
【讨论】:
你的意思是改写insert into LectureNotice values(@NoticeId, @NoticeTitle, @NoticeContent, @CreatedDate, @LecturerId, @CreatedBy, @CourseId)
。我需要明确写insert into LectureNotice(NoticeTitle, NoticeContent, ...) values (@NoticeTitle, @NoticeContent....)
??
我试过了,效果很好!感谢您帮助我并给了我最佳实践课!【参考方案2】:
这可能是一个线索,但 LectureNotice 中的 CreatedDate
是否必须是 varchar 而不是日期/日期时间?过去我在以 varchar 形式写入日期并将它们用作数据库中的参数时遇到了一些问题。有时这取决于 SQL 连接使用的用户设置。
试试下面的
create table LectureNotice(
NoticeId int identity(1,1),
NoticeTitle varchar(50),
NoticeContent varchar(1000),
CreatedDate datetime,
LecturerId int,
CreatedBy varchar(50),
CourseId int,
NoticeViewNumber int
);
cmd.Parameters.AddWithValue("@CreatedDate", Convert.ToDateTime(txtCreatedDate.Text));
或
cmd.Parameters.AddWithValue("@CreatedDate", DateTime.Now);
现在,对于NoticeContent
,这总是抛出异常吗?如果您尝试以下操作会发生什么
cmd.Parameters.AddWithValue("@NoticeContent", "Lorem ipsum dolor sit amet");
【讨论】:
我已经尝试过您的建议cmd.Parameters.AddWithValue("@NoticeContent", "Lorem ipsum dolor sit amet");
和同样的错误binary or string would be truncated in column NoticeContent
。太烂了!!以上是关于将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败的主要内容,如果未能解决你的问题,请参考以下文章
将 nvarchar 值...转换为数据类型 int 时转换失败
System.Data.SqlClient.SqlException:“将 nvarchar 值 'STORES' 转换为数据类型 int 时转换失败。”
org.hibernate.exception.SQLGrammarException:将 nvarchar 值“ViewWebApp”转换为数据类型 int 时转换失败