如何插入复选框"检查"到我的MS Access数据库

时间:2017-01-28 13:31:56

标签: c# sql ms-access oledb

这是我的数据库:

my database

这是我的代码

OleDbCommand command = new OleDbCommand();
command.Connection = connection;
command.CommandText = "insert into StudentTable([StudentID], [Lastname], [Transferee]) values ('" +txtStudentID.Text+ "','" +txtLastname.Text +"',"' +chk.Transferee+ '")";
command.ExecuteNonQuery();

错误是数据类型不匹配标准表达式

如何将复选框添加到我的数据库检查中(不是复选框的值)?

谢谢

2 个答案:

答案 0 :(得分:3)

对您的代码的一些评论:

  1. 代码中的错误(更新后期)
  2. C#boolean≠Transact-SQL位。
  3. 您进行SQL注入。
  4. 您可以将IDENTITY用于StudentID
  5. 代码中的错误

    我在你的代码中也看到插入语句末尾有一个拼写错误,你使用它:

    /*...*/ "',"' +chk.Transferee+ '")";
    

    而不是:

    /*...*/ "'," + chk.Transferee.IsChecked + ")";
    

    xor this:

    /*...*/ "','" + chk.Transferee.IsChecked + "')";
    

    无论如何它是SQL注入,chk.Transferee.IsChecked是C#布尔值而不是Transact-SQL位。所以我们可以进入下一个标题。

    C#boolean≠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中,这分别是10。如果拼写错误得到解决,你愿意用这段代码做什么,分别是:

    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注入

    维基百科说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注入?看这个漫画:

    Cartoon about SQL injection

    身份

    提示:同时制作专栏StudentID identity

      

    IDENTITY在表格中创建标识列。此属性与CREATE TABLEALTER 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的主要缺点:

      
        
    1. Windows和Office版本相关。
    2.   
    3. Access没有触发器和高级功能。
    4.   
    5. Access VBA是一种解释性语言。因此它很慢。
    6.   
    7. 用于性能分析和优化数据库的访问工具不存在。
    8.   
    9. 如果即使在分割(前端/后端)数据库中有超过5-10个并发用户,访问速度也会非常慢。
    10.   
    11. 当访问文件变得太大(每mdb大于100MB)时,它们容易出现损坏。
    12.   
    13. 即使在拆分数据库上Access也始终计算客户端的所有内容。
    14.         

      来源: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);