为什么我没有得到任何错误,但数据库并没有插入记录
本文关键字:数据库 并没有 记录 插入 错误 任何 为什么 | 更新日期: 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
文件,我几乎可以肯定您的数据已经存在。
在我看来,真正的解决方案是
-
安装SQL Server Express(而且您已经安装了)
-
安装SQL Server Management Studio Express
-
在SSMS Express中创建数据库,并为其指定一个逻辑名称(例如
Data2
) -
使用其逻辑数据库名称(在服务器上创建时给定)连接到它,并且不要干扰物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
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;