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

时间:2015-12-06 14:03:44

标签: c# sql-server database

我试图将记录添加到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");
        }
    }
}

消息框"已添加"显示出来,所以代码肯定会到达那一点。但是,当我去检查我的数据库时,没有新的记录。

这是我的创建表代码:

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。

3 个答案:

答案 0 :(得分:3)

评论太长了。

首先,如果您要编写SQL代码。检查错误。您为五列提供了三个值,因此可能是错误。

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

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

答案 1 :(得分:1)

您没有显示连接字符串 - 但是,因为您要转到&#34;转到服务器资源管理器中的Data2.mdf文件,我< em>假设您可能正在使用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
    

    其他所有内容都完全与以前相同......

  5. 另请参阅Aaron Bertrand的优秀博客文章Bad habits to kick: using AttachDbFileName以获取更多背景信息。

    并且: NOT 将这样的SQL命令连接在一起 - 这只是询问脚本小子探索SQL注入来攻击您的站点。使用参数化查询 - 始终,没有例外。

答案 2 :(得分:0)

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

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;