【问题标题】:C# - Update SQL TableC# - 更新 SQL 表
【发布时间】:2017-09-06 07:00:56
【问题描述】:

我想更新我的 sql 表。我在这里搜索并找到了有关如何解决该问题的解决方案。但遗憾的是它只是不会更新数据库。我不知道问题是什么。 我检查了几次 sql 命令写错误,但找不到或修复它们,但遗憾的是仍然没有。我想这是 try 块中的东西,但找不到。

这是我的代码:

string connetionString = null;
SqlConnection connection;
SqlCommand command;
string sql = null;
SqlDataReader dataReader;
connetionString = "Data Source=xxx\\xxx;Initial Catalog=xxx;User ID=xxx;Password=xxx";
sql = "UPDATE Employees SET LastName = '" + Lnamestring + "', FirstName = '" + Fnamestring + "', Title = '" + Titelstring + "', TitleOfCourtesy = '" + ToCstring + "', BirthDate = '" + Birthdatestring + "', HireDate = '" + Hiredatestring + "', Address = '" + Adressstring + "', City = '" + Citystring + "', Region = '" + Regionstring + "', PostalCode = '" + Postalstring + "', Country = '" + Countrystring + "', HomePhone = '" + Phonestring + "', Extension = '" + Extensionsstring + "', Notes = '" + Notesstring + "', ReportsTo = '" + ReportTostring + "' WHERE EmployeeID = '" + IDstring + "'; ";
connection = new SqlConnection(connetionString);
try
{
    connection.Open();
    command = new SqlCommand(sql, connection);
    SqlDataAdapter sqlDataAdap = new SqlDataAdapter(command);

    command.Dispose();
    connection.Close();
    MessageBox.Show("workd ! ");

}
catch (Exception ex)
{
    MessageBox.Show("Can not open connection ! ");
}

我希望有人能帮我找出我的错误。

编辑:当我尝试它时,它似乎可以工作,因为窗口弹出“workd”但数据库没有改变。

【问题讨论】:

  • 到底发生了什么?是否发生错误? P.S 利用Using Statement P.P.S 利用参数化
  • 刚刚在底部编辑过
  • 请使用 SqlCommandParameters 代替字符串 concat
  • 你根本不执行命令。
  • command.Dispose();之前尝试command.ExecuteNonQuery();

标签: c# sql sql-server sql-update


【解决方案1】:

正如 Michał Turczyn 在他的 answer 中所写,您的代码存在一些问题。
我同意他写的所有内容,但我认为您可能会从查看代码的外观中受益 - 所以您可以这样做:

var connetionString = "Data Source=EVOPC18\\PMSMART;Initial Catalog=NORTHWND;User ID=test;Password=test";
var sql = "UPDATE Employees SET LastName = @LastName, FirstName = @FirstName, Title = @Title ... ";// repeat for all variables
try
{
    using(var connection = new SqlConnection(connetionString))
    {
        using(var command = new SqlCommand(sql, connection))
        {
            command.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = Lnamestring;
            command.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = Fnamestring;
            command.Parameters.Add("@Title", SqlDbType.NVarChar).Value = Titelstring;
            // repeat for all variables....
            connection.Open();
            command.ExecuteNonQuery();
        }       
    }
}
catch (Exception e)
{
    MessageBox.Show($"Failed to update. Error message: {e.Message}");
}

【讨论】:

  • 感谢就像一种魅力,是的,这对了解它的含义很有帮助。因为我用 C# 编码了两天了 :)
【解决方案2】:

您的代码存在一些问题:

1) 在使用IDisposable 对象时使用using,在您的情况下为connectioncommand

2) 出于安全原因,按照 cmets 中的建议,使用 SqlCommandParameters 而不是连接字符串(谷歌“防止 SQL 注入”)

3) 你没有执行你的查询!如果你不这样做,你希望它如何产生影响?例如,SqlCommand 类中有 ExecuteNonQuery 之类的方法。

【讨论】:

    【解决方案3】:
    string connetionString = null;
    SqlConnection connection;
    SqlCommand command;
    string sql = null;
    SqlDataReader dataReader;
    connetionString = "Data Source=EVOPC18\\PMSMART;Initial Catalog=NORTHWND;User ID=test;Password=test";
    sql = "UPDATE Employees SET LastName = '" + Lnamestring + "', FirstName = '" + Fnamestring + "', Title = '" + Titelstring + "', TitleOfCourtesy = '" + ToCstring + "', BirthDate = '" + Birthdatestring + "', HireDate = '" + Hiredatestring + "', Address = '" + Adressstring + "', City = '" + Citystring + "', Region = '" + Regionstring + "', PostalCode = '" + Postalstring + "', Country = '" + Countrystring + "', HomePhone = '" + Phonestring + "', Extension = '" + Extensionsstring + "', Notes = '" + Notesstring + "', ReportsTo = '" + ReportTostring + "' WHERE EmployeeID = '" + IDstring + "'; ";
    connection = new SqlConnection(connetionString);
    try
    {
        connection.Open();
        command = new SqlCommand(sql, connection);
        SqlDataAdapter sqlDataAdap = new SqlDataAdapter(command);
    
        command.ExecuteNonQuery();
    
        command.Dispose();
        connection.Close();
        MessageBox.Show("workd ! ");
    
    }
    catch (Exception ex)
    {
        MessageBox.Show("Can not open connection ! ");
    }
    
    1. 别忘了执行命令
    2. 尽量从Exception获取堆栈跟踪或错误消息。例如:MessageBox.Show($"Can not open connection ! {e.GetBaseException().Message}, {e.StackTrace}");

    【讨论】:

      【解决方案4】:

      请使用ExecuteNonQuery() 而不是SqlDataAdapter

      connection.Open();
      command = new SqlCommand(sql, connection);
      command.ExecuteNonQuery();
      command.Dispose();
      connection.Close();
      MessageBox.Show("workd ! ");
      

      【讨论】:

      • 添加几句解释,至于为什么这是问题的解决方案
      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2013-06-08
      • 2015-03-18
      • 2017-02-13
      • 2011-12-31
      相关资源
      最近更新 更多