c#
  • sql-server
  • 2012-05-04 61 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,而不是字符串連接!這只是要求麻煩!

    相關問題