无法使用sqlcommand和Parameters进行更新

时间:2012-04-25 14:01:36

标签: c# asp.net sql sqldatasource

当我使用参数时,我在更新我的sql server 2005数据库时遇到了一些麻烦。在这里你可以看到通常必须工作的代码。我确切地说我已经做了其他处理,例如插入并且它工作得很好。

myCommand.Parameters.AddWithValue("@Pk", this.pk);
myCommand.Parameters.AddWithValue("@Titre", this.titre);
myCommand.CommandText = "Update Action set titre=@Titre where pk=@Pk";

//Execute la commande
myCommand.ExecuteNonQuery();

编辑:当我使用硬代码时,例如:

myCommand.CommandText = "Update Action set titre='title' where pk=@Pk";

它有效......

6 个答案:

答案 0 :(得分:1)

当您忘记包含“CommandType”参数时,我看到了奇怪的结果。由于您使用内联SQL,因此应将其设置为“CommandType.Text”。

myCommand.Parameters.AddWithValue("@Pk", this.pk);
myCommand.Parameters.AddWithValue("@Titre", this.titre);
myCommand.CommandText = "Update Action set titre=@Titre where pk=@Pk";

// Added CommandType //
myCommand.CommandType = CommandType.Text;

//Execute la commande
myCommand.ExecuteNonQuery();

答案 1 :(得分:1)

我不知道你哪里出错这是我的工作代码

string strCon = @"Data Source=SYSTEM19\SQLEXPRESS;Initial Catalog=TransactionDB;Integrated Security=True";

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SqlConnection cn = new SqlConnection(strCon);
            SqlCommand cmd = new SqlCommand("select * from tblTransaction1", cn);
            SqlDataAdapter da = new SqlDataAdapter();
            da.SelectCommand = cmd;
            DataSet ds = new DataSet();
            da.Fill(ds);
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                txtName.Text = ds.Tables[0].Rows[i]["FirstName"].ToString();
                txtName1.Text = ds.Tables[0].Rows[i]["LastName"].ToString();
            }
        }
    }

按钮点击代码

protected void btnInsert_Click(object sender, EventArgs e)
{
    SqlConnection cn = new SqlConnection(strCon);
    obj1.FirstName = txtName.Text;
    obj1.LastName = txtName1.Text;
    if (obj1.upDate(cn))
    {

    }
}

示例类代码文件

private bool m_flag = false;
        private string strFirstName;
        private string strLastName;

        public string FirstName
        {
            get { return strFirstName; }
            set { strFirstName = value; }
        }

        public string LastName
        {
            get { return strLastName; }
            set { strLastName = value; }
        }

public bool upDate(SqlConnection con)
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = con;
        if (con.State != ConnectionState.Open)
        {
            con.Open();
        }

        try
        {
            cmd.Parameters.AddWithValue("@Fname", FirstName);
            cmd.Parameters.AddWithValue("@Lname", LastName);
            cmd.CommandText = "Update tblTransaction1 set LastName=@Lname where FirstName=@Fname";
            if (cmd.ExecuteNonQuery() > 0)
            {
                m_flag = true;
            }
        }
        catch
        {

        }
        return m_flag;
    }

样本图片

Form With Data from SQL

Database data before update

Changing Lastname

after update

答案 2 :(得分:1)

我注意到将整个代码复制到一个新项目中会有所帮助。我遇到了很多次我的代码无法正常工作,然后第二天就无法正常工作,或者只会对其他人而不是我有效的情况。通常,这是由于在您的项目中添加和删除代码时项目的设计者所致。仅仅因为删除特定代码并不意味着该程序可以更新整个类/项目。

答案 3 :(得分:0)

如果你这样做:

Int32 rowsAffected = command.ExecuteNonQuery();
Console.WriteLine("RowsAffected: {0}", rowsAffected);

它说什么?

还要尝试使用模式名称为Action表添加前缀,例如:

myCommand.CommandText = "Update MySchema.Action set titre=@Titre where pk=@Pk";

因为有时它可能依赖于架构和用户更新此架构的权利。

答案 4 :(得分:0)

您可以尝试这样做:而不是像

那样添加参数
myCommand.Parameters.AddWithValue("@Titre", this.titre);

你应该用数据类型添加它们。

myCommand.Parameters.Add(new SqlParameter("@Titre", SqlDbType.VarChar, 50));
myCommand.Parameters["@Titre"].Value = this.titre;

这样,最终的SQL将是Update Action set titre='titre'而不是Update Action set titre=title。看看在第二个语句中 titre 不在引号''。

答案 5 :(得分:0)

在声明命令后尝试添加参数。

myCommand.CommandText = "Update Action set titre=@Titre where pk=@Pk";
myCommand.Parameters.AddWithValue("@Pk", this.pk);
myCommand.Parameters.AddWithValue("@Titre", this.titre);


//Execute la commande
myCommand.ExecuteNonQuery();

我在这里发现了类似的(不完全相同):http://forums.asp.net/t/1249831.aspx/1