2017-10-01 9 views
0

データベースのテーブルで、存在しない新しいエントリを作成し、存在する場合に更新したいとします。 UserID LernfeldIDとSchoolyearをマークにリンクさせるテーブルがあります。エントリが存在しないことを意味するUserIDに一致するものがない場合は、データベースの挿入のみが必要です。エントリーがあれば更新されるはずです。c#データベースからNULL行をフィルタリングして存在する行を更新する

私はDatatableオブジェクトで作業しましたが、これは私が読んだことからはずれているようでした。私はDBNull.Valueでチェックしたかったが、うまくいかなかった。私のデータベースは、SELECTステートメントのみを受け取ります。 DataTableをforループで更新し、それをデータベースに送り返すと正常に動作します。しかし、私はまだ "エントリが存在"チェックを行う必要があります。あなたはそれで私を助けてくれますか?

public static void DB_GetMarks() 
    { 
     using (SqlConnection con = new SqlConnection(ConnectionString)) 
     { 
      try 
      { 
       SqlCommand cmdQueryMarks = new SqlCommand(); 
       cmdQueryMarks.Connection = con; 
       cmdQueryMarks.CommandText = "SELECT UserID, LernfeldID, SchuljahrID, Note " 
              + "FROM UsersToLernfelder " 
              + "WHERE USERID = @usrID " 
              + "AND SchuljahrID = @YearID " 
              + "ORDER BY LernfeldID ASC"; 
       cmdQueryMarks.Parameters.AddWithValue("@usrID", _UserID); 
       cmdQueryMarks.Parameters.AddWithValue("@YearID", _YearID); 

       SqlDataAdapter da = new SqlDataAdapter(cmdQueryMarks); 

       DataTableMapping dtm = da.TableMappings.Add("Table", "UsersToLernfelder"); 
       dtm.ColumnMappings.Add("UserID", "User"); 
       dtm.ColumnMappings.Add("LernfeldID", "Lernfeld"); 
       dtm.ColumnMappings.Add("SchuljahrID", "Schuljahr"); 

       DataTable tbl = new DataTable(); 
       da.Fill(tbl); 

       int i = 0; 

       foreach (DataRow row in tbl.Rows) 
       { 
        object value = row["UserID"]; 

        if (value == DBNull.Value) 
        { 
         DataRow newEntry = tbl.NewRow(); 
         newEntry["UserID"] = UserID; 
         newEntry["Lernfeld"] = i + 1; 
         newEntry["Schuljahr"] = YearID; 
         newEntry["Note"] = MarksArr[i]; 
         tbl.Rows.Add(newEntry); 
        } 
        else 
        { 
         row["marks"] = MarksArr[i]; 
        } 

        i++; 
       } 

       SqlCommandBuilder cmb = new SqlCommandBuilder(da); 
       da.Update(tbl); 
      } 
      catch (Exception ex) 
      { 
       _Err = ex.Message; 
      } 
     } 
    } 

PS:

私のコードは次のようになります。これは私の最初の投稿ですので、可能な間違いをお許しください。

+0

どのSQLデータベース(Oracle、SQL Server、MySQLなど)を使用していますか?また、MERGEステートメントは動作しますが、コードの要件を満たしているかどうかは不明です。 – bbrumm

答えて

0

あなたはすでにあなたが存在しないユーザーでUsersToLernfelderを更新したい場合は、あなたがUsersMarksのリストを持っている必要があり@UserID

でレコードをフィルタ処理しているので、あなたは、Nullの行を取得することはできません。

public static void DB_GetMarks(int _UserID, int _YearID) 
    { 

     Dictionary<int, double> MarksArr = new Dictionary<int, double>(); 

     MarksArr.Add(1, 50); 
     MarksArr.Add(2, 49); 
     MarksArr.Add(3, 48); 
     using (SqlConnection con = new SqlConnection("")) 
     { 
      try 
      { 
       SqlCommand cmdQueryMarks = new SqlCommand(); 
       cmdQueryMarks.Connection = con; 
       cmdQueryMarks.CommandText = "SELECT UserID, LernfeldID, SchuljahrID, Note " 
              + "FROM UsersToLernfelder " 
              + "WHERE USERID = @usrID " 
              + "AND SchuljahrID = @YearID " 
              + "ORDER BY LernfeldID ASC"; 
       cmdQueryMarks.Parameters.AddWithValue("@usrID", _UserID); 
       cmdQueryMarks.Parameters.AddWithValue("@YearID", _YearID); 

       SqlDataAdapter da = new SqlDataAdapter(cmdQueryMarks); 

       DataTableMapping dtm = da.TableMappings.Add("Table", "UsersToLernfelder"); 
       dtm.ColumnMappings.Add("UserID", "User"); 
       dtm.ColumnMappings.Add("LernfeldID", "Lernfeld"); 
       dtm.ColumnMappings.Add("SchuljahrID", "Schuljahr"); 

       DataTable tbl = new DataTable(); 
       da.Fill(tbl); 

       int i = 0; 

       foreach (var item in MarksArr) 
       { 
        DataRow Result = (from DataRow dr in tbl.Rows where Convert.ToInt32(dr["USERID"]) == item.Key select dr).FirstOrDefault(); 
        if (Result == null) 
        { 
         DataRow newEntry = tbl.NewRow(); 
         newEntry["UserID"] = item.Key; 
         newEntry["Lernfeld"] = i + 1; 
         newEntry["Schuljahr"] = _YearID; 
         newEntry["Note"] = item.Value; 
         tbl.Rows.Add(newEntry); 
        } 
        else 
        { 
         foreach (DataRow _dr in tbl.Rows) 
         { 
          if (Convert.ToInt32(_dr["UserID"]) == item.Key) 
          { 
           _dr["marks"] = item.Value; 
          } 
         } 
        } 
        i++; 
       } 

       SqlCommandBuilder cmb = new SqlCommandBuilder(da); 
       da.Update(tbl); 
      } 
      catch (Exception ex) 
      { 
       _Err = ex.Message; 
      } 
     } 
    } 
関連する問題