【问题标题】:Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll when trying to make simple insertion into SQL Server database抛出异常:尝试简单插入 SQL Server 数据库时 System.Data.dll 中的“System.Data.SqlClient.SqlException”
【发布时间】:2021-08-30 22:45:04
【问题描述】:

我是 C# 新手,尝试从我的 C# 项目创建新用户并插入数据库时​​遇到错误。运行项目时一直遇到如下错误:

抛出异常:System.Data.dll 中的 System.Data.SqlClient.SqlException'

但似乎无法找到代码的哪一部分出错了。我曾尝试在谷歌上搜索类似的解决方案,但没有帮助。

以下是我在 SQL Server Management Studio 中的数据库和表:

以下是我的 web.config 文件中连接 SQL Server 数据库的连接字符串:

<connectionStrings>
    <add name="con" connectionString="Data Source=XXX-091220MI02\SQLEXPRESS;Initial Catalog=serviceportal;Integrated Security=true"/>
</connectionStrings>

以下是我在 Visual Studio 中尝试插入数据库时​​的代码:

protected void Button1_Click(object sender, EventArgs e)
{
     try
     {
           SqlConnection conn = new SqlConnection(strcon);

           if(conn.State == ConnectionState.Closed)
           {
               conn.Open();
           }

           SqlCommand cmd = new SqlCommand("INSERT INTO user (username, password) VALUES (@user, @pass)", conn);
           System.Diagnostics.Debug.WriteLine("Textbox 1 Text: " + TextBox1.Text.Trim());
           System.Diagnostics.Debug.WriteLine("Textbox 2 Text: " + TextBox2.Text.Trim());
           cmd.Parameters.AddWithValue("@user", TextBox1.Text.Trim());
           cmd.Parameters.AddWithValue("@pass", TextBox2.Text.Trim());

           cmd.ExecuteNonQuery();
           conn.Close();

           Response.Write("<script>alert('Sign Up Successful. Redirecting to Login Page ...');</script>");
           Response.Redirect("Login.aspx");
     }
     catch(Exception ex)
     {
           Response.Write("<script>alert('" + ex.StackTrace +"');</script>");
     }
}

【问题讨论】:

标签: c# sql asp.net sql-server


【解决方案1】:

USER是sqlserver的保留字;如果你调用你的表用户,你必须在使用它时引用它的名字。考虑将您的表重命名为用户,或引用它 (insert into [user])。给表命名的一个好处是它们很少与关键字发生冲突(尽管“表名应该是单数还是复数有点像一场圣战”..)

不好:

好:

注意:这些图像显示创建表语句的事实无关紧要;使用“用户”而不引用它在插入中不起作用,就像在创建中不起作用一样


其他几点:

  • 请勿发布代码图片。粘贴文本比上传图片的麻烦更容易,而且我们最好有文本。如果我们想要图像,我们会问。下次只需选择您的代码,按 Ctrl-C,然后按 Ctrl-V 进入您的问题。如果它在开始时至少有 4 个空格,它将格式化为等宽
  • 发布完整的错误消息。您刚刚发布了错误的类型。完整的信息将类似于“user.. 附近的无效语法”,这对我们至关重要
  • 考虑避免在 SQLServer 上使用 AddWithValue - https://www.dbdelta.com/addwithvalue-is-evil/ - 我不太关心插入语句,但它会导致 select 语句出现问题
  • 给你的文本框等适当的名字。重命名控件需要几秒钟,不要坚持使用默认的“TextBox1”名称 - 当您添加了一百个控件时,您的代码将变得毫无意义且难以遵循
  • 不要以纯文本形式存储密码。阅读什么是散列和加盐,并始终始终对您的密码进行加盐散列。像这样的代码加上重用密码的人性是密码列表和彩虹表存在的原因,也是一个黑客导致许多黑客攻击的原因。一旦有人入侵了您的网站并将所有用户精心挑选的超级安全 16 字符随机字符密码抓取到一个列表中,他们就可以在其他任何地方尝试它们以获得胜利。你不能回头说“好吧,重复使用密码是他们的错”——有两个错误,但以纯文本形式存储密码是更大的错误(因为它比人性更容易修复)。如果您不想安全地存储用户数据,请将身份验证/授权问题交给其他人,例如 auth0 或 Microsoft azure AD
  • 如果您正在学习数据库交互,使用 Dapper 或 EF 可能是更好的选择;这是您正在编写的非常低级的代码 - 它需要很多行/努力,但整体操作很少。在 EF 中,您的所有代码都类似于:
    db.Users.Add(new User { Username = userTextbox.Text, Password = passTextBox.Text });
    db.SaveChanges();

...它会起作用的,因为 EF 知道如何引用表名

【讨论】:

    【解决方案2】:

    试试这个 -

    insert into [dbo].[user] (username, password) values (@user, @pass)
    

    【讨论】:

    【解决方案3】:

    请将插入语句更改为 'user' 是数据库中的关键字。

    INSERT INTO [dbo].[user] (COLUMNS) VALUES();
    

    请确保您的连接字符串正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多