这是我的数据库:
这是我的代码
OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = "insert into StudentTable([StudentID], [Lastname], [Transferee]) values ('" +txtStudentID.Text+ "','" +txtLastname.Text +"',"' +chk.Transferee+ '")";
command.ExecuteNonQuery();
错误是数据类型不匹配标准表达式
如何将复选框添加到我的数据库检查中(不是复选框的值)?
谢谢
答案 0 :(得分:3)
对您的代码的一些评论:
IDENTITY
用于StudentID
列我在你的代码中也看到插入语句末尾有一个拼写错误,你使用它:
/*...*/ "',"' +chk.Transferee+ '")";
而不是:
/*...*/ "'," + chk.Transferee.IsChecked + ")";
xor this:
/*...*/ "','" + chk.Transferee.IsChecked + "')";
无论如何它是SQL注入,chk.Transferee.IsChecked
是C#布尔值而不是Transact-SQL位。所以我们可以进入下一个标题。
如果您运行以下代码:
using System;
public class Program
{
public static void Main()
{
bool? yes = true;
Console.WriteLine("yes: {0}", yes);
bool? no = false;
Console.WriteLine("no: {0}", no);
bool? nothing = null;
Console.WriteLine("nothing: {0}", nothing);
}
}
它会打印出来:
yes: True
no: False
nothing:
您可以在此.NET fiddle上进行测试。
Transact-SQL使用了一点" true"或"假"。在Transact-SQL中,这分别是1
和0
。如果拼写错误得到解决,你愿意用这段代码做什么,分别是:
insert into StudentTable([StudentID], [Lastname], [Transferee])
values (7, 'Turner', True)
xor this:
insert into StudentTable([StudentID], [Lastname], [Transferee])
values (7, 'Turner', 'True')
这不是Transact-SQL的有效代码。因为布尔值true
和值为True
的字符串不是位1
。
旁白:可以为空的布尔值(仅当您使用WPF或必须插入null
时)
如果您使用WPF是IsChecked
property is nullabele,或者只是插入null
。您的代码将是一个例外。这将是您的SQL查询:
insert into StudentTable([StudentID], [Lastname], [Transferee])
values (7, 'Turner', )
xor this:
insert into StudentTable([StudentID], [Lastname], [Transferee])
values (7, 'Turner', '')
这当然无效。
正确陈述
正确的陈述必须是:
insert into StudentTable([StudentID], [Lastname], [Transferee])
values (7, 'Turner', 1)
在此SQLfiddle中测试此代码。
维基百科说SQL injection:
SQL注入是一种代码注入技术,用于攻击数据驱动的应用程序,其中将恶意SQL语句插入到输入字段中以便执行(例如,将数据库内容转储给攻击者)。
您可以使用此代码来代替您的代码:
command.CommandText = @"insert into StudentTable([StudentID], [Lastname], [Transferee])
values (@StudentID, @LastName,@Transferee)";
command.Parameters.AddWithValue("@StudentID", txtStudentID.Text);
command.Parameters.AddWithValue("@LastName", txtLastname.Text);
command.Parameters.AddWithValue("@Transferee", chk.Transferee.IsChecked);
// @ClintJoe: Will you check code of line above I think it's not correct.
// must it not to be this: `chk.IsChecked`? Not sure.
如果您使用上面的代码并解决我已添加的备注,那么第一个(代码中的拼写错误)的所有问题,第二个标题(C#boolean≠Transact- SQL位)和旁边将解决。
这也会阻止SQL注入。但是,为什么没有SQL注入?看这个漫画:
提示:同时制作专栏StudentID
identity。
IDENTITY
在表格中创建标识列。此属性与CREATE TABLE
和ALTER TABLE
Transact-SQL语句一起使用。
执行此操作后,您可以使用以下代码:
command.CommandText = @"insert into StudentTable([Lastname], [Transferee])
values (@LastName, @Transferee)";
command.Parameters.AddWithValue("@LastName", txtLastname.Text);
command.Parameters.AddWithValue("@Transferee", chk.Transferee.IsChecked);
并且不再需要在应用程序中请求或创建唯一ID
MS-access不是一个好用的数据库。通过快速搜索Google,我发现了Access的主要缺点:
- Windows和Office版本相关。
- Access没有触发器和高级功能。
- Access VBA是一种解释性语言。因此它很慢。
- 用于性能分析和优化数据库的访问工具不存在。
- 如果即使在分割(前端/后端)数据库中有超过5-10个并发用户,访问速度也会非常慢。
- 当访问文件变得太大(每mdb大于100MB)时,它们容易出现损坏。
- 即使在拆分数据库上Access也始终计算客户端的所有内容。
醇>来源:What are the major disadvantages of Microsoft Access? - Quora
答案 1 :(得分:1)
我建议先将查询更改为参数化查询,以避免sql注入:
command.CommandText = "insert into StudentTable([StudentID], [Lastname], [Transferee]) "
+ " values (@StudentID, @LastName,@Transferee)";
然后使用它们的值添加参数:
command.Parameters.AddWithValue("@StudentID", txtStudentID.Text);
command.Parameters.AddWithValue("@LastName", txtLastname.Text);
command.Parameters.AddWithValue("@Transferee", chkTransferee.Checked);