データベースのテーブルで、存在しない新しいエントリを作成し、存在する場合に更新したいとします。 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:
私のコードは次のようになります。これは私の最初の投稿ですので、可能な間違いをお許しください。
どのSQLデータベース(Oracle、SQL Server、MySQLなど)を使用していますか?また、MERGEステートメントは動作しますが、コードの要件を満たしているかどうかは不明です。 – bbrumm