【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨文章所属专栏:c++篇–CSDN博客

文章目录
- 前言
- 一.`std::string`对象的创建
- 二.`std::string`对象的访问
- 三.`std::string`对象的容量
- 四.`std::string`对象的遍历
- 1.使用索引(下标)进行遍历
- 2.使用迭代器进行遍历
- 3.使用范围for进行遍历
- 五.`std::string`对象的增删查改
- 1.增加
- 2.删除
- 3.查找
- 4.修改
- 六.`std::string`对象的其他函数使用
前言
在C++编程的世界里,字符串无处不在。无论是用户输入、文件处理,还是网络通信,字符串都是不可或缺的数据类型。然而,直接操作字符数组(即
char字符串)不仅繁琐,而且容易出错。幸运的是,C++标准库为我们提供了std::string类,它封装了字符串的底层细节,提供了丰富的成员函数来简化字符串的处理。本篇文章将深入探讨c++中的std::string类的成员函数,包括字符串的创建,遍历,以及增删查改等,带你领略其强大的功能和便捷的操作方式。
注意:
本篇文章资料来源网站:c++:std::string
文章中出现的蓝色字符是对应函数的网站(重要的函数我会附上网站,部分函数没有,有需要的可以根据上面的这个网站自己查找噢)
一.std::string对象的创建
以下是一些常用的std::string对象的创建
-
默认(无参)构造对象:
创建一个无参对象,也就是空字符串。
std::string s1; -
带参构造对象:
创建一个非空字符串。
std::string s2("hello world"); //打印结果:hello world -
用指定数量的字符构造对象:
std::string s3(5,'*'); //打印结果:***** -
用另一个std::string对象构造:
相当于对std::string对象拷贝构造
std::string s2("hello world"); std::string s3(s2); //打印结果:hello world -
用子字符串构造:
从已存在的对象指定位置开始拷贝
std::string s2("hello world"); //从s2对象的下标为6开始拷贝,拷贝数量为5 std::string s4(s2,6,5); //打印结果:world
二.std::string对象的访问
std::string对象常用的访问方式有下面四种:

其中operator []和at()这两种方式是比较常用的,都是用于访问字符串中特定位置的字符。
-
at():
at()方式接受一个索引值作为参数,返回索引值上的字符,如果索引值超过字符串的有限范围,就会抛出一个std::out_of_range异常。
以下面代码为例:
#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");try {char ch = s1.at(13);}catch (const out_of_range& e) {cerr << "Caught an out_of_range exception:" << e.what() << '\n';}return 0; }当索引值为13时,超过字符串的有限范围,抛出异常并被捕获处理:

-
operator[]:该操作符也可以接受一个索引值作为参数,返回该索引值上的字符,但是和
at()方式不同的是,operator []在索引值超出字符串的有限范围时,不会抛出异常,可能会导致未定义行为,导致程序的崩溃或产生意外结果。
#include<iostream> #include<string> using namespace std; int main(){string s1("hello world");char ch = s1[13];cout << ch << endl; }
总结:
at()和operator []两种方式都可以用于访问std::string对象中的字符,但at()提供了更高的安全性,而operator []则提供了更好的性能。选择使用哪个时,需要根据具体的使用场景和对安全,性能的要求来决定。
三.std::string对象的容量
在c++中std::string类提供了多种成员函数来操作和查询字符串的容量和大小等属性,以下是关于所有capacity的成员函数:

下面重点讲解一些常用的函数和使用方式:
- size()/length():返回字符串有效长度(也就是字符串的字符个数),这两个函数是等价的。
using namespace std;
string s1("hello world");
cout << s1.size() << endl;
cout << s1.length() << endl;
//输出结果都为11
-
capacity():返回当前分配的存储空间的大小(空间总大小),这个值可能大于或等于
size()返回的值。using namespace std; string s1("hello world"); cout << s1.size() << endl; cout << s1.capacity() << endl; //输出结果size为11,capacity为15
-
reserve():更改字符串的容量至少为n,该函数不会改变字符串的大小,只是确保有足够的空间来存储至少n个字符。
using namespace std; string s1("hello world"); cout << "reserve前:" << endl; cout << s1.size() << endl; cout << s1.capacity() << endl; s1.reserve(20); cout << "reserve后:" << endl; cout << s1.size() << endl; cout << s1.capacity() << endl;
-
resize():将字符串的大小调整为n,如果n大于当前字符串的大小,则用默认字符(通常为0,如果使用
reserve(n,ch)则是字符ch)填充新位置;如果n小于当前字符串的大小,则字符串截断。using namespace std; string s1("hello world"); cout << s1 << endl; //0填充新位置 s1.resize(15); //字符串截断 s1.resize(6); cout << s1 << endl;

