可遇不可求的Question之DBNull.Value.ToString()

本文详细解释了DBNull.Value这一特殊值在数据库操作中的含义及其与null及string.Empty的区别。此外,文章还介绍了如何通过ToString()方法正确处理DBNull.Value,确保在XML文件转换过程中避免潜在错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DBNull.Value 是数据库操作中才会出现的一个特殊值,

这个值不同于null 也不同于 string.Empty

但是。这个值却可以ToString()

结果等于 string.Empty

很特殊,因此对于Xml文件转换过程中对每个字段都进行一次ToString操作是一个良好的习惯。

这样不会被null打扰到。嘿嘿嘿。

转载于:https://www.cnblogs.com/tigerjacky/archive/2010/10/02/1841370.html

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _2 { public partial class KnowledgeTree : Form { private string connectionString = "Data Source=localhost;Initial Catalog=pointnote;Integrated Security=True;"; // 声明控件变量 private SplitContainer mainSplitContainer; private TreeView treeView; private TextBox txtName1; private TextBox txtSubject1; private RichTextBox txtContent1; public KnowledgeTree() { InitializeComponent(); InitializeUI(); // 添加初始化调用 LoadKnowledgeTree(); // 添加树加载 } // 初始化界面控件 private void InitializeUI() { { // 主分割容器 mainSplitContainer = new SplitContainer { Dock = DockStyle.Fill, SplitterDistance = 300 }; this.Controls.Add(mainSplitContainer); // 树视图 treeView = new TreeView { Dock = DockStyle.Fill, ImageList = CreateImageList(), ShowNodeToolTips = true }; mainSplitContainer.Panel1.Controls.Add(treeView); // 详情面板 Panel detailPanel = new Panel { Dock = DockStyle.Fill }; mainSplitContainer.Panel2.Controls.Add(detailPanel); // 详情控件 txtName1 = new TextBox { Location = new Point(10, 30), Width = 200 }; txtSubject1 = new TextBox { Location = new Point(10, 70), Width = 200 }; txtContent1 = new RichTextBox { Location = new Point(10, 110), Size = new Size(400, 200) }; btnSave = new Button { Text = "保存", Location = new Point(10, 320) }; btnSave.Click += SaveKnowledge; // 绑定保存事件 detailPanel.Controls.AddRange(new Control[] { new Label { Text = "名称", Location = new Point(10, 10) }, txtName1, new Label { Text = "学科", Location = new Point(10, 50) }, txtSubject, new Label { Text = "内容", Location = new Point(10, 90) }, txtContent1, btnSave }); } } private ImageList CreateImageList() { ImageList images = new ImageList(); images.ColorDepth = ColorDepth.Depth32Bit; images.ImageSize = new Size(24, 24); // 使用系统图标(实际应用中应使用自定义图标) images.Images.Add(SystemIcons.Information); // 0: 普通节点 images.Images.Add(SystemIcons.Warning); // 1: 重要节点 images.Images.Add(SystemIcons.Question); // 2: 问题节点 return images; } // 加载知识点树状图 private void LoadKnowledgeTree() { TreeView treeView1 = this.Controls[0] is SplitContainer sc ? (TreeView)sc.Panel1.Controls[0] : null; if (treeview == null) return; treeview.Nodes.Clear(); treeview.BeginUpdate(); try { // 获取所有知识点 DataTable points = GetKnowledgePoints(); // 创建节点字典 var nodeDict = new Dictionary<int, TreeNode>(); // 第一遍:创建所有节点 foreach (DataRow row in points.Rows) { int pid = Convert.ToInt32(row["Pid"]); string nodeText = $"{row["Pname"]} ({row["Stype"]})"; TreeNode node = new TreeNode(nodeText) { Name = pid.ToString(), Tag = row, // 存储整行数据 ToolTipText = row["Content"].ToString(), ImageIndex = GetNodeIconIndex(row["Stype"].ToString()) }; nodeDict.Add(pid, node); } // 第二遍:建立父子关系 foreach (DataRow row in points.Rows) { int pid = Convert.ToInt32(row["Pid"]); object parentObj = row["ParentId"]; if (parentObj != DBNull.Value) { int parentId = Convert.ToInt32(parentObj); if (nodeDict.ContainsKey(parentId)) nodeDict[parentId].Nodes.Add(nodeDict[pid]); } else { treeview.Nodes.Add(nodeDict[pid]); } } // 展开所有节点 treeview.ExpandAll(); // 添加节点选择事件 treeview.AfterSelect += (s, e) => DisplayPointDetails(e.Node); } catch (Exception ex) { MessageBox.Show($"加载树失败: {ex.Message}"); } finally { treeview.EndUpdate(); } } private int GetNodeIconIndex(string v) { throw new NotImplementedException(); } // 从数据库获取知识点 private DataTable GetKnowledgePoints() { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sql = @"SELECT p.Pid, p.Pname, p.Stype, p.Content, r.ParentId FROM pointnote p LEFT JOIN KnowledgeRelations r ON p.Pid = r.ChildId"; using (var da = new SqlDataAdapter(sql, conn)) { DataTable dt = new DataTable(); da.Fill(dt); return dt; } } } private void label1_Click(object sender, EventArgs e) { } // 显示选中知识点的详情 private void DisplayPointDetails(TreeNode node) { if (node?.Tag == null) return; DataRow row = (DataRow)node.Tag; txtName1.Text = row["Pname"].ToString(); txtSubject1.Text = row["Stype"].ToString(); txtContent1.Text = row["Content"].ToString(); } private void SaveKnowledge(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(txtName.Text)) { MessageBox.Show("知识点名称不能为空"); return; } using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sql = @"INSERT INTO KnowledgeRelations (Pname, Stype, Content) VALUES (@name, @subject, @content); SELECT SCOPE_IDENTITY();"; using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@name", txtName1.Text); cmd.Parameters.AddWithValue("@subject", txtSubject1.Text); cmd.Parameters.AddWithValue("@content", txtContent1.Text); try { int newId = Convert.ToInt32(cmd.ExecuteScalar()); MessageBox.Show($"保存成功! ID: {newId}"); LoadKnowledgeTree(); // 刷新树 } catch (Exception ex) { MessageBox.Show($"保存失败: {ex.Message}"); } } } } } } 错误:未将对象引用设置设置到对象的实例
最新发布
07-05
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace _2 { public partial class KnowledgeTree : Form { private string connectionString = "Data Source=localhost;Initial Catalog=pointnote;Integrated Security=True;"; public KnowledgeTree() { InitializeComponent(); } // 初始化界面控件 private void InitializeUI() { // 窗体设置 this.Text = "知识点树状图系统"; this.Size = new Size(900, 600); this.StartPosition = FormStartPosition.CenterScreen; } private ImageList CreateImageList() { ImageList images = new ImageList(); images.ColorDepth = ColorDepth.Depth32Bit; images.ImageSize = new Size(24, 24); // 使用系统图标(实际应用中应使用自定义图标) images.Images.Add(SystemIcons.Information); // 0: 普通节点 images.Images.Add(SystemIcons.Warning); // 1: 重要节点 images.Images.Add(SystemIcons.Question); // 2: 问题节点 return images; } // 加载知识点树状图 private void LoadKnowledgeTree() { TreeView treeView = this.Controls[0] is SplitContainer sc ? (TreeView)sc.Panel1.Controls[0] : null; if (treeView == null) return; treeView.Nodes.Clear(); treeView.BeginUpdate(); try { // 获取所有知识点 DataTable points = GetKnowledgePoints(); // 创建节点字典 var nodeDict = new Dictionary<int, TreeNode>(); // 第一遍:创建所有节点 foreach (DataRow row in points.Rows) { int pid = Convert.ToInt32(row["Pid"]); string nodeText = $"{row["Pname"]} ({row["Stype"]})"; TreeNode node = new TreeNode(nodeText) { Name = pid.ToString(), Tag = row, // 存储整行数据 ToolTipText = row["Content"].ToString(), ImageIndex = GetNodeIconIndex(row["Stype"].ToString()) }; nodeDict.Add(pid, node); } // 第二遍:建立父子关系 foreach (DataRow row in points.Rows) { int pid = Convert.ToInt32(row["Pid"]); int? parentId = row["ParentId"] as int?; if (parentId.HasValue && nodeDict.ContainsKey(parentId.Value)) { nodeDict[parentId.Value].Nodes.Add(nodeDict[pid]); } else { treeView.Nodes.Add(nodeDict[pid]); } } // 展开所有节点 treeView.ExpandAll(); // 添加节点选择事件 treeView.AfterSelect += (s, e) => DisplayPointDetails(e.Node); } finally { treeView.EndUpdate(); } } private int GetNodeIconIndex(string v) { throw new NotImplementedException(); } // 从数据库获取知识点 private DataTable GetKnowledgePoints() { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 假设有ParentId字段表示父知识点(需修改表结构) string sql = @"SELECT p.Pid, p.Pname, p.Stype, p.Content, r.ParentId FROM pointnote p LEFT JOIN KnowledgeRelations r ON p.Pid = r.ChildId"; using (var da = new SqlDataAdapter(sql, conn)) { DataTable dt = new DataTable(); da.Fill(dt); return dt; } } } private void label1_Click(object sender, EventArgs e) { } // 显示选中知识点的详情 private void DisplayPointDetails(TreeNode node) { if (node?.Tag == null) return; DataRow row = (DataRow)node.Tag; Control detailPanel = ((SplitContainer)this.Controls[0]).Panel2; // 更新详情面板 detailPanel.Controls["txtName"].Text = row["Pname"].ToString(); detailPanel.Controls["txtSubject"].Text = row["Stype"].ToString(); ((RichTextBox)detailPanel.Controls["txtContent"]).Text = row["Content"].ToString(); } private void SaveKnowledge(object sender, EventArgs e) { Control detailPanel = ((SplitContainer)this.Controls[0]).Panel2; string name = detailPanel.Controls["txtName"].Text; string subject = detailPanel.Controls["txtSubject"].Text; string content = ((RichTextBox)detailPanel.Controls["txtContent"]).Text; if (string.IsNullOrWhiteSpace(name)) { MessageBox.Show("知识点名称不能为空"); return; } using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); // 插入新知识点 string sql = @"INSERT INTO pointnote (Pname, Stype, Content) VALUES (@name, @subject, @content); SELECT SCOPE_IDENTITY();"; using (var cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue("@name", name); cmd.Parameters.AddWithValue("@subject", subject); cmd.Parameters.AddWithValue("@content", content); try { int newId = Convert.ToInt32(cmd.ExecuteScalar()); MessageBox.Show($"知识点保存成功! ID: {newId}"); // 刷新树状图 LoadKnowledgeTree(); } catch (Exception ex) { MessageBox.Show($"保存失败: {ex.Message}"); } } } } } }报错:未连接实例
07-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值