更新命令不起作用?
UpdateCommand not working?
所以我有将更新查询存储在字符串中的代码,然后我参数绑定更新查询然后执行并更新它,这是我的代码:
string query = "UPDATE Users SET first_name = '@firstname' WHERE ID = @id";
updateUserDS.UpdateParameters.Add("id", HTTPContext.Current.Session["ColumnID"].ToString());
updateUserDS.UpdateParameters.Add("firstname", txt_firstname.Text);
updateUserDS.UpdateCommand = query;
updateUserDS.Update();
然而,当我将我的字符串查询更改为:
string query = "UPDATE Users SET first_name = 'name' WHERE ID = 44";
它完美运行并更新了我的 table,所以我猜它与我绑定查询的方式有关,有人知道我哪里出错了吗?
顺便说一句:Session["ColumnID"] 正在被完美地检索,因为它在堆栈跟踪中指出 44
删除 @firstname
中的单引号:
string query = "UPDATE Users SET first_name = @firstname WHERE ID = @id";
updateUserDS.Parameters.AddWithValue("@firstname", first_name);
updateUserDS.Parameters.AddWithValue("@id", HTTPContext.Current.Session["ColumnID"].ToString());
编辑:
假设您正在使用 SQL 服务器作为数据库尝试这样:
SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = @"UPDATE Users SET first_name = @firstname WHERE ID = @id";
sqlComm.Parameters.Add("@firstname", SqlDbType.VarChar);
sqlComm.Parameters["@firstname"].Value = txt_firstname.Text;
sqlComm.Parameters.Add("@id", SqlDbType.VarChar);
sqlComm.Parameters["@id"].Value = HTTPContext.Current.Session["ColumnID"].ToString();
using (SqlConnection sqlConn = new SqlConnection(connection string here);)
{
sqlComm.Connection = sqlConn;
sqlConn.Open();
sqlComm.ExecuteNonQuery();
}
我将其重写为使用 OldDbCommand
和 OleDbConnection
而不是 SqlDataSource
。它不依赖于 System.Web 程序集(非 Web 情况下的部署规模较小),堆栈跟踪中的层数较少(更快),这是大多数人习惯使用 ADO.NET 的方式。
var command = new OleDbCommand("UPDATE Users SET first_name = ? WHERE ID = ?");
command.Parameters.AddWithValue("id", Session["ColumnID"].ToString());
command.Parameters.AddWithValue("firstname", txt_firstname.Text);
using (var connection = new OleDbConnection(connectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
}
另外请注意,您似乎直接在 UI 层进行数据库访问!这很难测试,而且不是很灵活。如果您将所有数据访问代码移动到一个单独的 class 库中,然后通过传递 Models 来回通信会更好,它们是数据库实体的代码表示。
您还使用了 Access,它并不是真正出色的数据库系统。 MS SQL 服务器更可取。
可能看起来像这样:
代码隐藏
DataLayer DB {get; set;}
protected void Page_Load(object sender, EventArgs e)
{
DB = new DataLayer("connectionstring");
}
protected void SubmitBtn_Click(object sender, EventArgs e)
{
SystemUser user = new SystemUser()
{
Id = Session["ColumnID"].ToString(),
FirstName = txt_firstname.Text
}
DB.UpdateUser(user);
}
数据层
public class DataLayer
{
string ConnectionString {get; set;}
public DataLayer(string connectionString)
{
ConnectionString = connectionString;
}
public void UpdateUser(SystemUser user)
{
var command = new SqlCommand("UPDATE Users SET first_name = @firstname WHERE ID = @id");
command.Parameters.AddWithValue("id", user.Id);
command.Parameters.AddWithValue("firstname", user.FirstName);
using (var connection = new SqlConnection(ConnectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
}
}
public void ChangePassword(string UserId, string password)
{
//hash and change password here
}
}
型号
public class SystemUser
{
public string Id {get; set;}
public string FirstName {get; set;}
}
所以我有将更新查询存储在字符串中的代码,然后我参数绑定更新查询然后执行并更新它,这是我的代码:
string query = "UPDATE Users SET first_name = '@firstname' WHERE ID = @id";
updateUserDS.UpdateParameters.Add("id", HTTPContext.Current.Session["ColumnID"].ToString());
updateUserDS.UpdateParameters.Add("firstname", txt_firstname.Text);
updateUserDS.UpdateCommand = query;
updateUserDS.Update();
然而,当我将我的字符串查询更改为:
string query = "UPDATE Users SET first_name = 'name' WHERE ID = 44";
它完美运行并更新了我的 table,所以我猜它与我绑定查询的方式有关,有人知道我哪里出错了吗?
顺便说一句:Session["ColumnID"] 正在被完美地检索,因为它在堆栈跟踪中指出 44
删除 @firstname
中的单引号:
string query = "UPDATE Users SET first_name = @firstname WHERE ID = @id";
updateUserDS.Parameters.AddWithValue("@firstname", first_name);
updateUserDS.Parameters.AddWithValue("@id", HTTPContext.Current.Session["ColumnID"].ToString());
编辑:
假设您正在使用 SQL 服务器作为数据库尝试这样:
SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = @"UPDATE Users SET first_name = @firstname WHERE ID = @id";
sqlComm.Parameters.Add("@firstname", SqlDbType.VarChar);
sqlComm.Parameters["@firstname"].Value = txt_firstname.Text;
sqlComm.Parameters.Add("@id", SqlDbType.VarChar);
sqlComm.Parameters["@id"].Value = HTTPContext.Current.Session["ColumnID"].ToString();
using (SqlConnection sqlConn = new SqlConnection(connection string here);)
{
sqlComm.Connection = sqlConn;
sqlConn.Open();
sqlComm.ExecuteNonQuery();
}
我将其重写为使用 OldDbCommand
和 OleDbConnection
而不是 SqlDataSource
。它不依赖于 System.Web 程序集(非 Web 情况下的部署规模较小),堆栈跟踪中的层数较少(更快),这是大多数人习惯使用 ADO.NET 的方式。
var command = new OleDbCommand("UPDATE Users SET first_name = ? WHERE ID = ?");
command.Parameters.AddWithValue("id", Session["ColumnID"].ToString());
command.Parameters.AddWithValue("firstname", txt_firstname.Text);
using (var connection = new OleDbConnection(connectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
}
另外请注意,您似乎直接在 UI 层进行数据库访问!这很难测试,而且不是很灵活。如果您将所有数据访问代码移动到一个单独的 class 库中,然后通过传递 Models 来回通信会更好,它们是数据库实体的代码表示。
您还使用了 Access,它并不是真正出色的数据库系统。 MS SQL 服务器更可取。
可能看起来像这样:
代码隐藏
DataLayer DB {get; set;}
protected void Page_Load(object sender, EventArgs e)
{
DB = new DataLayer("connectionstring");
}
protected void SubmitBtn_Click(object sender, EventArgs e)
{
SystemUser user = new SystemUser()
{
Id = Session["ColumnID"].ToString(),
FirstName = txt_firstname.Text
}
DB.UpdateUser(user);
}
数据层
public class DataLayer
{
string ConnectionString {get; set;}
public DataLayer(string connectionString)
{
ConnectionString = connectionString;
}
public void UpdateUser(SystemUser user)
{
var command = new SqlCommand("UPDATE Users SET first_name = @firstname WHERE ID = @id");
command.Parameters.AddWithValue("id", user.Id);
command.Parameters.AddWithValue("firstname", user.FirstName);
using (var connection = new SqlConnection(ConnectionString))
{
command.Connection = connection;
connection.Open();
command.ExecuteNonQuery();
}
}
public void ChangePassword(string UserId, string password)
{
//hash and change password here
}
}
型号
public class SystemUser
{
public string Id {get; set;}
public string FirstName {get; set;}
}