-
clear():清空字符串,使其大小为0。
using namespace std; string s1("hello world"); s1.clear(); cout<<s1.size()<<endl; //输出结果为0 -
empty():检查字符串是否为空,如果为空,返回
true,如果不为空,则返回false。using namespace std; string s1("hello world"); string s2; cout << s1.empty() << endl; //返回值为true(1) cout << s2.empty() << endl; //返回值为false(0)
四.std::string对象的遍历
当有一个字符串时,我们肯定少不了对该字符串进行遍历。
在c++中,std::string类提供了多种方法进行字符串的遍历,以下是几种常用的遍历方式:
1.使用索引(下标)进行遍历
通过前面的operator []和at()两种方式可以对std::string对象进行遍历:
#include<iostream>
#include<string>
using namespace std;
int main()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++) {cout << s1[i] << " ";}cout << endl;for (size_t i = 0; i < s1.size(); i++) {cout << s1.at(i) << " ";}cout << endl;return 0;
}
打印结果如下,两种方式结果相同:

2.使用迭代器进行遍历
在c++中,std::string类提供了迭代器(iterators),用于遍历字符串,这些迭代器可以像访问数组一样访问字符串中的字符,以下是std::string类关于迭代器(iterators)所有的成员函数:

-
begin()和end():begin()返回一个指向第一个字符的迭代器,end()返回一个指向字符串最后一个字符的下一个位置的迭代器(用于普通
std::string类对象的从前往后遍历)。#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");//iterator是像指针一样的类型(可能是指针,也可能不是),使用时需要加string::string::iterator it = s1.begin();while (it != s1.end()) {cout << *it << " ";it++;}cout << endl;return 0; } -
cbegin()和cend():和
begin(),end()功能相同,不同点是cbegin()和cend()用于const std::string类对象的从前往后遍历且不能对该对象进行修改。#include<iostream> #include<string> using namespace std; int main() {const string s1("hello world");//const_iterator是像指针一样的类型(可能是指针,也可能不是),使用时需要加string::string::const_iterator it = s1.cbegin();while (it != s1.cend()) {cout << *it << " ";it++;}cout << endl;return 0; } -
rbegin()和rend():rbegin()返回一个指向最后一个字符的反向迭代器,rend()返回一个指向第一个字符的前一个位置的反向迭代器(用于普通std::string类对象的从后往前遍历)。#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");//reverse_iterator是像指针一样的类型(可能是指针,也可能不是),使用时需要加string::string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()) {cout << *rit << " ";rit++;}cout<<endl;return 0; } -
crbegin()和crend():和
rbegin(),rend()功能相同,不同点是crbegin()和crend()用于const std::string类对象的从后往前遍历且不能对该对象进行修改。#include<iostream> #include<string> using namespace std; int main() {const string s1("hello world");//const_reverst_iterator是像指针一样的类型(可能是指针,也可能不是),使用时需要加string::string::const_reverse_iterator rit = s1.crbegin();while (rit != s1.crend()) {cout << *rit << " ";rit++;}cout << endl;return 0; }
上面四种遍历方式的结果:

3.使用范围for进行遍历
在c++入门讲解的时候有关于范围for的使用讲解(详细可以看我之前的文章c++入门二),在对std::string对象进行遍历时同样可以使用范围for,而范围for的底层原理就是上面讲解的迭代器。
#include<iostream>
#include<string>
using namespace std;
int main() {string s1("hello world");//auto关键字可以自动推演ch的类型//像上面迭代器使用的类型如:string::iterator 可以直接使用autofor (auto ch : s1) {cout << ch << " ";}cout << endl;return 0;
}

