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
,那么您应该有一个Users
和Marks
的列表。
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 行并更新现有行的主要内容,如果未能解决你的问题,请参考以下文章