c# 从数据库中过滤出 NULL 行并更新现有行

Posted

技术标签:

【中文标题】c# 从数据库中过滤出 NULL 行并更新现有行【英文标题】:c# filtering out NULL rows from Database and Updating existig rows 【发布时间】:2018-03-13 01:30:01 【问题描述】:

在我的数据库表中,我想创建不存在的新条目并在它们存在时更新它们。我有一个表格,将 UserID LernfeldID 和 Schoolyear 链接到标记。只有当用户 ID 不匹配时才应该插入数据库,这意味着该条目不存在。如果有条目,它应该得到更新。

我使用了Datatable 对象,因为它似乎与我所读到的内容相符。我想检查DBNull.Value,但它不起作用。我的数据库只接收SELECT 语句。如果我用 for 循环更新 DataTable 并将其发送回数据库,它就可以工作。但我仍然需要进行“条目存在”检查。你能帮我解决这个问题吗?

我的代码如下所示:

    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 语句可能有效,但不确定它是否符合您的代码要求。 【参考方案1】:

你应该看Merge 命令。 this answer 也会帮助你。

【讨论】:

【参考方案2】:

你不能得到 Null Rows,因为你已经用@UserID过滤了记录

如果您想用不存在的用户更新UsersToLernfelder,那么您应该有一个UsersMarks 的列表。

   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;
            
        
    

【讨论】:

以上是关于c# 从数据库中过滤出 NULL 行并更新现有行的主要内容,如果未能解决你的问题,请参考以下文章

六周第一次课

如何从数据数组中删除对象(核心数据)

需要一种从现有数据框创建熊猫数据框的方法

如何使用过滤的数据框更新现有 Excel 工作表的一部分?

无效更新:第 0 节中的无效行数。更新后现有节中包含的行数 (3)

从 tableview 中删除一行