将 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 时转换失败。”

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

org.hibernate.exception.SQLGrammarException:将 nvarchar 值“ViewWebApp”转换为数据类型 int 时转换失败

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

如何将 Nvarchar 列转换为 INT