我试图将记录添加到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。
答案 0 :(得分:3)
评论太长了。
首先,如果您要编写SQL代码。检查错误。您为五列提供了三个值,因此可能是错误。
其次,使用参数化查询。不要将用户输入直接放入查询字符串中。这很危险,也是SQL优化器的障碍。
第三,不要为表Table
命名。这是一个保留字。使用更好地描述实体的非保留字。
答案 1 :(得分:1)
您没有显示连接字符串 - 但是,因为您要转到"转到服务器资源管理器中的Data2.mdf
文件,我< em>假设您可能正在使用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的优秀博客文章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;