五.std::string对象的增删查改
1.增加
-
append():在字符串的末尾追加内容,可以是c风格的字符串,
std::string对象,字符数组的子串或者是单个字符。string s1("hello"); s1.append(" "); s1.append("world"); s1.append("!"); cout << s1 << endl;//输出结果:hello world! -
operator+=:和append()功能相似。
string s1("hello"); s1 += " "; s1 += "world"; s1 += "!"; cout << s1 << endl;//输出结果:hello world! -
push_back():在字符串的末尾添加单个字符,
push_back较为少用,没有operator+=和append()使用起来方便。string s2("hello world"); s2.push_back('!'); cout << s2 << endl;//输出结果为:hello world! -
insert():在字符串的指定位置插入新内容,可以是c风格的字符串,
std::string对象,字符数组的子串或者是单个字符。string s3("hello"); s3.insert(5, " world!"); cout << s3 << endl;//输出结果为:hello world!
2.删除
-
erase():从字符串中删除指定位置或范围的字符,参数可以是单个位置,一个位置和长度或者两个位置来指定删除范围。
string s1("hello world"); s1.erase(8, 10); //删除从下标8到10位置的字符 cout << s1 << endl; //输出hello wo s1.erase(5); //删除下标5之后的字符 cout << s1 << endl; //输出hello -
pop_back():删除字符串末尾的字符,该函数不能传参。
string s2("hello world!"); //删除最后一个字符'!' s2.pop_back(); cout << s2 << endl; //输出hello world
3.查找
-
fand():在字符串中查找子串或者字符的首次出现位置,参数可以是要查找的子串或字符,以及可选的查找起始位置。未查找到时返回string::npos(下面三个函数同理)。注意:
string::npos是std::string类中的一个静态成员变量,npos的值通常设置为size_t类型(无符号整形)的最大值,用于表示一个不可能在字符串中出现的位置。#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");cout << s1.find("world") << endl;//输出下标位置为6cout << s1.find("zmh") << endl;//找不到,输出size_t类型的最大值return 0; } -
rfand():查找子串或字符在字符串中最后一次出现的位置,参数和fand()相同。未查找到时返回string::npos。#include<iostream> #include<string> using namespace std; int main(){string s1("hello world");cout << s1.rfind("l") << endl;//查找字符’l'最后一次出现的位置,输出下标位置9cout << s1.find("zmh") << endl;//找不到,输出size_t类型的最大值return 0; } -
find_first_of():在字符串中查找任何与指定字符集中的字符首次匹配的位置,参数可以是字符集,以及可选的查找起始位置。#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");string set("auto");size_t first_pos = s1.find_first_of(set);if (first_pos != string::npos) {cout << first_pos << endl;}else {cout << "No find" << endl;}return 0; }//输出结果为4,在s1字符串下标为4的位置首次与字符串set匹配 -
find_last_of():在字符串中查找任何与指定字符集中的字符最后一次匹配的位置,参数和find_first_of()相同。#include<iostream> #include<string> using namespace std; int main() {string s2("hello world");string ret("auto");size_t last_pos = s2.find_last_of(ret);if (last_pos != string::npos) {cout << last_pos << endl;}else {cout << "No find" << endl;}return 0; }//输出结果为7,在s1字符串下标为7的位置最后一次与字符串ret匹配
4.修改
-
assign():给字符串赋值,可以视为一种修改操作,参数可以是c风格的字符串,
std::string对象,字符数组的子串或者是单个字符。#include<iostream> #include<string> using namespace std; int main() {string s1;s1.assign("!");cout << s1 << endl;s1.assign("hello");cout << s1 << endl;return 0; }//第一次输出结果为! //第二次输出结果为hello -
replace():替换字符串中的部分内容,参数包括要替换的起始位置和长度以及替换内容。
#include<iostream> #include<string> using namespace std; int main() {string s2("hello world");s2.replace(6, 4, "auto");cout << s2 << endl;return 0; } //从下标为6的位置开始,替换长度为4的auto的字符 //输出结果为hello autod -
substr():返回一个子串,虽然
substr()本身不能进行修改,但可以通过它获得子串并进行修改,然后可能需要将修改后的子串重新赋值给原字符串的一部分。#include<iostream> #include<string> using namespace std; int main() {string s1("hello world");//获取s1字符串下标6到10位置的子串赋值给s2string s2 = s1.substr(6, 10);cout << s2 << endl;return 0; }//输出结果为world
六.std::string对象的其他函数使用
-
operator+:运算符
+重载,用于将两个字符串对象连接在一起,并返回一个连接后的字符串,operator+和operator+=的区别是,operator+不改变原字符串,operator+=改变原字符串#include<iostream> #include<string> using namespace std; int main() {string s1("hello");string s2(" world");string result = s1 + s2;cout << s1 << endl;cout << s2 << endl;cout << result << endl;return 0; } //第一个输出结果为hello //第二个输出结果为 world //第三个输出结果为hello world -
operator<<:流插入运算符
<<重载属于标准库std::ostream中的,是一个非成员函数,他接受一个std::ostream的引用和一个std::string的引用作为参数,并将std::string对象中的内容写入到输出流中。这个运算符返回对std::ostream的引用。 -
operator>>:流提取运算符
>>重载属于标准库std::istream中的,是一个非成员函数,他接受一个std::istream的引用和一个std::string的引用作为参数,并将std::string对象中的内容写入到输入流中。再从输入流中提取数据,返回对std::istream的引用。
#include<iostream>
#include<string>
using namespace std;
int main() {string name;cout << "请输入姓名:" << endl;cin >> name;cout << name;return 0;
}
-
c_str():将
std::string对象内部存储的字符串数据转换为一个以空字符’\0’为结尾的c格式字符串(const char*)类型。string s1("hello\0world"); cout << s1.c_str() << endl;//输出结果为hello //遇到空字符结束
以上就是关于c++中std::string类的讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!

