c#
  • sql-server
  • 2012-05-04 60 views 1 likes 
    1

    我必须SQL Server上的更新表,但首先我必须以检查表中的现有数据,因此如果数据有更新,如果不做出新的插入:更新/插入到表

    cmd_sql.CommandText = " SELECT BrDok as id_dok " + 
             " FROM ordersstavke " + 
             " WHERE SifParFil = '" + rw_mat["sifskl_kor"] + "'" + 
             " AND DokumentTip = '" + rw_mat["vrst_dok"] + "'"; 
    
    MySqlDataAdapter sql_adapter = new MySqlDataAdapter(cmd_sql); 
    DataSet dt_dok = new DataSet("DOK_MAT_EXCHANGE"); 
    sql_adapter.Fill(dt_dok); 
    
    if (dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0) 
    { 
        myQuery = " INSERT INTO ordersstavke (BrDok, DocumentTip, SifParFil) " + 
          " VALUES ('" + rw_mat["brdok"] + "', '" + 
              rw_mat["vrst_dok"] + "', '" + 
              rw_mat["sifskl_kor"] + "')"; 
    } 
    else 
    { 
        UPDATE DATA 
    } 
    

    但我在代码中的错误,该错误是在这里如果(dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0

    对象引用不设置为一个对象的一个​​实例。

    的问题是在这个if语句...

    +0

    请请请从动态SQL切换到参数化查询,如果你不打算使用全吹动存储过程。无论何时使用动态SQL,您都会暴露出SQL注入攻击。直接从马的嘴巴:http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html –

    回答

    0

    好,谢谢你们,我写了这样的

    if (ds_dok.Tables[0].Rows.Count <= 0) 
            { 
             myQuery = " INSERT INTO ordersstavke (BrDok, " + 
                " SifParFil) " + 
                " VALUES ('" + rw_mat["brdok"] + "', '" + 
                   rw_mat["sifskl_kor"] + "')"; 
            } 
            else if (ds_dok.Tables[0].Rows.Count >= 1) 
            { 
    
             myQuery = "UPDATE ordersstavke " + 
                "SET BrDok = '" + rw_mat["brdok"] + "', " + 
                "SifParFil = '" + rw_mat["sifskl_kor"] + "', " + 
                "WHERE BrDok = " + ds_dok.Tables["ordersstavke"].Rows[0]["BrDok"].ToString() + "'"; 
    
            } 
    

    但在部分更新一个小问题:s_dok.Tables [ “ordersstavke”]行[0] [ “BrDok”] .ToString(),在这里它给了我爱的错误:对象引用未设置为对象的实例。

    也许在MySQL中更新的推移不同的方式,我引用的例子SQL Server上有更新进入不同

    4

    DOK_MAT_EXCHANGEDataSet的名字,第一个表中没有。

    您应该测试

    if (dt_dok.Tables[0].Rows.Count == 0) 
    

    另外,我觉得是更好地使用这样的语法来发现多少条记录礼物

    cmd_sql.CommandText = "SELECT COUNT(BrDok) as id_dok " + 
             " FROM ordersstavke " +       
             " WHERE SifParFil = ?p1 " +       
             " AND DokumentTip = ?p2"; 
    cmd_sql.Parameters.AddWithValue("?p1", rw_mat["sifskl_kor"]); 
    cmd_sql.Parameters.AddWithValue("?p2", rw_mat["vrst_dok"]); 
    int rowCount = (Int32)cmd_sql.ExecuteScalar(); 
    
    +0

    +1参数化查询 –

    1

    变化

    DataSet dt_dok = new DataSet("DOK_MAT_EXCHANGE"); 
    

    DataSet dt_dok = new DataSet("ordersstavke "); 
    

    if (dt_dok.Tables["DOK_MAT_EXCHANGE"].Rows.Count == 0) 
    

    if (dt_dok.Tables["ordersstavke "].Rows.Count == 0) 
    
    1

    通过数据集名称访问的第一个表是不正确,这是用于设置XML。

    而是使用

    dt_dok.Tables[0].Rows.Count; 
    

    话虽这么说,你最好不要写这个作为一个单一的SQL语句,而不是单独的选择& &插入。这样你就不会多次访问数据库。

    var sql = @"if exists(select * from ordersstavke where SifParFil = ? and DokumentTip = ?) 
    then 
    -- do insert statement 
    else 
    -- do update 
    end if"; 
    

    这也可能更好地与一个存储过程完成的,所以你不必在C#中尽可能多的SQL代码。以这种方式管理多个操作更容易。

    而对于大声喊叫,请使用SqlParameters,而不是字符串连接!这只是要求麻烦!

    相关问题