为什么我没有得到任何错误,但数据库并没有插入记录

本文关键字:数据库 并没有 记录 插入 错误 任何 为什么 | 更新日期: 2023-09-27 18:25:55

我正试图将一条记录添加到C#中的控件中的数据库中:

public partial class ctrl_Register : UserControl
{
    public ctrl_Register()
    {
        InitializeComponent();
    }
    private void btn_reg_Click(object sender, EventArgs e)
    {
        bool ok = false;
        int col = 1;
        if (tBox_username.Text != "")
        {
            if (tBox_password.Text != "")
            {
                if (cBox_colour.Text != "")
                {
                    ok = true;
                }
            }
        }
        if (ok)
        {
            using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.data2cString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = @"INSERT INTO [Table](Id,username,password,colour,bestTime) VALUES ('"+tBox_username.Text+"','"+tBox_password.Text+"','"+cBox_colour.Text+"')";
                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        MessageBox.Show("added");
                    }
                    catch (SqlException s)
                    {
                        MessageBox.Show(s.Message.ToString(), "Error Message");
                    }
                }
            }
        }
        else
        {
            MessageBox.Show("no insert");
        }
    }
}

消息框"added"出现了,所以代码肯定达到了这一点。然而,当我去检查我的数据库时,没有新的记录。

这是我创建的表代码:

CREATE TABLE [dbo].[Table] 
(
    [Id]       INT          IDENTITY (0, 1) NOT NULL,
    [username] VARCHAR (50) NOT NULL,
    [password] VARCHAR (50) NOT NULL,
    [colour]   VARCHAR (50) DEFAULT ('Orange') NULL,
    [bestTime] INT          DEFAULT ((0)) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

它肯定是设置文件中正确的连接字符串。但是,当我转到数据库资源管理器中的data2.mdf文件并转到表的"显示数据"时,只有NULL存在。

为什么我没有得到任何错误,但数据库并没有插入记录

首先,如果要编写SQL代码。检查是否有错误。您为五列提供了三个值,所以这很可能是一个错误。

其次,使用参数化查询。不要将用户输入直接放入查询字符串中。这是危险的,也是SQL优化器的障碍。

第三,不要将表命名为Table。这是一个保留词。使用一个非保留的词来更好地描述实体。

您没有显示连接字符串,但由于您说"转到服务器资源管理器中的Data2.mdf文件,我认为您可能使用了AttachDbFileName=方法。

整个AttachDbFileName=方法是有缺陷的-充其量!在Visual Studio中运行应用程序时,它将围绕.mdf文件进行复制(从App_Data目录复制到应用程序运行的输出目录,通常为.'bin'debug),很可能,您的INSERT工作得很好,但您最终只是看到了错误的.mdf文件

如果您想坚持这种方法,请尝试在myConnection.Close()调用上设置断点,然后使用SQL Server Mgmt Studio Express检查.mdf文件,我几乎可以肯定您的数据已经存在。

在我看来,真正的解决方案是

  1. 安装SQL Server Express(而且您已经安装了)

  2. 安装SQL Server Management Studio Express

  3. SSMS Express中创建数据库,并为其指定一个逻辑名称(例如Data2

  4. 使用其逻辑数据库名称(在服务器上创建时给定)连接到它,并且不要干扰物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:

    Data Source=.''SQLEXPRESS;Database=Data2;Integrated Security=True
    

    其他一切都与以前完全一样。。。

另请参阅Aaron Bertrand的优秀博客文章《坏习惯:使用AttachDbFileName获取更多背景信息》。

此外:不要像这样将SQL命令连接在一起——这只是要求找一个脚本孩子来探索SQL注入来攻击你的网站。使用参数化查询-始终如此,无一例外。

更改命令文本并使用以下参数

cmd.CommandText = @"INSERT INTO [Table](username,password,colour) VALUES(@username, @password, @colour)";
cmd.Parameters.Add("@username", SqlDbType.VarChar).Value = tBox_username.Text;
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value =  tBox_password.Text;
cmd.Parameters.Add("@colour", SqlDbType.VarChar).Value =  tBox_colour.Text;