【转】C#操作sqlServer数据库

2023-11-13

转载地址:https://blog.csdn.net/weixin_42731241/article/details/81172622

工具:vs2015  、SqlServer

数据库的连接及打开关闭

  1. VS2015建立一个c#的控制台应用程序,必须要包含两个using 指令:using System.Data;using System.Data.SqlClient;(SqlClient是因为我选用的数据库为sqlserver,若连接的数据库是mysql则用MySqlClient)
  2. 建立一个连接数据库对象: SqlConnection conn = new SqlConnection();
  3. 设置SqlConnection.ConnectionString属性:获取或设置用于打开 SQL Server 数据库的字符串。如conn.ConnectionString = "Server=服务器名;DataBase=数据库名;Trusted_Connection=SSPI";(其中Trusted_Connection为false时,连接中指定用户 ID 和密码。 当true,当前的 Windows 帐户凭据用于身份验证这是Windows身份验证登陆的;可识别的值为true, false, yes, no,和sspi(强烈建议),这等同于true。)这些字段的含义即对应值的要求都可以在官方文档上查到
  4. 打开数据库:SqlConnection.Open();(使用SqlConnection.ConnectionString所指定的属性设置打开数据库连接)要查看是否打开可以打印SqlConnection.State属性,会返回一个 ConnectionState 枚举(Open表示打开,Closed表示关闭等具体可查看官方文档),用于指示 SqlConnection 的状态。
  5. 关闭数据库:SqlConnection.Close();

执行数据库语言增、删、改、查

  1. 定义一个String类型的sql语句:sql_insert = "insert into Table_1(uid,name) values(@UID,@NAME)";(要传的参数前面要加@字符,sql语句可以写增删改查,这里以插入数据为例)
  2. 创建一个SqlCommand对象执行sql语句:SqlCommand cmd_insert = new SqlCommand(sql_insert, conn);(参数为索要执行的sql语句和已连接的数据库)
  3. 为参数赋值:定义SqlParameter对象qlParameter para1 = new SqlParameter("@UID", "100");(参数为参数名和值)
  4. 将赋值后的参数写入: cmd_insert.Parameters.Add(para1);(SqlCommand.ExecuteNonQuery()可以返回执行 Transact-SQL 语句受影响的行数。所以可以通过这个返回值查看sql语句是否执行)
  5. 为参数赋值和写入参数可写到一起,用SqlCommand.Parameters.AddWithValue("@NAME","Bit");
  6. 查询执行完后要接收查询到的数据,用SqlDataReader对象接收,如 SqlDataReader reader = sqlComm.ExecuteReader();
  7. 读取数据,用SqlDataReader.Read()方法循环读取,Read()方法会让 SqlDataReader 前进到下一条记录(具体使用看下面代码)

调用存储过程

Sqlserver management创建存储过程

数据库->可编程性->存储过程->存储过程->写见下图->执行

