我有一个简单的创建新用户表单,它从两个文本框,用户名和密码中获取值。 button2单击事件应该采用这些值并将它们插入数据库的Users表中。但是,当我运行我的代码时,消息框似乎表示数据已添加,我无法使用VS2010查看数据库中的数据。
请参阅VS中数据库连接的屏幕截图。我还在VS中创建了数据库的数据源。
任何想法?
非常感谢。
private void button2_Click(object sender, EventArgs e)
{
string username = txtUsername.Text;
string password = txtPassword.Text;
string sqlquery;
string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename='C:\Users\Nick\Documents\Visual Studio 2010\Projects\DebenhamsProjectOffice V.01\DebenhamsProjectOffice V.01\DebenhamsProjectOfficeDatabase.mdf';Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection cn = new SqlConnection(connection);
try
{
cn.Open();
}
catch (Exception)
{
MessageBox.Show("Unable to connect to Database");
}
sqlquery = "INSERT INTO Users (Username, Password) VALUES ('" + txtUsername.Text + "','" + txtPassword.Text + "')";
try
{
SqlCommand command = new SqlCommand(sqlquery, cn);
command.Parameters.AddWithValue("Username", username);
command.Parameters.AddWithValue("Password", password);
command.Parameters.Clear();
MessageBox.Show("User Added");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
txtUsername.Text = "";
txtPassword.Text = "";
cn.Close();
}
答案 0 :(得分:4)
整个用户实例和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 中创建数据库,为其指定一个逻辑名称(例如DebenhamsProjectOfficeDatabase
)
使用其逻辑数据库名称(在服务器上创建时给定)连接到它 - 并且不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将类似于:
Data Source=.\\SQLEXPRESS;Database=DebenhamsProjectOfficeDatabase;Integrated Security=True
其他所有内容都完全与以前相同......
另外:你应该始终使用参数化查询,而不是将你的SQL语句连接在一起(特别是,而不是在包含用户输入时!)到(a)避免任何危险SQL注入攻击,以及(b)提高性能!
答案 1 :(得分:2)
您必须致电Command.ExecuteNonQuery()才能发挥insert
声明的效果。
try
{
SqlCommand command = new SqlCommand(sqlquery, cn);
command.Parameters.AddWithValue("Username", username);
command.Parameters.AddWithValue("Password", password);
command.ExecuteNonQuery();
command.Parameters.Clear();
MessageBox.Show("User Added");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
答案 2 :(得分:1)
只是尝试修复代码。有些元素是至关重要的,有些元素只是优雅。 试试吧,它可能有用。或者可以指出错误的位置:
private void button2_Click(object sender, EventArgs e)
{
string username = txtUsername.Text;
string password = txtPassword.Text;
string sqlquery;
//Put away the apostrophes and used twice double quotations for
//the full path of the database file:
string connection = @"Data Source=.\SQLEXPRESS;AttachDbFilename=""C:\Users\Nick\Documents\Visual Studio 2010\Projects\DebenhamsProjectOffice V.01\DebenhamsProjectOffice V.01\DebenhamsProjectOfficeDatabase.mdf"";Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlConnection cn = new SqlConnection(connection);
/* Better to let the program fail than think it's open and moving on
removed try, catch*/
cn.Open();
//Why using your TextBoxes values if you already created strings?
//changed
//you should also be careful users can't type something like "') in the
//textboxes or they may cause a SQL injection
sqlquery = "INSERT INTO Users (Username, Password) VALUES ('" + username + "','" + password + "')";
try
{
SqlCommand command = new SqlCommand(sqlquery, cn);
/* unnecessary since you already built a query command.Parameters.AddWithValue("Username", username);
command.Parameters.AddWithValue("Password", password);
command.Parameters.Clear(); */
//Missing!!
command.ExecuteNonQuery();
MessageBox.Show("User Added");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
//Elegance
txtUsername.Clear();
txtPassword.Clear();
cn.Close();
}