【发布时间】:2021-06-12 13:50:40
【问题描述】:
我刚启动 sql,遇到一个问题,我已经处理了好几天了。
我有两个数据表。第一个是书,第二个是作者。 book 表的字段:
书
图书 ID (PK)
作者 ID
书名
...
作者
作者 ID (PK)
作者姓名
我在这里要做的是在图书注册时为作者创建数据库。
1-书名,作者姓名将写入Windows表单应用程序的文本框中,并单击保存按钮。作者名字会先保存在'author'表中,并创建作为自动pk key的id。
2-文本框上写的“作者姓名”和作者表中对应的id会被取走。
3- 最后,书名和作者id将记录在“书”表中。
举个例子:
到 Windows 表单应用程序中的文本框:
书名:IT
作者姓名:斯蒂芬·金
点击保存按钮。
作者表
AuthorID:97(自动分配)
作者姓名:斯蒂芬·金
书桌
图书编号:11
作者 ID:97
书名:IT
简而言之,只需单击一下,即可同时拥有作者和书籍记录和数据库。
我尝试了很多方法,但我无法存储我获取的作者 ID。
string sqlcom1 = "INSERT INTO author (authorName) VALUES(@Pauthor)";
commandObject = new SqlCommand(sqlcom1, connectionObject );
commandObject.Parameters.AddWithValue("@Pauthor", textBoxauthorName.Text);
string sqlcom2 = "SELECT authorID FROM author WHERE authorName='" + textBoxauthorName.Text + "'");
commandObject = new SqlCommand(sqlcom2 , connectionObject );
string sqlcom3 = "INSERT INTO book (bookName,authorID) VALUES(@PbookName,@PauthorID)";
commandObject = new SqlCommand(sqlcom3, connectionObject);
commandObject.Parameters.AddWithValue("@PbookName", textBoxbookName.Text);
commandObject.Parameters.AddWithValue("@PauthorID", sqlcom2);
connectionObject.Open();
commandObject.ExecuteNonQuery();
connectionObject.Close();
错误: '将 nvarchar 值 'SELECT authorID FROM author WHERE authorName='author30'' 转换为数据类型 int 时转换失败。'
author30 --> 我在作者姓名的文本框中输入的值。
注意:我可以看到,通过注册到 author 表,名称会自动分配 id。正在向作者表注册。
作者 ID 与图书表中的作者 ID 相关联。
【问题讨论】:
-
警告:您的代码存在巨大安全漏洞。它很容易受到注入攻击。您需要参数化您的陈述;永远不要将未经处理的值注入您的数据库。
-
注意,我特意说的是
sqlcmd2注入值的地方,尽管之后将 is 定义为参数(这是没有意义的,因为查询不包含参数)。 -
我在sqlcmd2部分犯了一个错误。我正在修复我将在将来学习时改进其他安全漏洞。我现在想做的一个简单的应用程序
-
在您的第一个 sql 命令中使用 SCOPE_IDENTITY()。所以你不需要sqlcom2。见这里:stackoverflow.com/a/18373514/448100 btw,你被覆盖了你的命令对象,为每个命令创建一个新对象。
-
我不能完全做到。是否可以为我编辑和解释代码? @ibram
标签: c# sql database visual-studio sql-server-2019