T-SQL中的布尔值以及怎样在C#中将bit转换为bool

本文介绍T-SQL中布尔值的表示方式及其与C#间bool类型的自动转换过程。通过实例展示了如何在SQL Server中使用True/False,并在C#中无缝进行数据读取和写入。

1. T-SQL中的布尔值
在T-SQL中,使用bit来表达布尔值。
(bit在SQL Server中并不一定存储为一位;在实际情况中,往往bit被存储为一个字节和多个位。)
在SQL Server Browser (2008)中可以直接使用True/False作为bit列的输入值,SQL Server会自动把输入的True/False转换为1/0。

2. 在C#中将bit转换为bool
在具体的实践过程中,我发现.NET 3.0/3.5的ADO可以自动将bit类型转换为True/False的形式而不需要任何额外的代码。同时,反向的,使用SqlParameter也可以直接将bool插入到SQL Server中而不需要额外的代码。
bit与bool之间的转换在.NET 3.0/3.5的ADO中似乎可以自动完成。

贴出一些我试验用的代码段:
试验的表结构:
CREATE TABLE BitTest
(
 Test BIT,
)

C#代码:
取出bit类型的数据
SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;");
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM BitTest", connection);
DataSet data = new DataSet();
adapter.Fill(data);
 

在显示数据时只需要使用ToString()即可
Console.WriteLine(data.Tables[0].Rows[0][0].ToString());

在插入数据时,SqlParameter可以自动完成bool到bit的转换
SqlCommand command = new SqlCommand("INSERT INTO BitTest ([Test]) VALUES (@test)", connection);
command.Parameters.Add(new SqlParameter("@test", false));
connection.Open();
command.ExecuteNonQuery();
connection.Close();

private void SaveData() { try { System.Collections.Hashtable Para = new System.Collections.Hashtable(); DataTable tb1 = dgvGrid1.GetCommitTable().Copy(); // 添加 is_delete 列用于标识删除行(如果尚未存在) if (!tb1.Columns.Contains("is_delete")) { tb1.Columns.Add("is_delete", typeof(bool), "false"); } dgvGrid1.DataSource = tb1; DataTable changes = tb1.GetChanges(); if (changes != null && changes.Rows.Count > 0) { // 提取删除行 DataRow[] deleteRows = changes.Select("is_delete = true"); DataTable tbDelete = deleteRows.Length > 0 ? deleteRows.CopyToDataTable() : new DataTable(); MessageBox.Show("tbDelete 中将删除记录数:" + tbDelete.Rows.Count); // 提取非删除行 DataRow[] updateRows = changes.Select("is_delete = false OR is_delete IS NULL"); DataTable tbUpdate = updateRows.Length > 0 ? updateRows.CopyToDataTable() : new DataTable(); // 传入参数时确保不是 null Para.Add("@user_name1", PettyCashBasic.Classes.PettyCashLogin.UserName); Para.Add("@tb1", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbUpdate)); Para.Add("@tbDelete", PettyCashBasic.Classes.PettyCashConnection.GetTable101(tbDelete)); if (PettyCashBasic.Classes.PettyCashConnection.DataUpdate("p_user_mapping_sav", Para)) { tb1.AcceptChanges(); GetGridData(); MessageBox.Show("保存结束。"); } } else { MessageBox.Show("没有需要保存的变更。"); return; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void DeleteSelectedRows() { if (dgvGrid1.DataSource is DataTable tb1) { foreach (DataGridViewRow row in dgvGrid1.SelectedRows) { if (!row.IsNewRow) { // 设置 is_delete 为 true tb1.Rows[row.Index]["is_delete"] = true; } } } } USE [pettycash] GO /****** Object: StoredProcedure [dbo].[p_user_mapping_sav] Script Date: 2025/8/20 8:05:28 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[p_user_mapping_sav] ( @user_name1 nvarchar(50) = '' , @tb1 diytbl readonly , @tbDelete diytbl readonly -- 新增参数 ) AS BEGIN -- 临时表 -- select ISNULL(f0, '') guid_id , -- sys_guid -- ISNULL(f1, '') soft_name , -- 软件名称 -- ISNULL(f2, '') host_user , -- 主机名 -- ISNULL(f3, '') card_name , -- 用户名 -- ISNULL(f4, '') user_name , -- 用户姓名 -- ISNULL(f5, '') version_id , -- 版本号 -- case --when ISNULL(f6, '') = ''then convert(nvarchar(50), getdate(), 120) -- 格式:2025-08-19 08:43:56 when ISNULL(f6, '') = ''then convert(nvarchar(50), getdate(), 112) -- 启用日期 格式:20250819 -- else ISNULL(f6, '') end as begin_date , case when ISNULL(f7, '') = ''then '20991231' -- 停用日期 -- else ISNULL(f7, '') end as end_date , ISNULL(f8, '') rem_01 , -- 备注01 -- ISNULL(f9, '') rem_02 , -- 备注02 -- ISNULL(f10, '') rem_03 , -- 备注03 -- GETDATE() ins_time , -- 录入时间 -- @user_name1 ins_user , -- 录入人 -- GETDATE() upd_time , -- 更新时间 -- @user_name1 upd_user , -- 更新人 -- ISNULL(f11, '') is_delete -- 删除标识 -- into #TT from @tb1 -- 处理删除逻辑 -- if exists (select 1 from @tbDelete) begin delete u from user_mapping u inner join @tbDelete d on u.guid_id = d.f0 where d.f0 is not null and d.f0 <> '' end -- 数据验证 -- if exists( select 1 from #TT where soft_name <> '' and host_user <> '' and card_name <> '' and user_name <> '' ) begin -- 插入新纪录 -- insert into user_mapping ( soft_name , host_user , card_name , user_name , version_id , begin_date , end_date , rem_01 , rem_02 , rem_03 , ins_time , ins_user , upd_time , upd_user ) select T.soft_name , T.host_user , T.card_name , T.user_name , T.version_id , T.begin_date , T.end_date , T.rem_01 , T.rem_02 , T.rem_03 , T.ins_time , T.ins_user , T.upd_time , T.upd_user from #TT T left join user_mapping u on u.guid_id = T.guid_id where u.guid_id is null or T.guid_id = '' -- 更新记录 -- update u set soft_name = T.soft_name , host_user = T.host_user , card_name = T.card_name , user_name = T.user_name , version_id = T.version_id , begin_date = T.begin_date , end_date = T.end_date , rem_01 = T.rem_01 , rem_02 = T.rem_02 , rem_03 = T.rem_03 , upd_time = T.upd_time , upd_user = T.upd_user from #TT T inner join user_mapping u on u.guid_id = T.guid_id end drop table #TT END 删除后保存时提示“tbDelete 中将删除记录数:0”,user_mapping表中is_delete列bit类型默认值为0,不要添加删除点击事件
08-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值