c# - 将 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();
}
}
当我执行查询时,发生了一些错误。它们如下:
我尝试
2021-05-28
在文本框中插入,然后错误提示failed when converting nvarchar value to type int
。createdDate
即使在我定义为的 SQL Server 表中varchar
。在
CreatedBy
我插入值时的列中,错误也说failed when converting nvarchar value to type int
.
- 最终错误在
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
我已经尝试并查找其他解决方案,但没有一个和我一样。
解决方案
始终明确列出要插入的表中的列
insert into LectureNotice ( ... )
NoticeId
是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 ...)
推荐阅读
- c# - 全名解析和数据库比较
- database-design - Cassandra:升级和搜索分区键不同
- android - Dagger Hilt 没有在测试中注入
- amqp - 使用 amq 7.1 的 Geoserver 2.16 集群。可以向 amq 发送消息并看到我已连接,但未收到消息
- c++ - 带有 C 库的 QtCreator 中的链接器问题
- python - 如何使用python在pdf中设置页脚(django with pisa)
- php - 在 mime_content_type() 中在 Wordpress 中上传图片时出错
- python-3.x - 使用 Python 创建唯一键的更有效方法
- c# - ASP.NET MVC CheckBoxFor“无法从 bool 转换为 system.linq。
" - android - 无法使布局宽度与我在 XML 上的文本相同