Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于更新sql数据库的C#文本框_C#_Mysql - Fatal编程技术网

用于更新sql数据库的C#文本框

用于更新sql数据库的C#文本框,c#,mysql,C#,Mysql,使用C#的用户相对较新,我希望更新sql数据库中的现有数据。我确实理解DataRow dr=dTable.NewRow()行;实际上添加了一个新行,但我需要使用文本框中的数据更新所选行的命令。提前谢谢 MySqlDataAdapter dAdapter = new MySqlDataAdapter("SELECT * FROM myDatabase WHERE username ='" + txtUserName.Text + "'", myConn); DataTable dTable = n

使用C#的用户相对较新,我希望更新sql数据库中的现有数据。我确实理解DataRow dr=dTable.NewRow()行;实际上添加了一个新行,但我需要使用文本框中的数据更新所选行的命令。提前谢谢

MySqlDataAdapter dAdapter = new MySqlDataAdapter("SELECT * FROM myDatabase WHERE username ='" + txtUserName.Text + "'", myConn);
DataTable dTable = new DataTable();
dAdapter.Fill(dTable);

if (dTable.Rows.Count == 0)
{
     DialogResult drError;
     drError = MessageBox.Show("That user name does not exist, please create a user.", "User name does not exist", MessageBoxButtons.OK, MessageBoxIcon.Error);

     if (drError == DialogResult.Yes)
     {
           this.Close();
     }
 }
 else if (dTable.Rows.Count == 1)
 {
      DataRow dr = dTable.NewRow();
      dr["day1consumed"] = Convert.ToInt32(txtCCDay1.Text);
      dr["day1burned"] = Convert.ToInt32(txtCBDay1.Text);
      dr["day2consumed"] = Convert.ToInt32(txtCCDay2.Text);
      dr["day2burned"] = Convert.ToInt32(txtCBDay2.Text);
      dr["day3consumed"] = Convert.ToInt32(txtCCDay3.Text);
      dr["day3burned"] = Convert.ToInt32(txtCBDay3.Text);
      dr["day4consumed"] = Convert.ToInt32(txtCCDay4.Text);
      dr["day4burned"] = Convert.ToInt32(txtCBDay4.Text);
      dr["day5consumed"] = Convert.ToInt32(txtCCDay5.Text);
      dr["day5burned"] = Convert.ToInt32(txtCBDay5.Text);
      dr["day6consumed"] = Convert.ToInt32(txtCCDay6.Text);
      dr["day6burned"] = Convert.ToInt32(txtCBDay6.Text);
      dr["day7consumed"] = Convert.ToInt32(txtCCDay7.Text);
      dr["day7burned"] = Convert.ToInt32(txtCBDay7.Text);
      dTable.Rows.Add(dr);
      MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(dAdapter);

      int iRowsAffected = dAdapter.Update(dTable);
      dAdapter.Dispose();

      DialogResult drReply;
      drReply = MessageBox.Show("Your data has been saved", "Record updated", MessageBoxButtons.OK, MessageBoxIcon.Information);

      if (drReply == DialogResult.Yes)
      {
             this.Close();
      }
      else
      {
             MessageBox.Show("Error saving data", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
       }
  }
}

您的实际代码将添加一个新行,相反,您需要获取SELECT命令检索到的实际行,并将其更改为新值

所以你只要改变这条线

DataRow dr = dTable.NewRow();

并开始更新值。
在更新结束时,您不需要将该行添加到表的实际行集合中(它已经存在,并且您已经对其进行了修改)

因此,应删除该行

// dTable.Rows.Add(dr);
MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(dAdapter);
int iRowsAffected = dAdapter.Update(dTable);
....
话虽如此,我想指出SELECT命令文本中的一个严重问题。您使用字符串连接来形成命令,这是一个众所周知的安全问题,称为。如果要获取用户键入的值并查询数据库,则需要使用

string cmdText = "SELECT * FROM myDatabase WHERE username =@name"
MySqlDataAdapter dAdapter = new MySqlDataAdapter(cmdText,myConn);
dAdapter.SelectCommand.Parameters.Add("@name", MySqlDbType.VarChar).Value = txtUserName.Text

..…

您还可以在using块中包含MySqlCommandBuilder,因为它实现了IDisposableBrilliant,这正是我想要的。我确实知道正在添加新行,但就是找不到更新现有行的语法。至于关于字符串连接的严重问题-没有以不同的方式教授,因此必须使用提供的内容,但我会接受…不好。以这种方式教授准备查询是非常糟糕的。帮自己一个忙,花点时间学习正确的方法。即参数化查询
string cmdText = "SELECT * FROM myDatabase WHERE username =@name"
MySqlDataAdapter dAdapter = new MySqlDataAdapter(cmdText,myConn);
dAdapter.SelectCommand.Parameters.Add("@name", MySqlDbType.VarChar).Value = txtUserName.Text