C# 为什么我的查询返回null

C# 为什么我的查询返回null,c#,asp.net,C#,Asp.net,我想问一下为什么查询返回null而不更新我想要的内容。对不起,我还是asp.net和c的新手 使用ExecuteOnQuery方法创建DbCommand以执行Update语句。如果您使用的是SQL Server,则可以使用以下代码段: using System.Data.SqlClient; string query = "UPDATE kenderaan SET buatan = @carmake" + ", model = @carmodel" +

我想问一下为什么查询返回null而不更新我想要的内容。对不起,我还是asp.net和c的新手

使用ExecuteOnQuery方法创建DbCommand以执行Update语句。如果您使用的是SQL Server,则可以使用以下代码段:

using System.Data.SqlClient;

string query = "UPDATE kenderaan SET buatan = @carmake" +
          ", model = @carmodel" +
          ", no_enjin =  @carenjin" +
          ", cc = @carcc" +
          ", seatCapacity = @carseat" +
          ", tahunBuatan = @caryear" +
          " WHERE no_kenderaan = @carid AND ic = @cusid";

using (SqlConnection conn = new SqlConnection("<connection string>"))
{
    using (SqlCommand cmd = new SqlCommand(query, conn))
    {
        cmd.Parameters.AddWithValue("@carmake", carmake);
        cmd.Parameters.AddWithValue("@carmodel", carmodel);
        cmd.Parameters.AddWithValue("@carenjin", carenjin);
        cmd.Parameters.AddWithValue("@carcc", carcc);
        cmd.Parameters.AddWithValue("@carseat", carseat);
        cmd.Parameters.AddWithValue("@caryear", caryear);
        cmd.Parameters.AddWithValue("@carid", carid);
        cmd.Parameters.AddWithValue("@cusid", cusid);

        conn.Open();
        cmd.ExecuteNonQuery();            
    }
}

使用连接对象、命令对象和using语句将代码重新构造成这样

string myquery = "UPDATE kenderaan SET buatan = @carmake ," +
              "     model = @carmodel ," +
              "     no_enjin =  @carenjin ," +
              "     cc = @carcc ," +
              "     seatCapacity =  @carseat ," +
              "     tahunBuatan = @caryear " +
              "WHERE no_kenderaan = @carid " +
              "     AND ic = @cusid ";

using (MySqlConnection _conn = new MySqlConnection("connectionStringHere"))
{
    using (MySqlCommand _comm = new  MySqlCommand())
    {
        _comm.Connection = _conn;
        _comm.CommandText = myquery;
        _comm.CommandType = CommandType.Text;
        _comm.Parameters.AddWithValue("@carmake",carmake);
        _comm.Parameters.AddWithValue("@carmodel",carmodel);
        _comm.Parameters.AddWithValue("@carenjin",carenjin);
        _comm.Parameters.AddWithValue("@carcc",carcc);
        _comm.Parameters.AddWithValue("@carseat",carseat);
        _comm.Parameters.AddWithValue("@caryear",caryear);
        _comm.Parameters.AddWithValue("@carid",carid);
        _comm.Parameters.AddWithValue("@cusid",cusid);

        try
        {
            _conn.Open();
            _comm.ExecuteNonQuery();
            MessageBox.Show("Updated!");
        }
        catch (MySqlException e)
        {
            MessageBox.Show(e.ToString()); // as mentioned on the comment
        }

    }
}
需要参数化查询的原因:

避免SQL注入 使代码更具可读性 等等D 来源


请尝试使用以下代码代替您的代码:

并确保varchar参数与字符串值相比较

 string myquery = "UPDATE kenderaan SET buatan = '" + carmake + "',model = '"+ 
 carmodel + "',no_enjin = '" +carenjin + "',cc = " + carcc + ",seatCapacity = " + 
 carseat + ",tahunBuatan = " + caryear +
 " WHERE no_kenderaan = '" + carid +  "' AND ic = '" + cusid + "'";


        connection = new DbConnection();
        connection.Update(myquery);
更新:抱歉,我刚刚用where条件更正了您的查询,我刚刚删除了您用来分隔两个条件的逗号

要避免SQL注入攻击,请使用以下方法之一:

1带存储过程的参数

2将参数与动态SQL一起使用

3.限制输入


您可以在

上找到更多信息。请删除try/catch,否则读者会认为空catch块是处理异常的方法。我已按照您的说明更改了它。谢谢,我没有投反对票,但我几乎投了。e、 Message.ToString是个坏习惯。使用e.ToString来显示内部异常和堆栈跟踪。但是仍然没有提到SQL注入攻击,或者如何避免它们。我刚刚纠正了问题的错误。但为了避免SQL注入,执行SQL查询的方式是完全错误的。我建议使用存储过程,为要传递到后端的不同值声明不同的参数。
 string myquery = "UPDATE kenderaan SET buatan = '" + carmake + "',model = '"+ 
 carmodel + "',no_enjin = '" +carenjin + "',cc = " + carcc + ",seatCapacity = " + 
 carseat + ",tahunBuatan = " + caryear +
 " WHERE no_kenderaan = '" + carid +  "' AND ic = '" + cusid + "'";


        connection = new DbConnection();
        connection.Update(myquery);