USE [testDB]
GO
/****** Object:  StoredProcedure [dbo].[testInsert]    Script Date: 2018/7/25 10:06:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Batch submitted through debugger: SQLQuery17.sql|7|0|C:\Users\ibit\Documents\SQL Server Management Studio\SQLQuery17.sql
ALTER PROCEDURE [dbo].[testInsert]
    @Name varchar(30),
	@Uid int
AS
    INSERT INTO  Table_1(name,uid)VALUES(@Name,@Uid)

 

  1. 创建一个SqlCommand 的对象:SqlCommand cmd = new SqlCommand("存储过程名字",conn))(赋第一个参数为存储过程名字,第二个为数据库连接对象)
  2. 设置SqlCommand.CommandType的属性: cmd.CommandType = CommandType.StoredProcedure;(StoredProcedure表示执行的是存储过程)
  3. 给存储过程要传的参数赋值:SqlParameter para = new SqlParameter("@NAME", SqlDbType.VarChar, 20);(第一个为参数名字记得加@,第二个为参数类型,第三个为长度,如果参数类型为int,那么第三个参数我们就不需要写)  para .Value = "Bit"(为参数赋值)
  4. 将参数添加的SqlCommand对象: cmd.Parameters.Add(para);

批量写入数据

  1. 在内存中创建一个数据表对象: DataTable dt = new DataTable();
  2. 为数据表添加列DataTable.Columns.AddRange(new DataColumn[])(注意这里的列一定要跟你数据库里的列字段,类型一致,SqlBulkCopy不是根据表的ColumnName来匹配的,而是根据ColumnIndex匹配,也就是说你的表 字段必须跟数据库的表字段完全一致(Index的排序要跟数据表的一样)。就算你该字段不打算给他插入值,也要建个DataColumn。包括自增ID.不需要给他值就好了,否则会出错)
  3. 创建SqlBulkCopy对象用于批量操作:SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);(参数为SqlConnection 类型,即要操作的数据库)
  4. 设置SqlBulkCopy.DestinationTableName属性,即批量操作的表名,如bulkCopy.DestinationTableName = "Table_1";
  5. 设置SqlBulkCopy.BatchSize属性,即批量操作的行数,如bulkCopy.BatchSize = dt.Rows.Count;(也就是内存中创建的表的行数)
  6. 循环创建要写入的数据:创建一个DataRow对象,并使其结构与内存中表结构相同,为这行记录赋值,赋值的时候DataRow对象实际上是个数组,0代表你之前创建的DataTable 对象的第一列,为每列附上值就可以了,最后将附好值的这一行加到DataTable对象上(具体写法见下面代码)
  7. 将内存表中的数据写到服务器上的目标表中,用SqlBulkCopy.WriteToServer (DataTable)方法

 

附:(感觉方法还需要封装以下)

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace A006
{
    class Program
    {
 
        //连接数据库
        public void Conn(SqlConnection conn)
        {
            //获取或设置用于打开 SQL Server 数据库的字符串
            conn.ConnectionString = "Server=DESKTOP-8VD7LNG;DataBase=testDB;Trusted_Connection=SSPI";
 
            try
            {
                //打开数据库
                conn.Open();
                //打印数据库连接状态
                Console.WriteLine(conn.State);
 
            }
            catch (SqlException ex)
            {
                Console.WriteLine("数据库打开失败!");
                Console.WriteLine(ex.Message);
            }
 
        }
 
        //insert
        public void Insert(SqlConnection conn)
        {
           
            String sql_insert = "insert into Table_1(uid,name) values(@UID,@NAME)";
 
            SqlCommand cmd_insert = new SqlCommand(sql_insert, conn);
            SqlParameter para1 = new SqlParameter("@UID", "106");
            cmd_insert.Parameters.Add(para1);
            SqlParameter para2 = new SqlParameter("@NAME", "Bit106");
            cmd_insert.Parameters.Add(para2);
 
            //对连接执行 Transact-SQL 语句并返回受影响的行数
            int res_1 = cmd_insert.ExecuteNonQuery();
            Console.WriteLine(res_1);
        }
 
        //update
        public void update(SqlConnection conn)
        { 
            string sql_update = "update Table_1 set name=@NAME where id=@ID;";
            SqlCommand cmd_update = new SqlCommand(sql_update, conn);
            cmd_update.Parameters.AddWithValue("@ID", "3");
            cmd_update.Parameters.AddWithValue("@NAME", "Bit100");
            int res_2 = cmd_update.ExecuteNonQuery();
            Console.WriteLine(res_2);
        }
 
        //delete
        public void delete(SqlConnection conn)
        {
            string sql_delete = "DELETE FROM Table_1 WHERE name=@NAME;";
            SqlCommand cmd_delete = new SqlCommand(sql_delete, conn);
            cmd_delete.Parameters.AddWithValue("@NAME", "Bit106");
            int res_3 = cmd_delete.ExecuteNonQuery();
            Console.WriteLine(res_3);
        }
 
        //select 
        public void select(SqlConnection conn)
        {
            //定义查询语句
            String sql = "select * from Table_1";
            SqlCommand sqlComm = new SqlCommand(sql, conn);
            //接收查询到的sql数据
            SqlDataReader reader = sqlComm.ExecuteReader();
            //读取数据
            while (reader.Read())
            {
                //打印
                Console.WriteLine(reader["uid"].ToString());
                Console.WriteLine(reader["name"].ToString());
            }
            reader.Close();
        }
 
        //调用存储过程
        public void procedure(SqlConnection conn)
        {
            SqlCommand cmd = new SqlCommand("testInsert", conn);
            cmd.CommandType = CommandType.StoredProcedure;//告知执行存储过程
            //传参数
            cmd.Parameters.AddWithValue("@Uid", "106");
            cmd.Parameters.AddWithValue("@Name", "Bit106");
            int res = cmd.ExecuteNonQuery();
            Console.WriteLine(res);
 
        }
 
        //批量写入
        public void insertBulk(SqlConnection conn)
        {
            DataTable dt = GetTableSchema();
        
            SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
            //获取服务器上目标表的名称
            bulkCopy.DestinationTableName = "Table_1";
            bulkCopy.BatchSize = dt.Rows.Count;
 
            for (int i = 0,j=107; i < 100; i++,j++)
            {
                //创建与该表结构相同的行
                DataRow dr = dt.NewRow();
                dr[1] = j;
                dr[2] = "Bit" + j;
                dt.Rows.Add(dr);
            }
            if (dt != null && dt.Rows.Count != 0)
            {
                try
                {
                    //将内存中数据表的记录写到服务器上的目标表中
                    bulkCopy.WriteToServer(dt);
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
               
            }
            //Console.WriteLine(string.Format("插入{0}条记录", 100));
         }
        static DataTable GetTableSchema()
        {
            //内存中建一个数据表
            DataTable dt = new DataTable();
            //获取该数据表的列
            dt.Columns.AddRange(new DataColumn[] {
        new DataColumn("id",typeof(int)),
        new DataColumn("uid",typeof(int)),
        new DataColumn("name",typeof(string))});
            return dt;
        }
 
 
        static void Main(string[] args)
        {
            //建立一个连接数据库的对象
            SqlConnection conn = new SqlConnection();
            Program p = new Program();
            p.Conn(conn);
            //查
            // p.select(conn);
            //增
            //p.Insert(conn);
            //改
            //p.update(conn);
            //删
            //p.delete(conn);
 
            //调用存储过程
            //p.procedure(conn);
 
            //批量写入
            p.insertBulk(conn);
 
            conn.Close();
            conn.Dispose();
 
            Console.ReadLine();
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】C#操作sqlServer数据库 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 提升mapped_file_source、对齐方式和页面大小

    我正在尝试在性能很重要的上下文中解析一些大小高达几百兆字节的文本文件 因此我使用 boostmapped file source 解析器期望源以空字节终止 因此我想检查文件大小是否是页面大小的精确倍数 如果是 则使用较慢的非内存映射方法 我
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 【状态估计】基于UKF、AUKF的电力系统负荷存在突变时的三相状态估计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及数据 1 概述 基于UKF和AUKF的电力系统负荷存在突
  • ARM发布Cortex-X1,是为了向苹果自研A系列处理器发起冲击吗?

    对于Arm来说 2019年是伟大的一年 这一年ARM的Cortex内核依然是手机CPU领域的佼佼者 特别是Cortex A77 红极一时的高通骁龙865处理器采用的就是Cortex A77 据说采用骁龙865处理器的手机有70款之多 其中就
  • c语言文件处理中ab,C语言文件处理中wt是什么操作方式?

    匿名用户 1级 2013 04 25 回答 最常用的文件使用方式及其含义如下 1 r 为读而打开文本文件 不存在则出错 2 rb 为读而打开二进制文件 3 w 为写而打开文本文件 若不存在则新建 反之 则从文件起始位置写 原内容将被覆盖 4
  • 【中间件】Redis如何解决BigKey

    BigKey 的弊端 BigKey 需要解决 根源就在于 BigKey 会带来的问题 占用内存 因为 Redis 数据结构的底层数据结构 大 Key 会占用更多的内存空间 造成更大的内存消耗 单线程模型 因为 Redis 的通信依赖于 So
  • 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道 不同肤色的人外貌差别很大 而双胞胎的辨识很难 有意思的是Web服务器 Web容器 Web应用程序服务器 反向代理有点像四胞胎 在网络上经常一起出现 本文将带读者对这四个相似概念如何区分 Web服务器概念与基本原理 Web服务器的历
  • CSS基础之CSS文本属性

    文章目录 前言 1 color 2 text align 3 font size 4 text decoration 5 text indent 6 line height 7 文本属性总结 前言 CSS 文本属性可以设置文本的 外观 比如
  • 从同源政策到跨域解决方法

    一 同源政策 同源政策的目的 是为了保证用户信息的安全 防止恶意的网站窃取数据 所谓同源指的是协议 域名 端口相同 否则就会产生跨域问题 二 跨域 跨域问题主要分为三类 1 Cookie LocalStorage 和 IndexDB 无法读
  • 记一次jQuery EasyUI使用-Easyui combobox的使用方法

    开局附上最最最有用的官方文档 划重点 easyui使用手册 进入正题 现象 有这样一段代码 浏览器请求getSystemSignList方法有返回数据并且严格符合easyui的应答规范 一个json格式的list对象 tr td class
  • 大模型讲习班丨第四范式黄世宇:强化学习的发展历程与基于人类反馈的强化学习...

    人工智能研究与应用范式正经历一场剧变 越来越多的顶级团队和杰出人才纷纷加入这一变革浪潮 作为AI大模型科研先锋 智源研究院携手一批卓越的学者与工程师 致力于将尖端技术与经验传授给有潜力的学习者 通过高效的学习方式 让更多人能迅速融入这一重要
  • MobileNet网络结构详解

    下图展示了传统卷积与DW卷积的差异 在传统卷积中 每个卷积核的channel与输入特征矩阵的channel相等 每个卷积核都会与输入特征矩阵的每一个维度进行卷积运算 而在DW卷积中 每个卷积核的channel都是等于1的 每个卷积核只负责输
  • Python-安装库-图像处理库-cv2

    问题 在pycharm中搜索cv2库 发现没有版本 在网上查找资料 找到了类似官方文档的资料 提到了安装方法 https pypi org project opencv python description cv2介绍 CV2指的是Open
  • ERROR 1064 (42000): You have an error in your SQL syntax

    mysql使用load data infile导入数据 出现如下错误 root NoName 21 19 12 gt load data infile change csv into table change CHARACTER SET u
  • JAVA基础知识点大全之二

    1 泛型 1 1 泛型类 定义格式 修饰符 class 类名 lt 类型 gt 1 2 泛型方法 定义格式 修饰符 lt 类型 gt 返回值类型 方法名 类型 变量名 1 3 泛型接口 定义格式 修饰符 interface 接口名 lt 类
  • c/c++多线程编程(1):线程的创建

    参考资料 多线程和线程同步 C C 运行环境 wsl2 Ubuntu 20 04 vscode clangd xmake gcc9 4 0 1 创建线程 1 1 线程函数 每个线程都有一个属于自己的线程id id的类型为phtread t
  • 解决centos 8命令ip add无效问题

    之前用Xshell连接虚拟机一直正常 突然一台节点总是连不上 查询众多资料后 终于找到了问题所在 出错情况 输入命令 root node01 service NetworkManager start root node01 nmcli ne
  • 图腾柱电路工作原理

    图腾柱就是上下各一个晶体管 上管为NPN c极接正电源 下管为PNP e极接负电源 注意 是负电源 是地 两个b极接到一起 接输入 上管的e和下管的c接到一起 接输出 用来匹配电压 或者提高IO口的驱动能力 有几种图腾柱电路的变种 一种是两
  • Log4j2安全 JNDI漏洞 CVE-2021-44228

    Apache Log4j2是基于Java的日志记录工具 工具重写了Log4j框架 并且引入了大量丰富特性 该日志框架被大量用于业务系统开发 用来记录日志信息 大多数情况下 开发者可能会将用户输入导致的错误信息写入日志中 因该组件使用极为广泛
  • linux内核态发送tcp包,Linux内核发送构造数据包的方式

    本文欢迎自由转载 但请标明出处 并保证本文的完整性 作者 Godbach 日期 2009 09 01 一 构造数据包简析 这里并不详细介绍如何在内核中构造数据包 下文如有需要会在适当的位置进行分析 这里简单的分析讲一下内核态基于Netfil
  • 系统掌握数据结构8 树与二叉树 第二节

    树与二叉树 2节 1 线索二叉树的逻辑结构 2 线索二叉树的物理结构 3 中序线索二叉树 3 1 逻辑结构 3 2 代码实现 4 先序线索二叉树 5 后序线索二叉树 6 三叉链表的物理结构 7 先序线索二叉树的三叉链表存储实现 8 后序线索
  • 【转】C#操作sqlServer数据库

    转载地址 https blog csdn net weixin 42731241 article details 81172622 工具 vs2015 SqlServer 数据库的连接及打开关闭 VS2015建立一个c 的控制台应用程序 必