相关文章:
【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨文章所属专栏:c篇–CSDN博客 文章目录 前言一.std::string对象的创建二.std::string对象的访问三.std::str…...
LlamaIndex ollama 搭建本地RAG应用,建立本地知识库
目录 简介安装前的准备下载ollama创建llamaindex conda环境,为后面编码作准备 环境变量迁移ollama到其他盘运行ollama方式一方式二禁止ollama开机自启动运行第一个模型 Chatbox聊天下载Chatbox配置ollama地址和模型验证 建立自身特定知识数据搭配大语言模型创建项目…...
draggable的el-dialog实现对话框标题可以选择
请看图 这个对话框使用了el-dialog并且draggable属性设置成了true,所以标题栏这里就可以拖动,现在用户想选中标题栏的文本进而复制。我看到这个需求头都大了。 我能想到的方案有三个:1. 取消draggable为true 2. 标题文案后面加一个复制按钮 …...
2024年Android面试总结
2024年Android面试总结 1.动画类型有哪些?插值器原理? 2.StringBuffer和StringBuilder区别? 3.jvm内存模型? 4.线程池7大核心参数及原理? 5.Android多进程通信方式有哪些?各自的优缺点? 6…...
树莓派3:64位系统串口(UART)使用问题的解决方法
前言 当我们要使用串口进行zigbee的短距离通信时,发现无法使用串口. 原因 树莓派3bCPU内部有两个串口,一个硬件串口(就是我们平时使用的UART),还有一个迷你串口(mini-uart),在老版本的树莓派中把硬件串口分配在GPIO上,可以单独使用.但是在新的树莓派中官方把硬件串口给了蓝牙…...
SemiDrive E3 硬件设计系列---唤醒电路设计
一、前言 E3 系列芯片是芯驰半导体高功能安全的车规级 MCU,对于 MCU 的硬件设计部分,本系列将会分模块进行讲解,旨在介绍 E3 系列芯片在硬件设计方面的注意事项与经验,本文主要讲解 E3 硬件设计中唤醒电路部分的设计。 二、RTC 模…...
淘宝接口高并发采集核心要点解读,开启电商数据智能应用新纪元
一、引言 在电商蓬勃发展的今天,淘宝作为全球知名的电商巨头,其平台上的数据犹如一座蕴藏无限价值的宝藏。准确且高效地采集淘宝接口数据,并通过高并发技术实现大规模数据获取,对于电商企业的精准营销、市场趋势分析、竞品监测以及…...
C#里怎么样快速使用LINQ实现查询?
C#里怎么样快速使用LINQ实现查询? 在C#里使用LINQ,是一个方便的功能, 不过,要学会使用这部分的功能,需要比较多的学习时间,否则,使用起就比较难。 因为它的表现方式,与编程语言通用的功能,还是差别比较大。 当数据量比较小,没有特定的顺序时,使用LINQ访问会比较好…...
2024新版微软edge浏览器输入百度网址时自动补全tn=68018901……小尾巴的解决
以前一直是Windows11 21h2版本,浏览器内输入baidu不会自动补全tnxx的百度推广小尾巴。然后前几天在BIOS内开启了tpm2.0,升级Windows11到了24h2版本。 发现在edge浏览器内只要输入b,就会自动补全为baidu.com?tnXXX的这么一个百度推广形式。开…...
uni-app打包H5自定义微信分享
1、配置分享信息 修改uni-app的index.html,添加Open Graph(OG)标签来配置分享信息。 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="description" content="标题"/>…...
大模型专栏--大模型应用场景
紧接着第一篇,什么是大模型,这篇文章讨论一下大模型的应用场景和应用方式有哪些? 基础使用 随着 GPT 的出现,AI 大模型已经越来越多得出现在日常生活和学术研究,工作中。 按照使用方向有以下几种: 自然语…...
骑砍2霸主MOD开发(29)-顶点动画
一.定制化顶点动画(MorphAnimation) 定制化顶点动画用于人物Agent的面部表情. 1.创建MorphAnimation对应静态资源morph_animation.tpac 2.Agent设置对应MorphAnimation [EngineMethod("set_agent_facial_animation", false)] void SetAgentFacialAnimation(UIntPtr …...
-Dspring.profiles.active=dev与--spring.profiles.active=dev的区别
在Spring Boot应用程序中,-Dspring.profiles.activedev和--spring.profiles.activedev都用于指定要激活的Spring配置文件(profile),但它们在不同的环境中使用,并且有不同的作用域。 -Dspring.profiles.activedev&#…...
面向对象高级(2)单例设计对象与代码块
面向对象高级(2) 单例设计模式、main方法与代码块 引言; 设计模式:特定环境下特定问题的处理方法。可理解为一种经典的可以参照的模板。单例设计模式则是只存在单个对象实例、且只有一种方法获取对象实例的一种设计模式。 单例设…...
47小型项目的规划与实施
每天五分钟学Linux | 第四十七课:小型项目的规划与实施 大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了并发编程的知识,包括如何管理和使用进程与线程。今天,我们将探讨如何规划…...
堤防安全监测系统方案
一、背景情况 堤防是开发利用水资源和防治水灾害的重要工程措施之一,对防洪、供水、生态、发电、航运等至关重要。我国现有堤防9.8万多座,其中大中型堤防4700多座、小型堤防9.4万座,80%以上修建于上世纪50至70年代。由于堤防管护力量薄弱&am…...
聊聊Flink:这次把Flink的window分类(滚动、滑动、会话、全局)、窗口函数讲透
一、窗口 窗口(Window)是处理无界流的关键所在。窗口将流分成有限大小的“桶”,我们可以在其上应用算子计算。Flink可以使用window()和windowAll()定义一个窗口,二者都需要传入一个窗口分配器WindowAssigner,WindowAs…...
mysql-分析MVCC原理
一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制,也就是为事务分配单增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以为数据库解决一些问题。…...
由于答案过大,请对a取模。取模后的答案不是原问题的答案 取模有何意义呢 详解
在许多情况下,处理大数时会将 a 取模,即用 a m o d m a \mod m amodm的结果代替 a a a,然后继续计算。这种做法的核心问题是:取模后的值与原问题之间的关系是否保持一致。取模后的意义在于,它在不改变问题核心特性的前…...
【c++篇】掌握动态内存的奥妙
【C篇】动态内存 一、Static 关键字1.1函数内部的静态变量1.2 全局静态变量1.3静态成员变量1.4静态成员函数 二、内存管理2.1栈区(Stack)2.2堆区(Heap) 三、动态内存分配机制3.1、动态内存分配的两种方法c语言c 3.2new 和delete的用法3.3语法和类型安全性…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
