【问题标题】:Simple, ordinary SQL Server insert method简单、普通的 SQL Server 插入方法
【发布时间】:2015-08-04 00:35:48
【问题描述】:

这必须是一个简单的普通 SQL insert 方法,但是当我运行它并单击“button1”时出现错误

system.data.dll 中发生了“system.data.sqlclient.sqlexception”类型的未处理异常

有谁知道问题出在哪里?

namespace InsertDeleteUpdate_Login
{
    public partial class Form1 : Form
    {
        SqlConnection cn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=E:\C #\InsertDeleteUpdate-Login\InsertDeleteUpdate-Login\Database1.mdf;Integrated Security=True");

        SqlCommand cmd = new SqlCommand();
        SqlDataReader dr;

        public Form1()
        {
            InitializeComponent();
            cmd.Connection = cn;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "" && textBox2.Text != "")
            {
                cn.Open();
                cmd.CommandText = "INSERT INTO info (ID,Name,Password)" + " VALUES ('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "')'";

                cmd.ExecuteNonQuery();

                cmd.Clone();

                MessageBox.Show("Inserare reusita");

                cn.Close();
            }
        }
    }
}

【问题讨论】:

  • 捕获异常以查看错误消息是什么。系统试图告诉你哪里出了问题,不要忽略异常。此外,必须...您的代码极易受到SQL 注入攻击 的攻击。使用参数化查询而不是将用户输入作为代码执行。您正在以纯文本形式存储用户密码。这对您的用户非常不负责任。用户密码应该使用散列算法进行单向隐藏,并且应该永远可检索。
  • 您有一个 SQL 注入漏洞,文本框值中的' 会导致错误或更严重的损坏。 Use a parametrized insert instead
  • 使用参数化查询!!!而不是那些讨厌的字符串。
  • @CraigW。记住你曾经是初学者。我个人从未在学校学习过调试,当然那是 30 年前的事了。我希望现在它会变得更好,并且学校会关注它,因为它与编程本身一样重要。
  • @user2366842 ,是的,它是一个原型,我是 C# 的初学者,我在学校只有一门关于数据库的课程,这更像是 sql 数据库的演示,而不是学习实用知识的课程.此外,在我就读的高中,计算机科学课程完全专注于算法(没有什么关于OOP的)。幸运的是,高中的计算机科学老师提供了一个课程(大约8节课),面向所有学生高中毕业,目的是向我们介绍 oop(c#)。在此之前,我什至不知道 oop。

标签: c# sql sql-server


【解决方案1】:

问题的根本原因是您没有使用参数化查询,而是试图动态创建一个 sql 字符串。结果,您在该字符串的汇编代码中出错。但是,如果您使用参数化查询,则遇到此类问题的机会要低得多,因为您不必纠结引号​​之类的东西。最重要的是,如果你使用参数,你不会有sql注入攻击,它也使代码更具可读性。

阅读http://www.dotnetperls.com/sqlparameter,了解如何以应有的方式使用参数化查询,而不仅仅是修复查询字符串中的文本错误。这不是应该的方式。

这也是一个很好的解释:http://www.dreamincode.net/forums/topic/268104-parameterizing-your-sql-queries-the-right-way-to-query-a-database/

【讨论】:

    【解决方案2】:

    我还不能添加 cmets,但看起来你可能在最后一个不应该出现的右括号后面多了一个单引号。

    【讨论】:

    • 是的,这绝对也是一个问题;-) 但是如果操作员使用参数化查询,那么这个问题一开始就不会存在,但我还是赞成。
    • 虽然这是正确的,但我不会赞成,因为让代码保持当前状态充其量是危险的。
    • @user2366842 这可能很聪明,我们不应该以任何方式鼓励这种编码,甚至不应该纠正字符串处理中的问题。我被冲昏了头脑,因为马里奥在字符串中发现了错误 ;-)
    【解决方案3】:

    正如上面几个人所提到的,你应该总是参数化你的查询,而且你还有一个尾随单引号,这很可能是 SQL Server 窒息的原因。

    试试这样的:

    cmd.CommandText = "INSERT INTO info (ID, Name, Password) VALUES (@ID, @Name, @Password)";
    cmd.Parameters.AddWithValue("@ID", textBox1.Text);
    cmd.Parameters.AddWithValue("@Name", textBox2.Text);
    cmd.Parameters.AddWithValue("@Password", textBox3.Text);
    cmd.ExecuteNonQuery();
    

    【讨论】:

    • 更好....尽管 OP 仍会以纯文本形式存储密码,这本身就是一个问题。
    • 是的,它是一个原型,我是 C# 的初学者,我在学校只有一堂关于数据库的课,这更像是 sql 数据库的介绍,而不是学习实用知识的课程。此外,在我就读的高中,计算机科学课程完全专注于算法(没有任何关于 OOP 的内容)。幸运的是,高中的计算机科学老师提供了一个课程(大约 8 节课),来自各地的学生学校,目的是向我们介绍 oop(c#)。在那之前,我什至不知道 oop。
    猜你喜欢
    • 2010-10-01
    • 2010-11-22
    • 2016-04-12
    • 1970-01-01
    • 2010-09-23
    • 2015-11-13
    • 2015-07-09
    • 2020-02-02
    • 2015-09-21
    相关资源
    最近更新 更多