首页 > 解决方案 > 将 nvarchar 值转换为数据类型 int 和其他 SQL Server 错误时失败

问题描述

我有一个这样的 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();
        }
}

当我执行查询时,发生了一些错误。它们如下:

  1. 我尝试2021-05-28在文本框中插入,然后错误提示failed when converting nvarchar value to type intcreatedDate即使在我定义为的 SQL Server 表中varchar

  2. CreatedBy我插入值时的列中,错误也说failed when converting nvarchar value to type int.

  1. 最终错误在NoticeContent我设置中varchar(max),但是当我通过 a 将值插入其中时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 

我已经尝试并查找其他解决方案,但没有一个和我一样。

标签: c#sql-serverwinforms

解决方案


始终明确列出要插入的表中的列

insert into LectureNotice ( ... )

NoticeIdidentity表中的一列,为什么还要向其中插入值values(@NoticeId ...)

当您未在 中指定列名时insert statementSQL Server会将第一个值与第一个非标识列匹配。在你的情况下

Column `NoticeTitle` to `@NoticeId`
Column 'NoticeContent' to `@NoticeTitle`
Column 'CreatedDate' to `@NoticeContent`
. . .

现在你看到问题了吗?

最佳做法是始终在insert

INSERT INTO LectureNotice ( NoticeTitle, NoticeContent, CreatedDate . . .)
VALUES ( @NoticeTitle, @NoticeContent, @CreatedDate ...)

推荐阅读