C# update语句在某些表单中不起作用

C# update语句在某些表单中不起作用,c#,winforms,C#,Winforms,我不熟悉C#编程。我创建了一个解决方案,在该解决方案中我创建了三个项目。一个项目包含登录页面。该项目运行良好,但我的其他两个项目中的一些表单运行不正常。update语句不起作用,而所有项目都使用了相同的update语句格式。 至少有人能给我一个暗示,我可能错在哪里 if (frmMode == "Update") { int RecPos = this.BindingContext[estDataSet, "uoms_v"].Position;

我不熟悉C#编程。我创建了一个解决方案,在该解决方案中我创建了三个项目。一个项目包含登录页面。该项目运行良好,但我的其他两个项目中的一些表单运行不正常。update语句不起作用,而所有项目都使用了相同的update语句格式。 至少有人能给我一个暗示,我可能错在哪里

if (frmMode == "Update")
        {
            int RecPos = this.BindingContext[estDataSet, "uoms_v"].Position;
            string DsUOMCode = estDataSet.Tables["UOMS_V"].Rows[RecPos]["UOM_Code"].ToString();
            string TbUOMCode = this.txtUOMCode.Text;
            string SetClause = "";
            if (DsUOMCode != TbUOMCode)
            {
                SetClause = "Set UOM_Code= " + "'" + TbUOMCode + "'";
                //pmacsDataSet.Tables["UOMS"].Rows[RecPos]["UOM_Code"] = TbUOMCode;
            }

            string DsDescp = estDataSet.Tables["UOMS_V"].Rows[RecPos]["Descp"].ToString();
            string TbDescp = this.txtDescp.Text;
            if (DsDescp != TbDescp)
            {
                if (SetClause == "")
                {
                    SetClause = "Set Descp= " + "'" + TbDescp + "'";
                    estDataSet.Tables["UOMS_V"].Rows[RecPos]["Descp"] = TbDescp;
                }
                else
                {
                    SetClause = SetClause + "," + "Descp= " + "'" + TbDescp + "'";
                    estDataSet.Tables["UOMS_V"].Rows[RecPos]["Descp"] = TbDescp;
                }
            }

            string DsRemark = estDataSet.Tables["UOMS_V"].Rows[RecPos]["Remark"].ToString();
            string TbRemark = this.txtRemark.Text;
            if (DsRemark != TbRemark)
            {
                if (SetClause == "")
                {
                    SetClause = "Set Remark= " + "'" + TbRemark + "'";
                    estDataSet.Tables["UOMS_V"].Rows[RecPos]["Remark"] = TbRemark;
                }
                else
                {
                    SetClause = SetClause + "," + "Remark= " + "'" + TbRemark + "'";
                    estDataSet.Tables["UOMS_V"].Rows[RecPos]["Remark"] = TbRemark;
                }
            }

            if (SetClause == "")
            {
                MessageBox.Show("There are no changes in field values to be saved");
            }
            else
            {
                MySqlConnection conn = new MySqlConnection(connstr);
                string UpdStmt = "Update UOMS_V " + SetClause + " WHERE UOM_Code= " + "'" + DsUOMCode + "'";
                MySqlCommand cmd = new MySqlCommand(UpdStmt, conn);
                try
                {
                    //MessageBox.Show(UpdStmt);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    MessageBox.Show("Record successfully updated");
                    estDataSet.Tables["UOMS_V"].Clear();
                    frmQueryMode();
                    btnSave.Enabled = false;
                    btnModify.Enabled = false;
                    btnFind.Enabled = false;
                    btnDelete.Enabled = false;
                    btnSearch.Enabled = true;
                    btnCreate.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: " + ex);
                }
                finally
                {
                    conn.Close();
                }
            }

计量单位采用更新工作的形式。在所有其他表单中都使用了相同的代码,其中一些表单中的绑定上下文值会随着文本框值的变化而变化

正如其他人所指出的,通过构建sql语句,您对sql注入非常开放,应该对它们进行参数化。我建议按照我下面介绍的内容进行。创建命令,启动语法。对于每个需要更新的字段,将其添加到列表中并立即设置其参数。最后,添加WHERE条件,然后执行它

int RecPos = this.BindingContext[estDataSet, "uoms_v"].Position;
string DsUOMCode = estDataSet.Tables["UOMS_V"].Rows[RecPos]["UOM_Code"].ToString();
string TbUOMCode = this.txtUOMCode.Text;

string DsDescp = estDataSet.Tables["UOMS_V"].Rows[RecPos]["Descp"].ToString();
string TbDescp = this.txtDescp.Text;

string DsRemark = estDataSet.Tables["UOMS_V"].Rows[RecPos]["Remark"].ToString();
string TbRemark = this.txtRemark.Text;

if (  DsUOMCode == TbUOMCode
   && DsDescp == TbDescp
   && DsRemark == TbRemark ) 
{
   MessageBox( "No changes made" );
   return;
}

MySqlConnection conn = new MySqlConnection(connstr);
string UpdStmt = "update UOMS_V set "
MySqlCommand cmd = new MySqlCommand("", conn);
string AddComma = "";

if (DsUOMCode != TbUOMCode)
{
   // just continue to add the build string
   UpdStmt += " UOM_Code = ?parmUOM_Code ";
   cmd.Parameters.AddWithValue( "?parmUOM_Code", TbUOMCode );
   // in case any additional components to be updated you can
   // add a "," between each update field component.
   AddComma = ",";  
}

if (DsDescp != TbDescp)
{
   // in case the TbUOMCode had something, add comma BEFORE this field instance
   UpdStmt += AddComma + " Descp = ?parmDescp ";
   cmd.Parameters.AddWithValue( "?parmDescp", TbDescp );
   // in case any additional components to be updated you can
   // add a "," between each update field component.
   AddComma = ",";  
}

if (DsRemark != TbRemark)
{
   // in case the TbUOMCode had something, add comma BEFORE this field instance
   UpdStmt += AddComma + " Remark = ?parmRemark ";
   cmd.Parameters.AddWithValue( "?parmRemark", TbRemark );
   // in case you want to add any MORE change columns after this one
   AddComma = ",";  
}

// Now, tack on the WHERE clause...
UpdStmt += " WHERE UOM_Code = ?parmWhereUOMCode "
cmd.Parameters.AddWithValue( "?parmWhereUOMCode", DsUOMCode );

// Now, since we changed the "UpdStmt" value from its original command creation, 
// just update the commandText property.... leave parameters alone
cmd.CommandText = UpdStmt;

// Then apply your try/catch
try
{
   // open the connection
   // execute it... etc
}
catch
{
}
另一个注意事项。。。在我有“parmWhatever”的地方,“?”告诉MySQL连接/命令处理程序。。您将在命令对象列表中找到一个参数,其名称引用为“?parmWhatever”。。。将其值用于实际插入/更新

现在,这对你来说可能更安全一些,但正如我之前所做的那样,我预先证实了至少有些东西已经改变了。所以,如果你想的话,在那之后,你可以写成

MySqlConnection conn = new MySqlConnection(connstr);
string UpdStmt = "update UOMS_V " 
               + " set UOM_Code = ?parmUOM_Code, "
               + "     Descp = ?parmDescp, "
               + "     Remark = ?parmRemark "
               + " where UOM_Code = ?parmWhereUOM_Code ";

MySqlCommand cmd = new MySqlCommand(UpdStmt, conn);
cmd.Parameters.AddWithValue( "?parmUOM_Code", TbUOMCode );
cmd.Parameters.AddWithValue( "?parmDescp", TbDescp );
cmd.Parameters.AddWithValue( "?parmRemark", TbRemark );
cmd.Parameters.AddWithValue( "?parmWhereUOMCode", DsUOMCode );

// Then apply your try/catch
try
{
   // open the connection
   // execute it... etc
}
catch
{
}

这可能会更容易,因为它只是同时构建了所有3个可能的更改和WHERE子句。这应该可以,因为您知道至少有一列发生了更改,需要发送更新。因此,如果只更改了一个列,而其他列保持不变,那么通过更新表并将一列设置为它开始时使用的相同值,不会有任何影响,但正如您所看到的,这会使可读性/可管理性更容易。

您可以从确切地告诉我们问题所在开始,或者通过显示相关代码。当文本框值以.if(frmMode==“Update”){int RecPos=this.BindingContext[estDataSet,“uoms_v”].Position的形式更改时,绑定上下文值会立即更改。表[“uoms_v”]。行[RecPos][“uoms_code”].ToString();string TbUOMCode=this.txtUOMCode.Text;string SetClause=“”;if(DsUOMCode!=TbUOMCode){SetClause=“Set UOM_Code=“+””””“+TbUOMCode+”;}这是我用于更新的代码的一部分。@ShaivyaSharma您应该在描述中发布与您的问题相关的任何代码。伙计们,我真的需要一个解决方案!!!!感谢您的回复。但是我无法理解为什么文本框值中的更改会立即反映在数据集的一个表中的数据集表中不在同一数据集的其他表中。这就是为什么我使用相同类型的代码以一种形式获取旧值,以另一种形式获取更改的值,以从数据集获取值。我相信它似乎与某些属性值有关,这导致了这种不一致性。非常感谢您的建议。