首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UpdateCommand不工作吗?

UpdateCommand不工作吗?
EN

Stack Overflow用户
提问于 2015-04-14 18:13:37
回答 2查看 1.2K关注 0票数 2

所以我有代码将更新查询存储在字符串中,然后参数绑定更新查询,然后执行并更新它,这是我的代码:

代码语言:javascript
复制
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();

但是,当我将字符串查询更改为:

代码语言:javascript
复制
string query = "UPDATE Users SET first_name = 'name' WHERE ID = 44";

它完美地工作并更新我的表,所以我猜想它与我如何绑定查询有关,有人意识到我哪里出了问题吗?

顺便说一句:当会话“ColumnID”在堆栈跟踪中状态为44时,它将被很好地检索。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 18:15:53

@firstname中删除单引号

代码语言:javascript
复制
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 Server作为数据库,请尝试如下:

代码语言:javascript
复制
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();
}
票数 4
EN

Stack Overflow用户

发布于 2015-04-14 18:56:38

我会将其改写为使用OldDbCommandOleDbConnection而不是SqlDataSource。它不依赖于System.Web程序集(在非web情况下更小的部署规模),堆栈跟踪中有更少的层(更快),这也是大多数人习惯使用ADO.NET的方式。

代码语言:javascript
复制
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层中直接进行数据库访问!这很难测试,而且不太灵活。最好将所有数据访问代码移到单独的类库中,然后通过传递模型(即数据库实体的代码表示)来回通信。

您还在使用Access,这并不是一个很好的数据库系统。MS更可取。

看起来可能是这样的:

代码背后

代码语言:javascript
复制
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);
}

数据层

代码语言:javascript
复制
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
    }
}

模型

代码语言:javascript
复制
public class SystemUser
{
    public string Id {get; set;}
    public string FirstName {get; set;}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29634565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档